feat(FE-166-167-168): slicing ui create, edit dan detail sales order

This commit is contained in:
randy-ar
2025-11-06 16:57:17 +07:00
parent 158971d904
commit fcc2fced06
10 changed files with 785 additions and 110 deletions
-6
View File
@@ -1,6 +0,0 @@
import { Marketing } from '@/types/api/marketing/marketing';
import { BaseApiService } from './base';
export const MarketingApi = new BaseApiService<Marketing, unknown, unknown>(
'/marketing/sales-orders'
);
+113
View File
@@ -0,0 +1,113 @@
import { dummyMarketings } from '@/dummy/marketing.dummy';
import { sleep } from '@/lib/helper';
import { BaseApiService } from '@/services/api/base';
import { httpClient } from '@/services/http/client';
import { BaseApiResponse } from '@/types/api/api-general';
import {
Marketing,
CreateMarketingPayload,
UpdateMarketingPayload,
} from '@/types/api/marketing/marketing';
export class MarketingService extends BaseApiService<
Marketing,
CreateMarketingPayload,
UpdateMarketingPayload
> {
constructor(basePath: string = '/marketing') {
super(basePath);
}
/**
* Override: Get all marketing data (dummy mode)
*/
override async getAllFetcher(
endpoint: string
): Promise<BaseApiResponse<Marketing[]>> {
// simulasi loading
await sleep(750);
// data dummy sementara
const DUMMY_MARKETING_DATA: BaseApiResponse<Marketing[]> = {
code: 200,
status: 'success',
message: 'Berhasil mengambil data marketing (dummy)',
data: dummyMarketings,
};
return DUMMY_MARKETING_DATA;
}
/**
* Override: Get single marketing data (dummy mode)
*/
override async getSingle(
id: number
): Promise<BaseApiResponse<Marketing> | undefined> {
// simulasi delay
await new Promise((res) => setTimeout(res, 500));
// misalnya fetch dari dummy
return {
code: 200,
status: 'success',
message: 'Data marketing berhasil diambil.',
data: dummyMarketings[0],
};
// jika tidak ditemukan
throw {
code: 404,
status: 'error',
message: 'Data marketing tidak ditemukan.',
};
}
/**
* Approve single marketing data
*/
async singleApproval(
id: number,
action: 'approve' | 'reject'
): Promise<BaseApiResponse<{ message: string }> | undefined> {
try {
const path = `${this.basePath}/approvals`;
return await httpClient<BaseApiResponse<{ message: string }>>(path, {
method: 'POST',
body: {
action: action,
approval_ids: [id],
notes: `${action} marketing ${id}`,
},
});
} catch (error) {
console.error('Error approve marketing:', error);
return undefined;
}
}
/**
* Bulk approve
*/
async bulkApprovals(
ids: number[],
action: 'approve' | 'reject'
): Promise<BaseApiResponse<{ message: string }> | undefined> {
try {
const path = `${this.basePath}/approvals`;
return await httpClient<BaseApiResponse<{ message: string }>>(path, {
method: 'POST',
body: {
action: action,
approval_ids: ids,
notes: `${action} marketing ${ids.join(', ')}`,
},
});
} catch (error) {
console.error('Error bulk approve marketing:', error);
return undefined;
}
}
}
export const MarketingApi = new MarketingService('/marketing');