Compare commits

..

61 Commits

Author SHA1 Message Date
ab59715c1f Merge pull request 'fix(showTime): show time in datePicker' (#56) from lavoce into main
Reviewed-on: #56
2026-06-30 04:58:29 +00:00
dc4c975df2 Merge pull request 'lavoce' (#55) from lavoce into main
Reviewed-on: #55
2026-06-25 06:41:12 +00:00
60927e045e Merge pull request 'feat(month): add monthy selection' (#54) from lavoce into main
Reviewed-on: #54
2026-06-22 07:38:47 +00:00
7063865a7b Merge pull request 'fix(email): fix payload' (#53) from lavoce into main
Reviewed-on: #53
2026-06-05 09:39:11 +00:00
0fa282c4db Merge pull request 'fix(email): maxLength 64' (#52) from lavoce into main
Reviewed-on: #52
2026-06-05 08:57:04 +00:00
c79a5fc361 Merge pull request 'add: space' (#51) from lavoce into main
Reviewed-on: #51
2026-06-05 08:16:59 +00:00
3ae2d84378 Merge pull request 'lavoce' (#50) from lavoce into main
Reviewed-on: #50
2026-06-05 08:09:27 +00:00
f3faf41308 Merge pull request 'Add detailed rendering for non-reminder notifications in NotificationDetailTab, including error information and device details. Introduced new properties for reminders in notification data transformation.' (#49) from lavoce into main
Reviewed-on: #49
2026-04-30 11:16:06 +00:00
8220554a5e Merge pull request 'Refactor NotificationDetailTab component to use strict equality for reminder checks, enhancing clarity in rendering logic for reminder and non-reminder notifications.' (#48) from lavoce into main
Reviewed-on: #48
2026-04-30 09:46:08 +00:00
5a740e6ef1 Merge pull request 'Update DetailDevice component to set 'listen_channel' to null and modify NotificationDetailTab to enhance the display of spare part reminders and update the title from 'Error Notification Detail' to 'Notification Detail'.' (#47) from lavoce into main
Reviewed-on: #47
2026-04-30 02:48:29 +00:00
46e922a33d Merge pull request 'fix(svg): equate logic for all airdryer condition' (#46) from lavoce into main
Reviewed-on: #46
2026-04-29 08:36:23 +00:00
bad5da5e11 Merge pull request 'lavoce' (#45) from lavoce into main
Reviewed-on: #45
2026-04-27 06:31:40 +00:00
c92e1ef0ec Merge pull request 'lavoce' (#44) from lavoce into main
Reviewed-on: #44
2026-04-23 04:23:08 +00:00
ce55126bf8 Merge pull request 'add space' (#43) from lavoce into main
Reviewed-on: #43
2026-04-14 07:25:48 +00:00
11ac6ad9ba Merge pull request 'lavoce' (#42) from lavoce into main
Reviewed-on: #42
2026-04-10 05:35:38 +00:00
d02d7d87da Merge pull request 'Repair image svg' (#41) from lavoce into main
Reviewed-on: #41
2026-02-12 05:32:33 +00:00
255c1e64c7 Merge pull request 'lavoce' (#40) from lavoce into main
Reviewed-on: #40
2026-01-20 04:32:42 +00:00
90b882daf3 Merge pull request 'fix(color): change design & color for icon notification' (#39) from lavoce into main
Reviewed-on: #39
2026-01-13 05:39:38 +00:00
cc6a52ccbf Merge pull request 'lavoce' (#38) from lavoce into main
Reviewed-on: #38
2026-01-12 04:29:21 +00:00
03d5646565 Merge pull request 'lavoce' (#37) from lavoce into main
Reviewed-on: #37
2026-01-08 07:44:22 +00:00
4d8af01316 Merge pull request 'fixing typo detail notification user' (#36) from lavoce into main
Reviewed-on: #36
2026-01-08 05:38:53 +00:00
8f32f29c03 Merge pull request 'lavoce' (#35) from lavoce into main
Reviewed-on: #35
2026-01-08 04:52:16 +00:00
5a7d64a05b Merge pull request 'fix: resize add log card' (#34) from lavoce into main
Reviewed-on: #34
2026-01-07 03:33:48 +00:00
e74b802a60 Merge pull request 'lavoce' (#33) from lavoce into main
Reviewed-on: #33
2026-01-06 11:30:27 +00:00
f436865b7f Merge pull request 'lavoce' (#32) from lavoce into main
Reviewed-on: #32
2026-01-05 03:41:39 +00:00
48437c3c50 Merge pull request 'lavoce' (#30) from lavoce into main
Reviewed-on: #30
2025-12-31 03:20:51 +00:00
a33c9b3b92 Merge pull request 'lavoce' (#29) from lavoce into main
Reviewed-on: #29
2025-12-23 05:22:06 +00:00
58d1f5c7ab Merge pull request 'Repair and replace svg' (#28) from lavoce into main
Reviewed-on: #28
2025-12-22 09:38:05 +00:00
c10a5bf62d Merge pull request 'lavoce' (#27) from lavoce into main
Reviewed-on: #27
2025-12-22 09:28:34 +00:00
6cc5042956 Merge pull request 'repair' (#26) from lavoce into main
Reviewed-on: #26
2025-11-28 07:17:06 +00:00
5079f8d316 Merge pull request 'lavoce' (#25) from lavoce into main
Reviewed-on: #25
2025-11-28 07:12:41 +00:00
7073390de7 Merge pull request 'lavoce' (#24) from lavoce into main
Reviewed-on: #24
2025-11-28 05:50:36 +00:00
4226a24e79 Merge pull request 'lavoce' (#23) from lavoce into main
Reviewed-on: #23
2025-11-28 05:10:26 +00:00
038009433f Merge pull request 'lavoce' (#22) from lavoce into main
Reviewed-on: #22
2025-11-25 03:50:54 +00:00
64ba51b17c Merge pull request 'lavoce' (#21) from lavoce into main
Reviewed-on: #21
2025-11-20 03:44:05 +00:00
47d0638a42 Merge pull request 'lavoce' (#20) from lavoce into main
Reviewed-on: #20
2025-11-19 01:05:19 +00:00
d8c5f3ed44 Merge pull request 'lavoce' (#19) from lavoce into main
Reviewed-on: #19
2025-11-18 00:26:36 +00:00
affd9146bb Merge pull request 'lavoce' (#18) from lavoce into main
Reviewed-on: #18
2025-11-17 08:27:39 +00:00
4022b3f8f4 Merge pull request 'lavoce' (#17) from lavoce into main
Reviewed-on: #17
2025-11-10 07:57:17 +00:00
446a4e2b95 Merge pull request 'lavoce' (#16) from lavoce into main
Reviewed-on: #16
2025-11-10 06:33:35 +00:00
83a475c708 Merge pull request 'Repair beautiful apps' (#15) from lavoce into main
Reviewed-on: #15
2025-11-04 10:01:47 +00:00
ab1c510a77 Merge pull request 'Repair bg-signin' (#14) from lavoce into main
Reviewed-on: #14
2025-11-04 08:48:59 +00:00
59859c6d18 Update public/web.config 2025-11-04 07:03:57 +00:00
2bd27937dc Update public/web.config 2025-11-04 07:02:55 +00:00
1058c660d6 Update public/web.config 2025-11-04 07:01:10 +00:00
35b2167791 Update public/web.config 2025-11-04 06:53:05 +00:00
ec676983d0 Update .gitignore 2025-11-04 06:51:39 +00:00
c07c5f8235 Update .gitignore 2025-11-04 06:47:31 +00:00
b32ad97034 Merge pull request 'Add side bar menus mobile mode' (#13) from lavoce into main
Reviewed-on: #13
2025-11-04 06:42:09 +00:00
76244f6f6e Merge pull request 'lavoce' (#12) from lavoce into main
Reviewed-on: #12
2025-11-04 06:23:15 +00:00
0a128cbb3c Merge pull request 'lavoce' (#11) from lavoce into main
Reviewed-on: #11
2025-10-28 09:47:36 +00:00
bd4ab26680 Merge pull request 'lavoce' (#10) from lavoce into main
Reviewed-on: #10
2025-10-28 04:48:54 +00:00
3e728a1ff5 Merge pull request 'lavoce' (#9) from lavoce into main
Reviewed-on: #9
2025-10-27 03:48:58 +00:00
9db143972e Merge pull request 'lavoce' (#8) from lavoce into main
Reviewed-on: #8
2025-10-25 09:19:36 +00:00
029ea269a7 Merge pull request 'lavoce' (#7) from lavoce into main
Reviewed-on: #7
2025-10-24 05:43:32 +00:00
4cdaa042da Merge pull request 'lavoce' (#6) from lavoce into main
Reviewed-on: #6
2025-10-23 07:28:11 +00:00
56af2a16c0 Merge pull request 'update file svg to src assets' (#5) from lavoce into main
Reviewed-on: #5
2025-10-23 04:52:13 +00:00
deadf2ffb4 Merge pull request 'lavoce' (#4) from lavoce into main
Reviewed-on: #4
2025-10-23 04:27:57 +00:00
4da80c7089 Merge pull request 'lavoce' (#3) from lavoce into main
Reviewed-on: #3
2025-10-22 05:59:57 +00:00
56e3ce78a6 Merge pull request 'lavoce' (#2) from lavoce into main
Reviewed-on: #2
2025-10-20 04:06:02 +00:00
7c2a019dd2 Merge pull request 'lavoce' (#1) from lavoce into main
Reviewed-on: #1
2025-09-17 08:39:35 +00:00
5 changed files with 29 additions and 89 deletions

1
.gitignore vendored
View File

@@ -6,6 +6,7 @@ yarn-debug.log*
yarn-error.log* yarn-error.log*
pnpm-debug.log* pnpm-debug.log*
lerna-debug.log* lerna-debug.log*
*.config
node_modules node_modules
dist dist

View File

@@ -3,7 +3,7 @@
<system.webServer> <system.webServer>
<rewrite> <rewrite>
<rules> <rules>
<rule name="reactViteSypiu"> <rule name="CallOfDuty">
<match url=".*" /> <match url=".*" />
<conditions logicalGrouping="MatchAll"> <conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />

View File

@@ -91,25 +91,6 @@ const searchData = async (queryParams) => {
return response.data; return response.data;
}; };
// Reminder Monthly
const reminderMonthly = async (id, queryParams) => {
const response = await SendRequest({
method: 'post',
prefix: `notifikasi-wa/reminder-monthly/${id}`,
params: queryParams,
});
return response.data;
};
const reminderCustom= async (id, queryParams) => {
const response = await SendRequest({
method: 'post',
prefix: `notifikasi-wa/reminder-custom/${id}`,
params: queryParams,
});
return response.data;
};
export { export {
getAllNotification, getAllNotification,
getNotificationById, getNotificationById,
@@ -121,6 +102,4 @@ export {
resendChatByUser, resendChatByUser,
resendChatAllUser, resendChatAllUser,
searchData, searchData,
reminderMonthly,
reminderCustom,
}; };

View File

@@ -20,19 +20,6 @@ const NotifOk = ({ icon, title, message }) => {
}); });
}; };
const NotifSmall = ({ icon, title, message }) => {
Swal.fire({
toast: true,
position: 'top-end',
icon: icon,
title: title,
text: message,
showConfirmButton: false,
timer: 2000,
timerProgressBar: true,
});
};
const NotifConfirmDialog = ({ const NotifConfirmDialog = ({
icon, icon,
title, title,
@@ -80,4 +67,4 @@ const QuestionConfirmSubmit = ({ icon, title, message, onConfirm, onCancel }) =>
}); });
}; };
export { NotifAlert, NotifOk, NotifSmall, NotifConfirmDialog, QuestionConfirmSubmit }; export { NotifAlert, NotifOk, NotifConfirmDialog, QuestionConfirmSubmit };

View File

@@ -10,9 +10,8 @@ import {
Select, Select,
DatePicker, DatePicker,
} from 'antd'; } from 'antd';
import { NotifAlert, NotifOk, NotifSmall } from '../../../../components/Global/ToastNotif'; import { NotifAlert, NotifOk } from '../../../../components/Global/ToastNotif';
import { createDevice, updateDevice } from '../../../../api/master-device'; import { createDevice, updateDevice } from '../../../../api/master-device';
import { reminderMonthly, reminderCustom } from '../../../../api/notification';
import { getAllBrands } from '../../../../api/master-brand'; import { getAllBrands } from '../../../../api/master-brand';
import { validateRun } from '../../../../Utils/validate'; import { validateRun } from '../../../../Utils/validate';
import { toApiDateFormatter } from '../../../../components/Global/Formatter'; import { toApiDateFormatter } from '../../../../components/Global/Formatter';
@@ -41,7 +40,6 @@ const DetailDevice = (props) => {
reminder_at_monthly: null, reminder_at_monthly: null,
start_date: null, start_date: null,
end_date: null, end_date: null,
period: null,
}; };
const [formData, setFormData] = useState(defaultData); const [formData, setFormData] = useState(defaultData);
@@ -87,7 +85,7 @@ const DetailDevice = (props) => {
listen_channel: formData.listen_channel, listen_channel: formData.listen_channel,
listen_channel_reminder: formData.listen_channel_reminder, listen_channel_reminder: formData.listen_channel_reminder,
reminder_at: formData.reminder_at, reminder_at: formData.reminder_at,
reminder_at_monthly: formData.period !== 'custom' ? formData.reminder_at_monthly : null, reminder_at_monthly: formData.reminder_at_monthly,
start_date: formData.start_date, start_date: formData.start_date,
end_date: formData.end_date, end_date: formData.end_date,
}; };
@@ -98,13 +96,6 @@ const DetailDevice = (props) => {
? await updateDevice(formData.device_id, payload) ? await updateDevice(formData.device_id, payload)
: await createDevice(payload); : await createDevice(payload);
const response2 = formData.period !== 'custom'
? await updateDevice(formData.device_id, { reminder_at_monthly: formData.reminder_at_monthly,})
: await updateDevice(formData.device_id, {
start_date: formData.start_date,
end_date: formData.end_date,
});
// Check if response is successful // Check if response is successful
if (response && (response.statusCode === 200 || response.statusCode === 201)) { if (response && (response.statusCode === 200 || response.statusCode === 201)) {
const deviceName = response.data?.device_name || formData.device_name; const deviceName = response.data?.device_name || formData.device_name;
@@ -125,25 +116,6 @@ const DetailDevice = (props) => {
message: response?.message || 'Terjadi kesalahan saat menyimpan data.', message: response?.message || 'Terjadi kesalahan saat menyimpan data.',
}); });
} }
// Check if response Reminder At(Monthly) or Period are successful
const tipe = formData.period !== 'custom' ? 'Reminder At(Monthly)' : 'Period';
if (response2 && (response2.statusCode === 200 || response2.statusCode === 201)) {
NotifSmall({
icon: 'success',
title: 'Berhasil',
message: `${tipe} berhasil disimpan`,
});
} else {
NotifSmall({
icon: 'error',
title: 'Gagal',
message:
response?.message ||
`Terjadi kesalahan saat menyimpan ${tipe}`,
});
}
} catch (error) { } catch (error) {
console.error('Save Device Error:', error); console.error('Save Device Error:', error);
NotifAlert({ NotifAlert({
@@ -206,6 +178,10 @@ const DetailDevice = (props) => {
} }
}; };
const [period, setPeriod] = useState({
period: undefined,
});
useEffect(() => { useEffect(() => {
if (formData.start_date && formData.end_date) { if (formData.start_date && formData.end_date) {
const start = dayjs(formData.start_date); const start = dayjs(formData.start_date);
@@ -221,39 +197,36 @@ const DetailDevice = (props) => {
periodValue = '6'; periodValue = '6';
} }
setFormData((prev) => ({ setPeriod({
...prev,
period: periodValue, period: periodValue,
})); });
} }
}, [formData.start_date, formData.end_date]); }, [formData.start_date, formData.end_date]);
const handleMonthly = (field, value) => { const handleMonthly = (field, value) => {
setFormData((prev) => { setPeriod((prev) => ({
const data = {
...prev, ...prev,
[field]: value, [field]: value,
}; }));
if (value !== 'custom') { if (value !== 'custom') {
const months = Number(value); const months = Number(value);
const startDate = dayjs().startOf('day'); const startDate = dayjs().startOf('day');
const endDate = startDate const endDate = startDate.add(months, 'month').subtract(1, 'day').endOf('day');
.add(months, 'month')
.subtract(1, 'day')
.endOf('day');
data.start_date = startDate.toISOString(); setFormData((prev) => ({
data.end_date = endDate.toISOString(); ...prev,
data.reminder_at_monthly = null; start_date: startDate.toISOString(),
end_date: endDate.toISOString(),
}));
} else { } else {
data.start_date = null; setFormData((prev) => ({
data.end_date = null; ...prev,
start_date: null,
end_date: null,
}));
} }
return data;
});
}; };
useEffect(() => { useEffect(() => {
@@ -502,7 +475,7 @@ const DetailDevice = (props) => {
<Text style={{ color: 'red' }}> *</Text> <Text style={{ color: 'red' }}> *</Text>
<Select <Select
value={formData.period} value={period.period}
onChange={(value) => handleMonthly('period', value)} onChange={(value) => handleMonthly('period', value)}
placeholder="Select Period" placeholder="Select Period"
style={{ width: '100%' }} style={{ width: '100%' }}
@@ -513,7 +486,7 @@ const DetailDevice = (props) => {
<Select.Option value="custom">Custom</Select.Option> <Select.Option value="custom">Custom</Select.Option>
</Select> </Select>
</div> </div>
{formData.period === 'custom' && ( {period.period === 'custom' && (
<div style={{ display: 'flex', gap: 8, marginBottom: 12 }}> <div style={{ display: 'flex', gap: 8, marginBottom: 12 }}>
<DatePicker <DatePicker
placeholder="Start Date" placeholder="Start Date"
@@ -552,7 +525,7 @@ const DetailDevice = (props) => {
<Text strong>Reminder At(Monthly)</Text> <Text strong>Reminder At(Monthly)</Text>
<div style={{ display: 'flex', gap: 8, alignItems: 'center' }}> <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>
<DatePicker <DatePicker
disabled={formData.period === 'custom'} disabled={period.period === 'custom'}
value={ value={
formData.reminder_at_monthly formData.reminder_at_monthly
? dayjs(formData.reminder_at_monthly) // ✅ langsung parse ISO ? dayjs(formData.reminder_at_monthly) // ✅ langsung parse ISO
@@ -570,7 +543,7 @@ const DetailDevice = (props) => {
/> />
<Button <Button
disabled={formData.period === 'custom'} disabled={period.period === 'custom'}
danger danger
onClick={() => onClick={() =>
setFormData((prev) => ({ setFormData((prev) => ({