feat: warehouse places accounting
This commit is contained in:
@@ -32,6 +32,9 @@ export type { BaseEnumListSchema } from './models/BaseEnumListSchema';
|
|||||||
export type { BaseEnumSchema } from './models/BaseEnumSchema';
|
export type { BaseEnumSchema } from './models/BaseEnumSchema';
|
||||||
export type { BaseMarketplaceSchema } from './models/BaseMarketplaceSchema';
|
export type { BaseMarketplaceSchema } from './models/BaseMarketplaceSchema';
|
||||||
export type { BaseMessageSchema } from './models/BaseMessageSchema';
|
export type { BaseMessageSchema } from './models/BaseMessageSchema';
|
||||||
|
export type { BasePlaceSchema } from './models/BasePlaceSchema';
|
||||||
|
export type { BasePlaceTypeSchema } from './models/BasePlaceTypeSchema';
|
||||||
|
export type { BasePlaceTypeWithCountSchema } from './models/BasePlaceTypeWithCountSchema';
|
||||||
export type { BaseProjectSchema } from './models/BaseProjectSchema';
|
export type { BaseProjectSchema } from './models/BaseProjectSchema';
|
||||||
export type { BaseShippingWarehouseSchema } from './models/BaseShippingWarehouseSchema';
|
export type { BaseShippingWarehouseSchema } from './models/BaseShippingWarehouseSchema';
|
||||||
export type { BaseStatusSchema } from './models/BaseStatusSchema';
|
export type { BaseStatusSchema } from './models/BaseStatusSchema';
|
||||||
@@ -159,6 +162,10 @@ export type { CreatePaymentRecordRequest } from './models/CreatePaymentRecordReq
|
|||||||
export type { CreatePaymentRecordResponse } from './models/CreatePaymentRecordResponse';
|
export type { CreatePaymentRecordResponse } from './models/CreatePaymentRecordResponse';
|
||||||
export type { CreatePayRateRequest } from './models/CreatePayRateRequest';
|
export type { CreatePayRateRequest } from './models/CreatePayRateRequest';
|
||||||
export type { CreatePayRateResponse } from './models/CreatePayRateResponse';
|
export type { CreatePayRateResponse } from './models/CreatePayRateResponse';
|
||||||
|
export type { CreatePlaceRequest } from './models/CreatePlaceRequest';
|
||||||
|
export type { CreatePlaceResponse } from './models/CreatePlaceResponse';
|
||||||
|
export type { CreatePlaceTypeRequest } from './models/CreatePlaceTypeRequest';
|
||||||
|
export type { CreatePlaceTypeResponse } from './models/CreatePlaceTypeResponse';
|
||||||
export type { CreatePositionRequest } from './models/CreatePositionRequest';
|
export type { CreatePositionRequest } from './models/CreatePositionRequest';
|
||||||
export type { CreatePositionResponse } from './models/CreatePositionResponse';
|
export type { CreatePositionResponse } from './models/CreatePositionResponse';
|
||||||
export type { CreateProjectRequest } from './models/CreateProjectRequest';
|
export type { CreateProjectRequest } from './models/CreateProjectRequest';
|
||||||
@@ -197,6 +204,8 @@ export type { DeletePaymentRecordRequest } from './models/DeletePaymentRecordReq
|
|||||||
export type { DeletePaymentRecordResponse } from './models/DeletePaymentRecordResponse';
|
export type { DeletePaymentRecordResponse } from './models/DeletePaymentRecordResponse';
|
||||||
export type { DeletePayRateRequest } from './models/DeletePayRateRequest';
|
export type { DeletePayRateRequest } from './models/DeletePayRateRequest';
|
||||||
export type { DeletePayRateResponse } from './models/DeletePayRateResponse';
|
export type { DeletePayRateResponse } from './models/DeletePayRateResponse';
|
||||||
|
export type { DeletePlaceResponse } from './models/DeletePlaceResponse';
|
||||||
|
export type { DeletePlaceTypeResponse } from './models/DeletePlaceTypeResponse';
|
||||||
export type { DeletePositionRequest } from './models/DeletePositionRequest';
|
export type { DeletePositionRequest } from './models/DeletePositionRequest';
|
||||||
export type { DeletePositionResponse } from './models/DeletePositionResponse';
|
export type { DeletePositionResponse } from './models/DeletePositionResponse';
|
||||||
export type { DeleteProjectResponse } from './models/DeleteProjectResponse';
|
export type { DeleteProjectResponse } from './models/DeleteProjectResponse';
|
||||||
@@ -221,10 +230,15 @@ export type { DepartmentSectionSchema } from './models/DepartmentSectionSchema';
|
|||||||
export type { EditMessageRequest } from './models/EditMessageRequest';
|
export type { EditMessageRequest } from './models/EditMessageRequest';
|
||||||
export type { EditMessageResponse } from './models/EditMessageResponse';
|
export type { EditMessageResponse } from './models/EditMessageResponse';
|
||||||
export type { EditMessageSchema } from './models/EditMessageSchema';
|
export type { EditMessageSchema } from './models/EditMessageSchema';
|
||||||
|
export type { EditPlaceRequest } from './models/EditPlaceRequest';
|
||||||
|
export type { EditPlaceResponse } from './models/EditPlaceResponse';
|
||||||
|
export type { EditPlaceTypeRequest } from './models/EditPlaceTypeRequest';
|
||||||
|
export type { EditPlaceTypeResponse } from './models/EditPlaceTypeResponse';
|
||||||
export type { FinishPauseByShiftIdResponse } from './models/FinishPauseByShiftIdResponse';
|
export type { FinishPauseByShiftIdResponse } from './models/FinishPauseByShiftIdResponse';
|
||||||
export type { FinishPauseByUserIdResponse } from './models/FinishPauseByUserIdResponse';
|
export type { FinishPauseByUserIdResponse } from './models/FinishPauseByUserIdResponse';
|
||||||
export type { FinishShiftByIdResponse } from './models/FinishShiftByIdResponse';
|
export type { FinishShiftByIdResponse } from './models/FinishShiftByIdResponse';
|
||||||
export type { FinishShiftResponse } from './models/FinishShiftResponse';
|
export type { FinishShiftResponse } from './models/FinishShiftResponse';
|
||||||
|
export type { FlatPlaceTypeSchema } from './models/FlatPlaceTypeSchema';
|
||||||
export type { FullProjectSchema } from './models/FullProjectSchema';
|
export type { FullProjectSchema } from './models/FullProjectSchema';
|
||||||
export type { GenerateInviteCodeRequest } from './models/GenerateInviteCodeRequest';
|
export type { GenerateInviteCodeRequest } from './models/GenerateInviteCodeRequest';
|
||||||
export type { GenerateInviteCodeResponse } from './models/GenerateInviteCodeResponse';
|
export type { GenerateInviteCodeResponse } from './models/GenerateInviteCodeResponse';
|
||||||
@@ -261,10 +275,13 @@ export type { GetClientMarketplacesRequest } from './models/GetClientMarketplace
|
|||||||
export type { GetClientMarketplacesResponse } from './models/GetClientMarketplacesResponse';
|
export type { GetClientMarketplacesResponse } from './models/GetClientMarketplacesResponse';
|
||||||
export type { GetDepartmentSectionsResponse } from './models/GetDepartmentSectionsResponse';
|
export type { GetDepartmentSectionsResponse } from './models/GetDepartmentSectionsResponse';
|
||||||
export type { GetDepartmentsResponse } from './models/GetDepartmentsResponse';
|
export type { GetDepartmentsResponse } from './models/GetDepartmentsResponse';
|
||||||
|
export type { GetFlatPlaceTypesResponse } from './models/GetFlatPlaceTypesResponse';
|
||||||
export type { GetManagersResponse } from './models/GetManagersResponse';
|
export type { GetManagersResponse } from './models/GetManagersResponse';
|
||||||
export type { GetMessagesRequest } from './models/GetMessagesRequest';
|
export type { GetMessagesRequest } from './models/GetMessagesRequest';
|
||||||
export type { GetMessagesResponse } from './models/GetMessagesResponse';
|
export type { GetMessagesResponse } from './models/GetMessagesResponse';
|
||||||
export type { GetPaymentRecordsResponse } from './models/GetPaymentRecordsResponse';
|
export type { GetPaymentRecordsResponse } from './models/GetPaymentRecordsResponse';
|
||||||
|
export type { GetPlacesResponse } from './models/GetPlacesResponse';
|
||||||
|
export type { GetPlaceTypesResponse } from './models/GetPlaceTypesResponse';
|
||||||
export type { GetPlannedWorkShiftsResponse } from './models/GetPlannedWorkShiftsResponse';
|
export type { GetPlannedWorkShiftsResponse } from './models/GetPlannedWorkShiftsResponse';
|
||||||
export type { GetProductBarcodePdfRequest } from './models/GetProductBarcodePdfRequest';
|
export type { GetProductBarcodePdfRequest } from './models/GetProductBarcodePdfRequest';
|
||||||
export type { GetProductBarcodePdfResponse } from './models/GetProductBarcodePdfResponse';
|
export type { GetProductBarcodePdfResponse } from './models/GetProductBarcodePdfResponse';
|
||||||
@@ -312,6 +329,8 @@ export type { PayRateSchema } from './models/PayRateSchema';
|
|||||||
export type { PayRateSchemaBase } from './models/PayRateSchemaBase';
|
export type { PayRateSchemaBase } from './models/PayRateSchemaBase';
|
||||||
export type { PayrollSchemeSchema } from './models/PayrollSchemeSchema';
|
export type { PayrollSchemeSchema } from './models/PayrollSchemeSchema';
|
||||||
export type { PermissionSchema } from './models/PermissionSchema';
|
export type { PermissionSchema } from './models/PermissionSchema';
|
||||||
|
export type { PlaceSchema } from './models/PlaceSchema';
|
||||||
|
export type { PlaceTypeSchema } from './models/PlaceTypeSchema';
|
||||||
export type { PlannedWorkShiftSchema } from './models/PlannedWorkShiftSchema';
|
export type { PlannedWorkShiftSchema } from './models/PlannedWorkShiftSchema';
|
||||||
export type { PlanningTableRow } from './models/PlanningTableRow';
|
export type { PlanningTableRow } from './models/PlanningTableRow';
|
||||||
export type { PositionSchema } from './models/PositionSchema';
|
export type { PositionSchema } from './models/PositionSchema';
|
||||||
@@ -483,5 +502,6 @@ export { TaskService } from './services/TaskService';
|
|||||||
export { TimeTrackingService } from './services/TimeTrackingService';
|
export { TimeTrackingService } from './services/TimeTrackingService';
|
||||||
export { TransactionService } from './services/TransactionService';
|
export { TransactionService } from './services/TransactionService';
|
||||||
export { UserService } from './services/UserService';
|
export { UserService } from './services/UserService';
|
||||||
|
export { WmsService } from './services/WmsService';
|
||||||
export { WorkShiftsService } from './services/WorkShiftsService';
|
export { WorkShiftsService } from './services/WorkShiftsService';
|
||||||
export { WorkShiftsPlanningService } from './services/WorkShiftsPlanningService';
|
export { WorkShiftsPlanningService } from './services/WorkShiftsPlanningService';
|
||||||
|
|||||||
9
src/client/models/BasePlaceSchema.ts
Normal file
9
src/client/models/BasePlaceSchema.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type BasePlaceSchema = {
|
||||||
|
parentId: (number | null);
|
||||||
|
placeTypeId: number;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/BasePlaceTypeSchema.ts
Normal file
9
src/client/models/BasePlaceTypeSchema.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type BasePlaceTypeSchema = {
|
||||||
|
name: string;
|
||||||
|
parentId: (number | null);
|
||||||
|
};
|
||||||
|
|
||||||
10
src/client/models/BasePlaceTypeWithCountSchema.ts
Normal file
10
src/client/models/BasePlaceTypeWithCountSchema.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type BasePlaceTypeWithCountSchema = {
|
||||||
|
name: string;
|
||||||
|
parentId: (number | null);
|
||||||
|
childCount: number;
|
||||||
|
};
|
||||||
|
|
||||||
@@ -4,5 +4,6 @@
|
|||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
export type CancelCardBillRequest = {
|
export type CancelCardBillRequest = {
|
||||||
cardId: number;
|
cardId: number;
|
||||||
|
force?: (boolean | null);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
9
src/client/models/CreatePlaceRequest.ts
Normal file
9
src/client/models/CreatePlaceRequest.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
import type { BasePlaceSchema } from './BasePlaceSchema';
|
||||||
|
export type CreatePlaceRequest = {
|
||||||
|
place: BasePlaceSchema;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/CreatePlaceResponse.ts
Normal file
9
src/client/models/CreatePlaceResponse.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type CreatePlaceResponse = {
|
||||||
|
ok: boolean;
|
||||||
|
message: string;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/CreatePlaceTypeRequest.ts
Normal file
9
src/client/models/CreatePlaceTypeRequest.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
import type { BasePlaceTypeSchema } from './BasePlaceTypeSchema';
|
||||||
|
export type CreatePlaceTypeRequest = {
|
||||||
|
placeType: BasePlaceTypeSchema;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/CreatePlaceTypeResponse.ts
Normal file
9
src/client/models/CreatePlaceTypeResponse.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type CreatePlaceTypeResponse = {
|
||||||
|
ok: boolean;
|
||||||
|
message: string;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/DeletePlaceResponse.ts
Normal file
9
src/client/models/DeletePlaceResponse.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type DeletePlaceResponse = {
|
||||||
|
ok: boolean;
|
||||||
|
message: string;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/DeletePlaceTypeResponse.ts
Normal file
9
src/client/models/DeletePlaceTypeResponse.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type DeletePlaceTypeResponse = {
|
||||||
|
ok: boolean;
|
||||||
|
message: string;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/EditPlaceRequest.ts
Normal file
9
src/client/models/EditPlaceRequest.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
import type { PlaceSchema } from './PlaceSchema';
|
||||||
|
export type EditPlaceRequest = {
|
||||||
|
place: PlaceSchema;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/EditPlaceResponse.ts
Normal file
9
src/client/models/EditPlaceResponse.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type EditPlaceResponse = {
|
||||||
|
ok: boolean;
|
||||||
|
message: string;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/EditPlaceTypeRequest.ts
Normal file
9
src/client/models/EditPlaceTypeRequest.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
import type { FlatPlaceTypeSchema } from './FlatPlaceTypeSchema';
|
||||||
|
export type EditPlaceTypeRequest = {
|
||||||
|
placeType: FlatPlaceTypeSchema;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/EditPlaceTypeResponse.ts
Normal file
9
src/client/models/EditPlaceTypeResponse.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type EditPlaceTypeResponse = {
|
||||||
|
ok: boolean;
|
||||||
|
message: string;
|
||||||
|
};
|
||||||
|
|
||||||
10
src/client/models/FlatPlaceTypeSchema.ts
Normal file
10
src/client/models/FlatPlaceTypeSchema.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type FlatPlaceTypeSchema = {
|
||||||
|
name: string;
|
||||||
|
parentId: (number | null);
|
||||||
|
id: number;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/GetFlatPlaceTypesResponse.ts
Normal file
9
src/client/models/GetFlatPlaceTypesResponse.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
import type { FlatPlaceTypeSchema } from './FlatPlaceTypeSchema';
|
||||||
|
export type GetFlatPlaceTypesResponse = {
|
||||||
|
placeTypes: Array<FlatPlaceTypeSchema>;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/GetPlaceTypesResponse.ts
Normal file
9
src/client/models/GetPlaceTypesResponse.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
import type { PlaceTypeSchema } from './PlaceTypeSchema';
|
||||||
|
export type GetPlaceTypesResponse = {
|
||||||
|
placeTypes: Array<PlaceTypeSchema>;
|
||||||
|
};
|
||||||
|
|
||||||
9
src/client/models/GetPlacesResponse.ts
Normal file
9
src/client/models/GetPlacesResponse.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
import type { PlaceSchema } from './PlaceSchema';
|
||||||
|
export type GetPlacesResponse = {
|
||||||
|
places: Array<PlaceSchema>;
|
||||||
|
};
|
||||||
|
|
||||||
14
src/client/models/PlaceSchema.ts
Normal file
14
src/client/models/PlaceSchema.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
import type { BasePlaceTypeWithCountSchema } from './BasePlaceTypeWithCountSchema';
|
||||||
|
export type PlaceSchema = {
|
||||||
|
parentId: (number | null);
|
||||||
|
placeTypeId: number;
|
||||||
|
id: number;
|
||||||
|
number: number;
|
||||||
|
children?: Array<PlaceSchema>;
|
||||||
|
placeType: BasePlaceTypeWithCountSchema;
|
||||||
|
};
|
||||||
|
|
||||||
12
src/client/models/PlaceTypeSchema.ts
Normal file
12
src/client/models/PlaceTypeSchema.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
export type PlaceTypeSchema = {
|
||||||
|
name: string;
|
||||||
|
parentId: (number | null);
|
||||||
|
id: number;
|
||||||
|
children?: Array<PlaceTypeSchema>;
|
||||||
|
placesCount: number;
|
||||||
|
};
|
||||||
|
|
||||||
211
src/client/services/WmsService.ts
Normal file
211
src/client/services/WmsService.ts
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
/* generated using openapi-typescript-codegen -- do not edit */
|
||||||
|
/* istanbul ignore file */
|
||||||
|
/* tslint:disable */
|
||||||
|
/* eslint-disable */
|
||||||
|
import type { CreatePlaceRequest } from '../models/CreatePlaceRequest';
|
||||||
|
import type { CreatePlaceResponse } from '../models/CreatePlaceResponse';
|
||||||
|
import type { CreatePlaceTypeRequest } from '../models/CreatePlaceTypeRequest';
|
||||||
|
import type { CreatePlaceTypeResponse } from '../models/CreatePlaceTypeResponse';
|
||||||
|
import type { DeletePlaceResponse } from '../models/DeletePlaceResponse';
|
||||||
|
import type { DeletePlaceTypeResponse } from '../models/DeletePlaceTypeResponse';
|
||||||
|
import type { EditPlaceRequest } from '../models/EditPlaceRequest';
|
||||||
|
import type { EditPlaceResponse } from '../models/EditPlaceResponse';
|
||||||
|
import type { EditPlaceTypeRequest } from '../models/EditPlaceTypeRequest';
|
||||||
|
import type { EditPlaceTypeResponse } from '../models/EditPlaceTypeResponse';
|
||||||
|
import type { GetFlatPlaceTypesResponse } from '../models/GetFlatPlaceTypesResponse';
|
||||||
|
import type { GetPlacesResponse } from '../models/GetPlacesResponse';
|
||||||
|
import type { GetPlaceTypesResponse } from '../models/GetPlaceTypesResponse';
|
||||||
|
import type { CancelablePromise } from '../core/CancelablePromise';
|
||||||
|
import { OpenAPI } from '../core/OpenAPI';
|
||||||
|
import { request as __request } from '../core/request';
|
||||||
|
export class WmsService {
|
||||||
|
/**
|
||||||
|
* Get Place Types
|
||||||
|
* @returns GetPlaceTypesResponse Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static getPlaceTypes(): CancelablePromise<GetPlaceTypesResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'GET',
|
||||||
|
url: '/wms/place-type',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Create Place Type
|
||||||
|
* @returns CreatePlaceTypeResponse Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static createPlaceType({
|
||||||
|
requestBody,
|
||||||
|
}: {
|
||||||
|
requestBody: CreatePlaceTypeRequest,
|
||||||
|
}): CancelablePromise<CreatePlaceTypeResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'POST',
|
||||||
|
url: '/wms/place-type',
|
||||||
|
body: requestBody,
|
||||||
|
mediaType: 'application/json',
|
||||||
|
errors: {
|
||||||
|
422: `Validation Error`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Edit Place Type
|
||||||
|
* @returns EditPlaceTypeResponse Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static editPlaceType({
|
||||||
|
requestBody,
|
||||||
|
}: {
|
||||||
|
requestBody: EditPlaceTypeRequest,
|
||||||
|
}): CancelablePromise<EditPlaceTypeResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'PATCH',
|
||||||
|
url: '/wms/place-type',
|
||||||
|
body: requestBody,
|
||||||
|
mediaType: 'application/json',
|
||||||
|
errors: {
|
||||||
|
422: `Validation Error`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get Flat Place Types
|
||||||
|
* @returns GetFlatPlaceTypesResponse Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static getFlatPlaceTypes({
|
||||||
|
parentPlaceTypeId,
|
||||||
|
}: {
|
||||||
|
parentPlaceTypeId: number,
|
||||||
|
}): CancelablePromise<GetFlatPlaceTypesResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'GET',
|
||||||
|
url: '/wms/place-type/flat/{parent_place_type_id}',
|
||||||
|
path: {
|
||||||
|
'parent_place_type_id': parentPlaceTypeId,
|
||||||
|
},
|
||||||
|
errors: {
|
||||||
|
422: `Validation Error`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Delete Place Type
|
||||||
|
* @returns DeletePlaceTypeResponse Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static deletePlaceType({
|
||||||
|
placeTypeId,
|
||||||
|
}: {
|
||||||
|
placeTypeId: number,
|
||||||
|
}): CancelablePromise<DeletePlaceTypeResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'DELETE',
|
||||||
|
url: '/wms/place-type/{place_type_id}',
|
||||||
|
path: {
|
||||||
|
'place_type_id': placeTypeId,
|
||||||
|
},
|
||||||
|
errors: {
|
||||||
|
422: `Validation Error`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get Places
|
||||||
|
* @returns GetPlacesResponse Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static getPlaces(): CancelablePromise<GetPlacesResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'GET',
|
||||||
|
url: '/wms/place',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Create Place
|
||||||
|
* @returns CreatePlaceResponse Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static createPlace({
|
||||||
|
requestBody,
|
||||||
|
}: {
|
||||||
|
requestBody: CreatePlaceRequest,
|
||||||
|
}): CancelablePromise<CreatePlaceResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'POST',
|
||||||
|
url: '/wms/place',
|
||||||
|
body: requestBody,
|
||||||
|
mediaType: 'application/json',
|
||||||
|
errors: {
|
||||||
|
422: `Validation Error`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Edit Place
|
||||||
|
* @returns EditPlaceResponse Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static editPlace({
|
||||||
|
requestBody,
|
||||||
|
}: {
|
||||||
|
requestBody: EditPlaceRequest,
|
||||||
|
}): CancelablePromise<EditPlaceResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'PATCH',
|
||||||
|
url: '/wms/place',
|
||||||
|
body: requestBody,
|
||||||
|
mediaType: 'application/json',
|
||||||
|
errors: {
|
||||||
|
422: `Validation Error`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Delete Place
|
||||||
|
* @returns DeletePlaceResponse Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static deletePlace({
|
||||||
|
placeId,
|
||||||
|
}: {
|
||||||
|
placeId: number,
|
||||||
|
}): CancelablePromise<DeletePlaceResponse> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'DELETE',
|
||||||
|
url: '/wms/place/{place_id}',
|
||||||
|
path: {
|
||||||
|
'place_id': placeId,
|
||||||
|
},
|
||||||
|
errors: {
|
||||||
|
422: `Validation Error`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Generate Place Qr Code Pdf
|
||||||
|
* @returns any Successful Response
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static getPlaceQrCodePdf({
|
||||||
|
placeId,
|
||||||
|
isShort,
|
||||||
|
}: {
|
||||||
|
placeId: number,
|
||||||
|
isShort: boolean,
|
||||||
|
}): CancelablePromise<any> {
|
||||||
|
return __request(OpenAPI, {
|
||||||
|
method: 'GET',
|
||||||
|
url: '/wms/place/pdf/{place_id}/{is_short}',
|
||||||
|
path: {
|
||||||
|
'place_id': placeId,
|
||||||
|
'is_short': isShort,
|
||||||
|
},
|
||||||
|
errors: {
|
||||||
|
422: `Validation Error`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -42,6 +42,8 @@ import AttributeModal from "../pages/AdminPage/tabs/Attributes/modals/AttributeM
|
|||||||
import CreateProjectModal
|
import CreateProjectModal
|
||||||
from "../pages/CardsPage/drawers/ProjectEditDrawer/tabs/General/modals/CreateProjectModal.tsx";
|
from "../pages/CardsPage/drawers/ProjectEditDrawer/tabs/General/modals/CreateProjectModal.tsx";
|
||||||
import CardTagModal from "../pages/CardsPage/drawers/ProjectEditDrawer/tabs/Tags/modals/CardTagModal.tsx";
|
import CardTagModal from "../pages/CardsPage/drawers/ProjectEditDrawer/tabs/Tags/modals/CardTagModal.tsx";
|
||||||
|
import PlaceTypeModal from "../pages/AdminPage/tabs/WarehouseManagement/placeType/modals/PlaceTypeModal.tsx";
|
||||||
|
import PlaceModal from "../pages/AdminPage/tabs/WarehouseManagement/place/modals/PlaceModal.tsx";
|
||||||
|
|
||||||
export const modals = {
|
export const modals = {
|
||||||
enterDeadline: EnterDeadlineModal,
|
enterDeadline: EnterDeadlineModal,
|
||||||
@@ -82,4 +84,6 @@ export const modals = {
|
|||||||
attributeModal: AttributeModal,
|
attributeModal: AttributeModal,
|
||||||
createProjectModal: CreateProjectModal,
|
createProjectModal: CreateProjectModal,
|
||||||
cardTagModal: CardTagModal,
|
cardTagModal: CardTagModal,
|
||||||
|
placeTypeModal: PlaceTypeModal,
|
||||||
|
placeModal: PlaceModal,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
IconQrcode, IconSubtask,
|
IconQrcode, IconSubtask,
|
||||||
IconTopologyStar3,
|
IconTopologyStar3,
|
||||||
IconUser,
|
IconUser,
|
||||||
|
IconBuildingWarehouse,
|
||||||
} from "@tabler/icons-react";
|
} from "@tabler/icons-react";
|
||||||
import UsersTab from "./tabs/Users/UsersTab.tsx";
|
import UsersTab from "./tabs/Users/UsersTab.tsx";
|
||||||
import { motion } from "framer-motion";
|
import { motion } from "framer-motion";
|
||||||
@@ -22,6 +23,7 @@ import OrganizationalStructureTab from "./tabs/OrganizationalStructureTab/Organi
|
|||||||
import { ReactNode } from "react";
|
import { ReactNode } from "react";
|
||||||
import WorkShiftsPlanning from "./tabs/WorkShiftsPlanning/WorkShiftsPlanning.tsx";
|
import WorkShiftsPlanning from "./tabs/WorkShiftsPlanning/WorkShiftsPlanning.tsx";
|
||||||
import Attributes from "./tabs/Attributes/Attributes.tsx";
|
import Attributes from "./tabs/Attributes/Attributes.tsx";
|
||||||
|
import WarehouseManagementTab from "./tabs/WarehouseManagement/WarehouseManagementTab.tsx";
|
||||||
|
|
||||||
const AdminPage = () => {
|
const AdminPage = () => {
|
||||||
const userRole = useSelector((state: RootState) => state.auth.role);
|
const userRole = useSelector((state: RootState) => state.auth.role);
|
||||||
@@ -96,6 +98,11 @@ const AdminPage = () => {
|
|||||||
Атрибуты карточек
|
Атрибуты карточек
|
||||||
</Tabs.Tab>
|
</Tabs.Tab>
|
||||||
)}
|
)}
|
||||||
|
<Tabs.Tab
|
||||||
|
value={"warehouseManagement"}
|
||||||
|
leftSection={<IconBuildingWarehouse />}>
|
||||||
|
Управление складом
|
||||||
|
</Tabs.Tab>
|
||||||
</Tabs.List>
|
</Tabs.List>
|
||||||
{getTabPanel("users", <UsersTab />)}
|
{getTabPanel("users", <UsersTab />)}
|
||||||
{getTabPanel("rolesAndPositions", <OrganizationalStructureTab />)}
|
{getTabPanel("rolesAndPositions", <OrganizationalStructureTab />)}
|
||||||
@@ -105,6 +112,7 @@ const AdminPage = () => {
|
|||||||
{getTabPanel("workShifts", <WorkShiftsTab />)}
|
{getTabPanel("workShifts", <WorkShiftsTab />)}
|
||||||
{getTabPanel("transactions", <TransactionsTab />)}
|
{getTabPanel("transactions", <TransactionsTab />)}
|
||||||
{getTabPanel("attributes", <Attributes />)}
|
{getTabPanel("attributes", <Attributes />)}
|
||||||
|
{getTabPanel("warehouseManagement", <WarehouseManagementTab />)}
|
||||||
</Tabs>
|
</Tabs>
|
||||||
</PageBlock>
|
</PageBlock>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import { WarehouseManagementTabContextProvider } from "./placeType/contexts/WarehouseManagementTabContext.tsx";
|
||||||
|
import { WmsPage, WmsSegmentedControl } from "./placeType/components/WmsSegmentedControl.tsx";
|
||||||
|
import { useState } from "react";
|
||||||
|
import PlaceTypesEditor from "./placeType/components/PlaceTypesEditor.tsx";
|
||||||
|
import PlacesEditor from "./place/components/PlacesEditor.tsx";
|
||||||
|
|
||||||
|
const WarehouseManagementTab = () => {
|
||||||
|
const [page, setPage] = useState(WmsPage.PLACE);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<WarehouseManagementTabContextProvider>
|
||||||
|
<WmsSegmentedControl
|
||||||
|
w={"100%"}
|
||||||
|
value={page.toString()}
|
||||||
|
onChange={event => {
|
||||||
|
setPage(parseInt(event));
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{page === WmsPage.PLACE_TYPE ? (
|
||||||
|
<PlaceTypesEditor />
|
||||||
|
) : (
|
||||||
|
<PlacesEditor />
|
||||||
|
)}
|
||||||
|
</WarehouseManagementTabContextProvider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default WarehouseManagementTab;
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import { DataTable } from "mantine-datatable";
|
||||||
|
import { IconChevronRight, IconSpace } from "@tabler/icons-react";
|
||||||
|
import clsx from "clsx";
|
||||||
|
import classes from "../../../OrganizationalStructureTab/components/DepartmentsTree/DepartmentsTree.module.css";
|
||||||
|
import { useState } from "react";
|
||||||
|
import { PlaceSchema } from "../../../../../../client";
|
||||||
|
import PlaceActions from "./PlaceActions.tsx";
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
place: PlaceSchema;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Place = ({ place }: Props) => {
|
||||||
|
const [placeTypeIds, setPlaceTypeIds] = useState<number[]>([]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DataTable
|
||||||
|
noHeader
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
accessor: "name",
|
||||||
|
title: "Место",
|
||||||
|
noWrap: true,
|
||||||
|
render: ({ id, number, placeType }) => (
|
||||||
|
<>
|
||||||
|
<IconChevronRight
|
||||||
|
className={clsx(classes.icon, classes.expandIcon, {
|
||||||
|
[classes.expandIconRotated]: placeTypeIds?.includes(id),
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
<IconSpace className={classes.icon} />
|
||||||
|
<span>{placeType.name} {number}</span>
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessor: "actions",
|
||||||
|
title: "",
|
||||||
|
width: "0%",
|
||||||
|
render: (place) => (
|
||||||
|
<PlaceActions place={place} />
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
records={place.children?.sort((a, b) => a.id - b.id)}
|
||||||
|
rowExpansion={{
|
||||||
|
allowMultiple: true,
|
||||||
|
expanded: { recordIds: placeTypeIds, onRecordIdsChange: setPlaceTypeIds },
|
||||||
|
content: ({ record }) => (
|
||||||
|
<Place place={record} />
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Place;
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
import { PlaceSchema } from "../../../../../../client";
|
||||||
|
import { IconBoxAlignBottom, IconPlaylistAdd, IconQrcode, IconTrash } from "@tabler/icons-react";
|
||||||
|
import { ActionIcon, Flex, Tooltip } from "@mantine/core";
|
||||||
|
import React, { ReactNode } from "react";
|
||||||
|
import { useWarehouseManagementTabContext } from "../../placeType/contexts/WarehouseManagementTabContext.tsx";
|
||||||
|
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
place: PlaceSchema;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PlaceActions = ({ place }: Props) => {
|
||||||
|
const { placeCrud, onCreatePlace, generateQrCode } = useWarehouseManagementTabContext();
|
||||||
|
|
||||||
|
const getAction = (
|
||||||
|
label: string,
|
||||||
|
func: () => void,
|
||||||
|
icon: ReactNode,
|
||||||
|
disabled: boolean = false,
|
||||||
|
) => {
|
||||||
|
return (
|
||||||
|
<Tooltip label={label} key={label}>
|
||||||
|
<ActionIcon
|
||||||
|
variant={"default"}
|
||||||
|
onClick={(e: React.MouseEvent<HTMLButtonElement>) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
func();
|
||||||
|
}}
|
||||||
|
disabled={disabled}
|
||||||
|
>
|
||||||
|
{icon}
|
||||||
|
</ActionIcon>
|
||||||
|
</Tooltip>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const actions = [
|
||||||
|
getAction(
|
||||||
|
"Распечатать QR-код",
|
||||||
|
() => generateQrCode(place, false),
|
||||||
|
<IconQrcode />,
|
||||||
|
),
|
||||||
|
getAction(
|
||||||
|
"Распечатать QR-код ",
|
||||||
|
() => generateQrCode(place, true),
|
||||||
|
<IconBoxAlignBottom />,
|
||||||
|
),
|
||||||
|
getAction(
|
||||||
|
"Добавить",
|
||||||
|
() => onCreatePlace(place),
|
||||||
|
<IconPlaylistAdd />,
|
||||||
|
place.placeType.childCount === 0,
|
||||||
|
),
|
||||||
|
getAction(
|
||||||
|
"Удалить",
|
||||||
|
() => placeCrud.onDelete && placeCrud.onDelete(place),
|
||||||
|
<IconTrash />,
|
||||||
|
place.children?.length !== 0,
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Flex gap={"md"} mx={"md"} direction={"row"}>
|
||||||
|
{...actions}
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PlaceActions;
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import { FC } from "react";
|
||||||
|
import { FlatPlaceTypeSchema } from "../../../../../../client";
|
||||||
|
import ObjectSelect, { ObjectSelectProps } from "../../../../../../components/ObjectSelect/ObjectSelect.tsx";
|
||||||
|
|
||||||
|
type Props = Omit<
|
||||||
|
ObjectSelectProps<FlatPlaceTypeSchema | null>,
|
||||||
|
"getValueFn" | "getLabelFn"
|
||||||
|
>;
|
||||||
|
|
||||||
|
const PlaceTypeSelect: FC<Props> = (props) => {
|
||||||
|
return (
|
||||||
|
<ObjectSelect
|
||||||
|
getLabelFn={(placeType: FlatPlaceTypeSchema) => placeType.name}
|
||||||
|
getValueFn={(placeType: FlatPlaceTypeSchema) => placeType.id.toString()}
|
||||||
|
clearable
|
||||||
|
searchable
|
||||||
|
{...props}
|
||||||
|
onClear={() => props.onChange(null)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PlaceTypeSelect;
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
import { Button, Group, Stack } from "@mantine/core";
|
||||||
|
import { IconChevronRight, IconSpace } from "@tabler/icons-react";
|
||||||
|
import clsx from "clsx";
|
||||||
|
import classes from "../../../OrganizationalStructureTab/components/DepartmentsTree/DepartmentsTree.module.css";
|
||||||
|
import { DataTable } from "mantine-datatable";
|
||||||
|
import { useState } from "react";
|
||||||
|
import { useWarehouseManagementTabContext } from "../../placeType/contexts/WarehouseManagementTabContext.tsx";
|
||||||
|
import PlaceActions from "./PlaceActions.tsx";
|
||||||
|
import Place from "./Place.tsx";
|
||||||
|
|
||||||
|
const PlacesEditor = () => {
|
||||||
|
const { places, onCreatePlace } = useWarehouseManagementTabContext();
|
||||||
|
const [placeIds, setPlaceIds] = useState<number[]>([]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack w={"100%"} mt={"md"}>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
variant={"default"}
|
||||||
|
onClick={() => onCreatePlace()}
|
||||||
|
>
|
||||||
|
Добавить
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
<DataTable
|
||||||
|
noHeader
|
||||||
|
withTableBorder
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
accessor: "name",
|
||||||
|
title: "Место",
|
||||||
|
noWrap: true,
|
||||||
|
render: ({ id, number, placeType }) => (
|
||||||
|
<>
|
||||||
|
<IconChevronRight
|
||||||
|
className={clsx(classes.icon, classes.expandIcon, {
|
||||||
|
[classes.expandIconRotated]: placeIds?.includes(id),
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
<IconSpace className={classes.icon} />
|
||||||
|
<span>{placeType.name} {number}</span>
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessor: "actions",
|
||||||
|
title: "",
|
||||||
|
width: "0%",
|
||||||
|
render: (place) => (
|
||||||
|
<PlaceActions place={place} />
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
records={places.sort((a, b) => a.id - b.id)}
|
||||||
|
rowExpansion={{
|
||||||
|
allowMultiple: true,
|
||||||
|
expanded: { recordIds: placeIds, onRecordIdsChange: setPlaceIds },
|
||||||
|
content: ({ record }) => (
|
||||||
|
<Place place={record} />
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PlacesEditor;
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
import { useCRUD } from "../../../../../../hooks/useCRUD.tsx";
|
||||||
|
import { BasePlaceSchema, PlaceSchema, WmsService } from "../../../../../../client";
|
||||||
|
import { notifications } from "../../../../../../shared/lib/notifications.ts";
|
||||||
|
|
||||||
|
|
||||||
|
export type PlaceCrud = {
|
||||||
|
onCreate: (element: BasePlaceSchema) => void,
|
||||||
|
onDelete: (element: PlaceSchema) => void,
|
||||||
|
onChange: (element: PlaceSchema) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
fetchPlaces: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const usePlacesCrud = ({ fetchPlaces }: Props): PlaceCrud => {
|
||||||
|
return useCRUD<PlaceSchema, BasePlaceSchema>({
|
||||||
|
onChange: (place: PlaceSchema) => {
|
||||||
|
WmsService.editPlace({
|
||||||
|
requestBody: { place },
|
||||||
|
})
|
||||||
|
.then(({ ok, message }) => {
|
||||||
|
fetchPlaces();
|
||||||
|
if (ok) return;
|
||||||
|
notifications.error({ message });
|
||||||
|
})
|
||||||
|
.catch(err => console.log(err));
|
||||||
|
},
|
||||||
|
onDelete: (place: PlaceSchema) => {
|
||||||
|
WmsService.deletePlace({
|
||||||
|
placeId: place.id,
|
||||||
|
})
|
||||||
|
.then(({ ok, message }) => {
|
||||||
|
fetchPlaces();
|
||||||
|
if (ok) return;
|
||||||
|
notifications.error({ message });
|
||||||
|
})
|
||||||
|
.catch(err => console.log(err));
|
||||||
|
},
|
||||||
|
onCreate: (place: BasePlaceSchema) => {
|
||||||
|
WmsService.createPlace({
|
||||||
|
requestBody: {
|
||||||
|
place,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then(({ ok, message }) => {
|
||||||
|
fetchPlaces();
|
||||||
|
if (ok) return;
|
||||||
|
notifications.error({ message });
|
||||||
|
})
|
||||||
|
.catch(err => console.log(err));
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default usePlacesCrud;
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { WmsService } from "../../../../../../client";
|
||||||
|
import ObjectList from "../../../../../../hooks/objectList.tsx";
|
||||||
|
|
||||||
|
const usePlacesList = () =>
|
||||||
|
ObjectList({
|
||||||
|
queryFn: WmsService.getPlaces,
|
||||||
|
getObjectsFn: response => response.places,
|
||||||
|
queryKey: "getAllPlaces",
|
||||||
|
});
|
||||||
|
|
||||||
|
export default usePlacesList;
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
import { ContextModalProps } from "@mantine/modals";
|
||||||
|
import { FlatPlaceTypeSchema, PlaceSchema } from "../../../../../../client";
|
||||||
|
import { Button, Stack } from "@mantine/core";
|
||||||
|
import { useForm } from "@mantine/form";
|
||||||
|
import { PlaceCrud } from "../hooks/usePlacesCrud.tsx";
|
||||||
|
import PlaceTypeSelect from "../components/PlaceTypeSelect.tsx";
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
placeCrud: PlaceCrud;
|
||||||
|
parent?: PlaceSchema;
|
||||||
|
placeTypes: FlatPlaceTypeSchema[];
|
||||||
|
}
|
||||||
|
|
||||||
|
type PlaceModalForm = {
|
||||||
|
placeType: PlaceSchema | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PlaceModal = ({
|
||||||
|
context,
|
||||||
|
id,
|
||||||
|
innerProps,
|
||||||
|
}: ContextModalProps<Props>) => {
|
||||||
|
const { parent, placeCrud, placeTypes } = innerProps;
|
||||||
|
|
||||||
|
const closeModal = () => {
|
||||||
|
context.closeContextModal(id);
|
||||||
|
};
|
||||||
|
|
||||||
|
const initialValues: PlaceModalForm = {
|
||||||
|
placeType: null,
|
||||||
|
};
|
||||||
|
const form = useForm<PlaceModalForm>({
|
||||||
|
initialValues,
|
||||||
|
validate: {
|
||||||
|
placeType: placeType => !placeType && "Необходимо указать тип",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const onSubmit = (values: PlaceModalForm) => {
|
||||||
|
if (!values.placeType) return;
|
||||||
|
placeCrud.onCreate({
|
||||||
|
placeTypeId: values.placeType.id,
|
||||||
|
parentId: parent?.id || null,
|
||||||
|
});
|
||||||
|
closeModal();
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<form onSubmit={form.onSubmit(values => onSubmit(values))}>
|
||||||
|
<Stack>
|
||||||
|
<PlaceTypeSelect
|
||||||
|
label={"Тип места на складе"}
|
||||||
|
{...form.getInputProps("placeType")}
|
||||||
|
data={placeTypes}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Button variant={"default"} type={"submit"}>
|
||||||
|
Сохранить
|
||||||
|
</Button>
|
||||||
|
</Stack>
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PlaceModal;
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import { PlaceTypeSchema } from "../../../../../../client";
|
||||||
|
import { DataTable } from "mantine-datatable";
|
||||||
|
import { IconChevronRight, IconSpace } from "@tabler/icons-react";
|
||||||
|
import clsx from "clsx";
|
||||||
|
import classes from "../../../OrganizationalStructureTab/components/DepartmentsTree/DepartmentsTree.module.css";
|
||||||
|
import { useState } from "react";
|
||||||
|
import PlaceTypeActions from "./PlaceTypeActions.tsx";
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
placeType: PlaceTypeSchema;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PlaceType = ({ placeType }: Props) => {
|
||||||
|
const [placeTypeIds, setPlaceTypeIds] = useState<number[]>([]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DataTable
|
||||||
|
noHeader
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
accessor: "name",
|
||||||
|
title: "Место",
|
||||||
|
noWrap: true,
|
||||||
|
render: ({ id, name }) => (
|
||||||
|
<>
|
||||||
|
<IconChevronRight
|
||||||
|
className={clsx(classes.icon, classes.expandIcon, {
|
||||||
|
[classes.expandIconRotated]: placeTypeIds?.includes(id),
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
<IconSpace className={classes.icon} />
|
||||||
|
<span>{name}</span>
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessor: "actions",
|
||||||
|
title: "",
|
||||||
|
width: "0%",
|
||||||
|
render: (placeType) => (
|
||||||
|
<PlaceTypeActions placeType={placeType} />
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
records={placeType.children?.sort((a, b) => a.id - b.id)}
|
||||||
|
rowExpansion={{
|
||||||
|
allowMultiple: true,
|
||||||
|
expanded: { recordIds: placeTypeIds, onRecordIdsChange: setPlaceTypeIds },
|
||||||
|
content: ({ record }) => (
|
||||||
|
<PlaceType placeType={record} />
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PlaceType;
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
import { PlaceTypeSchema } from "../../../../../../client";
|
||||||
|
import { IconEdit, IconPlaylistAdd, IconTrash } from "@tabler/icons-react";
|
||||||
|
import { ActionIcon, Flex, Tooltip } from "@mantine/core";
|
||||||
|
import React, { ReactNode } from "react";
|
||||||
|
import { useWarehouseManagementTabContext } from "../contexts/WarehouseManagementTabContext.tsx";
|
||||||
|
import { modals } from "@mantine/modals";
|
||||||
|
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
placeType: PlaceTypeSchema;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PlaceTypeActions = ({ placeType }: Props) => {
|
||||||
|
const { placeTypeCrud } = useWarehouseManagementTabContext();
|
||||||
|
|
||||||
|
const getAction = (
|
||||||
|
label: string,
|
||||||
|
func: () => void,
|
||||||
|
icon: ReactNode,
|
||||||
|
disabled: boolean = false,
|
||||||
|
) => {
|
||||||
|
return (
|
||||||
|
<Tooltip label={label} key={label}>
|
||||||
|
<ActionIcon
|
||||||
|
disabled={disabled}
|
||||||
|
variant={"default"}
|
||||||
|
onClick={(e: React.MouseEvent<HTMLButtonElement>) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
func();
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{icon}
|
||||||
|
</ActionIcon>
|
||||||
|
</Tooltip>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const actions = [
|
||||||
|
getAction(
|
||||||
|
"Добавить",
|
||||||
|
() => {
|
||||||
|
modals.openContextModal({
|
||||||
|
modal: "placeTypeModal",
|
||||||
|
title: "Создание типа места на складе",
|
||||||
|
withCloseButton: false,
|
||||||
|
innerProps: {
|
||||||
|
placeTypeCrud,
|
||||||
|
parent: placeType,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
<IconPlaylistAdd />,
|
||||||
|
),
|
||||||
|
getAction(
|
||||||
|
"Редактировать",
|
||||||
|
() => {
|
||||||
|
modals.openContextModal({
|
||||||
|
modal: "placeTypeModal",
|
||||||
|
title: "Редактирование типа места на складе",
|
||||||
|
withCloseButton: false,
|
||||||
|
innerProps: {
|
||||||
|
placeTypeCrud,
|
||||||
|
element: placeType,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
<IconEdit />,
|
||||||
|
),
|
||||||
|
getAction(
|
||||||
|
"Удалить",
|
||||||
|
() => placeTypeCrud.onDelete && placeTypeCrud.onDelete(placeType),
|
||||||
|
<IconTrash />,
|
||||||
|
placeType.placesCount !== 0 || placeType.children?.length !== 0,
|
||||||
|
),
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Flex gap={"md"} mx={"md"} direction={"row"}>
|
||||||
|
{...actions}
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PlaceTypeActions;
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
import { Button, Group, Stack } from "@mantine/core";
|
||||||
|
import { useWarehouseManagementTabContext } from "../contexts/WarehouseManagementTabContext.tsx";
|
||||||
|
import { IconChevronRight, IconSpace } from "@tabler/icons-react";
|
||||||
|
import clsx from "clsx";
|
||||||
|
import classes from "../../../OrganizationalStructureTab/components/DepartmentsTree/DepartmentsTree.module.css";
|
||||||
|
import { DataTable } from "mantine-datatable";
|
||||||
|
import { useState } from "react";
|
||||||
|
import PlaceType from "./PlaceType.tsx";
|
||||||
|
import PlaceTypeActions from "./PlaceTypeActions.tsx";
|
||||||
|
import { modals } from "@mantine/modals";
|
||||||
|
|
||||||
|
const PlaceTypesEditor = () => {
|
||||||
|
const { placeTypes, placeTypeCrud } = useWarehouseManagementTabContext();
|
||||||
|
const [placeTypeIds, setPlaceTypeIds] = useState<number[]>([]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Stack w={"100%"} mt={"md"}>
|
||||||
|
<Group>
|
||||||
|
<Button
|
||||||
|
variant={"default"}
|
||||||
|
onClick={() => {
|
||||||
|
modals.openContextModal({
|
||||||
|
modal: "placeTypeModal",
|
||||||
|
title: "Создание типа места на складе",
|
||||||
|
withCloseButton: false,
|
||||||
|
innerProps: {
|
||||||
|
placeTypeCrud,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Добавить
|
||||||
|
</Button>
|
||||||
|
</Group>
|
||||||
|
<DataTable
|
||||||
|
noHeader
|
||||||
|
withTableBorder
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
accessor: "name",
|
||||||
|
title: "Место",
|
||||||
|
noWrap: true,
|
||||||
|
render: ({ id, name }) => (
|
||||||
|
<>
|
||||||
|
<IconChevronRight
|
||||||
|
className={clsx(classes.icon, classes.expandIcon, {
|
||||||
|
[classes.expandIconRotated]: placeTypeIds?.includes(id),
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
<IconSpace className={classes.icon} />
|
||||||
|
<span>{name}</span>
|
||||||
|
</>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessor: "actions",
|
||||||
|
title: "",
|
||||||
|
width: "0%",
|
||||||
|
render: (placeType) => (
|
||||||
|
<PlaceTypeActions placeType={placeType} />
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
records={placeTypes.sort((a, b) => a.id - b.id)}
|
||||||
|
rowExpansion={{
|
||||||
|
allowMultiple: true,
|
||||||
|
expanded: { recordIds: placeTypeIds, onRecordIdsChange: setPlaceTypeIds },
|
||||||
|
content: ({ record }) => (
|
||||||
|
<PlaceType placeType={record} />
|
||||||
|
),
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PlaceTypesEditor;
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import { SegmentedControl, SegmentedControlProps } from "@mantine/core";
|
||||||
|
import { FC } from "react";
|
||||||
|
|
||||||
|
export enum WmsPage {
|
||||||
|
PLACE,
|
||||||
|
PLACE_TYPE,
|
||||||
|
}
|
||||||
|
|
||||||
|
type Props = Omit<SegmentedControlProps, "data">;
|
||||||
|
const data = [
|
||||||
|
{
|
||||||
|
label: "Места на складе",
|
||||||
|
value: WmsPage.PLACE.toString(),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "Типы мест на складе",
|
||||||
|
value: WmsPage.PLACE_TYPE.toString(),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export const WmsSegmentedControl: FC<Props> = props => {
|
||||||
|
return (
|
||||||
|
<SegmentedControl
|
||||||
|
data={data}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
import React, { createContext, FC, useContext } from "react";
|
||||||
|
import { PlaceSchema, PlaceTypeSchema, WmsService } from "../../../../../../client";
|
||||||
|
import usePlaceTypesList from "../hooks/usePlaceTypesList.tsx";
|
||||||
|
import usePlaceTypesCrud, { PlaceTypeCrud } from "../hooks/usePlaceTypesCrud.tsx";
|
||||||
|
import usePlacesList from "../../place/hooks/usePlacesList.tsx";
|
||||||
|
import usePlacesCrud, { PlaceCrud } from "../../place/hooks/usePlacesCrud.tsx";
|
||||||
|
import { modals } from "@mantine/modals";
|
||||||
|
|
||||||
|
type WarehouseManagementTabContextState = {
|
||||||
|
refetchPlaceTypes: () => void;
|
||||||
|
placeTypeCrud: PlaceTypeCrud;
|
||||||
|
placeTypes: PlaceTypeSchema[];
|
||||||
|
refetchPlaces: () => void;
|
||||||
|
placeCrud: PlaceCrud;
|
||||||
|
places: PlaceSchema[];
|
||||||
|
onCreatePlace: (place?: PlaceSchema) => void;
|
||||||
|
generateQrCode: (place: PlaceSchema, isShort: boolean) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const WarehouseManagementTabContext = createContext<WarehouseManagementTabContextState | undefined>(
|
||||||
|
undefined,
|
||||||
|
);
|
||||||
|
|
||||||
|
const useWarehouseManagementTabContextState = () => {
|
||||||
|
const { objects: placeTypes, refetch: refetchPlaceTypes } = usePlaceTypesList();
|
||||||
|
const { objects: places, refetch: refetchPlaces } = usePlacesList();
|
||||||
|
|
||||||
|
const placeTypeCrud: PlaceTypeCrud = usePlaceTypesCrud({
|
||||||
|
fetchPlaceTypes: refetchPlaceTypes,
|
||||||
|
});
|
||||||
|
|
||||||
|
const placeCrud: PlaceCrud = usePlacesCrud({
|
||||||
|
fetchPlaces: refetchPlaces,
|
||||||
|
});
|
||||||
|
|
||||||
|
const onCreatePlace = (place?: PlaceSchema) => {
|
||||||
|
WmsService.getFlatPlaceTypes({
|
||||||
|
parentPlaceTypeId: place?.placeTypeId || -1,
|
||||||
|
})
|
||||||
|
.then(({ placeTypes }) => {
|
||||||
|
if (placeTypes.length === 1) {
|
||||||
|
placeCrud.onCreate({
|
||||||
|
parentId: place?.id || null,
|
||||||
|
placeTypeId: placeTypes[0].id,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
modals.openContextModal({
|
||||||
|
modal: "placeModal",
|
||||||
|
title: "Создание места на складе",
|
||||||
|
withCloseButton: false,
|
||||||
|
innerProps: {
|
||||||
|
placeCrud,
|
||||||
|
parent: place,
|
||||||
|
placeTypes,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(err => console.log(err));
|
||||||
|
};
|
||||||
|
|
||||||
|
const generateQrCode = (place: PlaceSchema, isShort: boolean) => {
|
||||||
|
const pdfWindow = window.open(
|
||||||
|
`${import.meta.env.VITE_API_URL}/wms/place/pdf/${place.id}/${isShort}`,
|
||||||
|
);
|
||||||
|
if (!pdfWindow) return;
|
||||||
|
pdfWindow.print();
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
placeTypes,
|
||||||
|
placeTypeCrud,
|
||||||
|
refetchPlaceTypes,
|
||||||
|
places,
|
||||||
|
placeCrud,
|
||||||
|
refetchPlaces,
|
||||||
|
onCreatePlace,
|
||||||
|
generateQrCode,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
type WarehouseManagementTabContextProviderProps = {
|
||||||
|
children: React.ReactNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const WarehouseManagementTabContextProvider: FC<WarehouseManagementTabContextProviderProps> = ({ children }) => {
|
||||||
|
const state = useWarehouseManagementTabContextState();
|
||||||
|
return (
|
||||||
|
<WarehouseManagementTabContext.Provider value={state}>
|
||||||
|
{children}
|
||||||
|
</WarehouseManagementTabContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useWarehouseManagementTabContext = () => {
|
||||||
|
const context = useContext(WarehouseManagementTabContext);
|
||||||
|
if (!context) {
|
||||||
|
throw new Error(
|
||||||
|
"useWarehouseManagementTabContext must be used within a WarehouseManagementTabContextProvider",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
};
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { WmsService } from "../../../../../../client";
|
||||||
|
import ObjectList from "../../../../../../hooks/objectList.tsx";
|
||||||
|
|
||||||
|
const useFlatPlaceTypesList = (parentPlaceTypeId: number = -1) =>
|
||||||
|
ObjectList({
|
||||||
|
queryFn: () => WmsService.getFlatPlaceTypes({ parentPlaceTypeId }),
|
||||||
|
getObjectsFn: response => response.placeTypes,
|
||||||
|
queryKey: "getFlatPlaceTypes",
|
||||||
|
});
|
||||||
|
|
||||||
|
export default useFlatPlaceTypesList;
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
import { useCRUD } from "../../../../../../hooks/useCRUD.tsx";
|
||||||
|
import { BasePlaceTypeSchema, FlatPlaceTypeSchema, WmsService } from "../../../../../../client";
|
||||||
|
import { notifications } from "../../../../../../shared/lib/notifications.ts";
|
||||||
|
|
||||||
|
|
||||||
|
export type PlaceTypeCrud = {
|
||||||
|
onCreate: (element: BasePlaceTypeSchema) => void,
|
||||||
|
onDelete: (element: FlatPlaceTypeSchema) => void,
|
||||||
|
onChange: (element: FlatPlaceTypeSchema) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
fetchPlaceTypes: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const usePlaceTypesCrud = ({ fetchPlaceTypes }: Props): PlaceTypeCrud => {
|
||||||
|
return useCRUD<FlatPlaceTypeSchema, BasePlaceTypeSchema>({
|
||||||
|
onChange: (placeType: FlatPlaceTypeSchema) => {
|
||||||
|
WmsService.editPlaceType({
|
||||||
|
requestBody: { placeType },
|
||||||
|
})
|
||||||
|
.then(({ ok, message }) => {
|
||||||
|
fetchPlaceTypes();
|
||||||
|
if (ok) return;
|
||||||
|
notifications.error({ message });
|
||||||
|
})
|
||||||
|
.catch(err => console.log(err));
|
||||||
|
},
|
||||||
|
onDelete: (placeType: FlatPlaceTypeSchema) => {
|
||||||
|
WmsService.deletePlaceType({
|
||||||
|
placeTypeId: placeType.id,
|
||||||
|
})
|
||||||
|
.then(({ ok, message }) => {
|
||||||
|
fetchPlaceTypes();
|
||||||
|
if (ok) return;
|
||||||
|
notifications.error({ message });
|
||||||
|
})
|
||||||
|
.catch(err => console.log(err));
|
||||||
|
},
|
||||||
|
onCreate: (placeType: BasePlaceTypeSchema) => {
|
||||||
|
WmsService.createPlaceType({
|
||||||
|
requestBody: {
|
||||||
|
placeType,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.then(({ ok, message }) => {
|
||||||
|
fetchPlaceTypes();
|
||||||
|
if (ok) return;
|
||||||
|
notifications.error({ message });
|
||||||
|
})
|
||||||
|
.catch(err => console.log(err));
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default usePlaceTypesCrud;
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { WmsService } from "../../../../../../client";
|
||||||
|
import ObjectList from "../../../../../../hooks/objectList.tsx";
|
||||||
|
|
||||||
|
const usePlaceTypesList = () =>
|
||||||
|
ObjectList({
|
||||||
|
queryFn: WmsService.getPlaceTypes,
|
||||||
|
getObjectsFn: response => response.placeTypes,
|
||||||
|
queryKey: "getAllPlaceTypes",
|
||||||
|
});
|
||||||
|
|
||||||
|
export default usePlaceTypesList;
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
import { ContextModalProps } from "@mantine/modals";
|
||||||
|
import { BasePlaceTypeSchema, PlaceTypeSchema } from "../../../../../../client";
|
||||||
|
import { PlaceTypeCrud } from "../hooks/usePlaceTypesCrud.tsx";
|
||||||
|
import { Button, Stack, TextInput } from "@mantine/core";
|
||||||
|
import { useForm } from "@mantine/form";
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
placeTypeCrud: PlaceTypeCrud;
|
||||||
|
element?: PlaceTypeSchema & BasePlaceTypeSchema;
|
||||||
|
parent?: PlaceTypeSchema;
|
||||||
|
}
|
||||||
|
|
||||||
|
type PlaceTypeModalForm = {
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const PlaceTypeModal = ({
|
||||||
|
context,
|
||||||
|
id,
|
||||||
|
innerProps,
|
||||||
|
}: ContextModalProps<Props>) => {
|
||||||
|
const { element, parent, placeTypeCrud } = innerProps;
|
||||||
|
|
||||||
|
const closeModal = () => {
|
||||||
|
context.closeContextModal(id);
|
||||||
|
};
|
||||||
|
|
||||||
|
const initialValues: PlaceTypeModalForm = {
|
||||||
|
name: innerProps.element?.name ?? "",
|
||||||
|
};
|
||||||
|
const form = useForm<PlaceTypeModalForm>({
|
||||||
|
initialValues,
|
||||||
|
validate: {
|
||||||
|
name: name => !name && "Необходимо указать название",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const isChanged = (): boolean => {
|
||||||
|
return initialValues.name !== form.values.name;
|
||||||
|
};
|
||||||
|
|
||||||
|
const onSubmit = (values: PlaceTypeModalForm) => {
|
||||||
|
if (element) {
|
||||||
|
if (isChanged()) {
|
||||||
|
placeTypeCrud.onChange({
|
||||||
|
name: values.name ?? "",
|
||||||
|
id: element?.id,
|
||||||
|
parentId: element?.parentId ?? null,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
placeTypeCrud.onCreate({
|
||||||
|
name: values.name ?? "",
|
||||||
|
parentId: parent?.id ?? null,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
closeModal();
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<form onSubmit={form.onSubmit(values => onSubmit(values))}>
|
||||||
|
<Stack>
|
||||||
|
<TextInput
|
||||||
|
label={"Название"}
|
||||||
|
{...form.getInputProps("name")}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Button variant={"default"} type={"submit"}>
|
||||||
|
Сохранить
|
||||||
|
</Button>
|
||||||
|
</Stack>
|
||||||
|
</form>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default PlaceTypeModal;
|
||||||
Reference in New Issue
Block a user