Skip to content

Commit

Permalink
Merge pull request #835 from hpcc-systems/yadhap/JM-punctuality-fix
Browse files Browse the repository at this point in the history
Yadhap/jm punctuality fix
  • Loading branch information
FancMa01 authored Aug 22, 2024
2 parents 5e251df + 0767264 commit f19a197
Show file tree
Hide file tree
Showing 13 changed files with 386 additions and 198 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ function NotificationTableFilters({
const [domainOptions, setDomainOptions] = useState([]);
const [productOptions, setProductOptions] = useState([]);
const [frequencyOptions, setFrequencyOptions] = useState([]);
const [filterCount, setFilterCount] = useState(4);
const [filterCount, setFilterCount] = useState(0);

//Effects
useEffect(() => {
Expand Down Expand Up @@ -151,6 +151,17 @@ function NotificationTableFilters({
setFiltersVisible(true);
};

// Clear filters when clear is clicked
const clearFilters = () => {
form.resetFields();
setFilterCount(0);
setFilters({});
// If exists remove jMFilters from local storage
if (localStorage.getItem('jMFilters')) {
localStorage.removeItem('jMFilters');
}
};

//JSX
return (
<div className="notifications__filters">
Expand Down Expand Up @@ -234,9 +245,15 @@ function NotificationTableFilters({

{filterCount > 0 && !filtersVisible && (
<div className="notification__filters_count">
<div onClick={handleFilterCountClick} style={{ cursor: 'pointer' }}>
<div style={{ cursor: 'pointer' }}>
<span style={{ color: 'var(--danger)' }}>{`${filterCount} filter(s) active`}</span>
<span style={{ color: 'var(--primary)', paddingLeft: '5px' }}> - View</span>
<span style={{ color: 'var(--primary)', paddingLeft: '5px' }} onClick={handleFilterCountClick}>
- View
</span>
<span style={{ color: 'var(--primary)', paddingLeft: '5px' }} onClick={clearFilters}>
{' '}
| Clear
</span>
</div>
</div>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const JobMonitoringTable = ({
setSelectedRows,
domains,
allProductCategories,
filteringJobs,
}) => {
//Redux
const {
Expand Down Expand Up @@ -279,6 +280,7 @@ const JobMonitoringTable = ({
return (
<Table
dataSource={jobMonitorings}
loading={filteringJobs}
columns={columns}
rowKey="id"
size="small"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ function MonitoringDetailsModal({
)}
</Descriptions.Item>
)}
{asrSpecificMetaData?.severity && (
{asrSpecificMetaData?.severity !== undefined && asrSpecificMetaData?.severity !== null && (
<Descriptions.Item label="Severity">{asrSpecificMetaData.severity}</Descriptions.Item>
)}
{/* ---------NOTIFICATION TRIGGERS AND CONTACTS --------------------------------------------- */}
Expand Down Expand Up @@ -213,22 +213,33 @@ function MonitoringDetailsModal({

export default MonitoringDetailsModal;

// Interpret run window
const interpretRunWindow = (schedule) => {
const runWindow = schedule[0].runWindow || '';
if (runWindow === '') {
return '';
} else if (runWindow === 'daily') return 'Anytime';
else {
return _.capitalize(runWindow);
}
};

//Generate tags for schedule
const generateTagsForSchedule = (schedule) => {
const tags = [];
schedule.forEach((s) => {
if (s.frequency === 'daily') {
tags.push('Everyday');
tags.push(interpretRunWindow(schedule));
}
if (s.frequency === 'weekly') {
let tempData = 'Every week on';
let tempData = `Every Week ${interpretRunWindow(schedule)} on`;
s.days.forEach((d, i) => {
tempData += ` ${getDayLabel(d)} ${i < s.days.length - 1 ? ',' : ''}`;
});
tags.push(tempData);
}
if (s.scheduleBy === 'dates') {
let tempData = 'Every month on';
let tempData = `Every month ${interpretRunWindow(schedule)}`;
s.dates.forEach((d, i) => {
tempData += ` ${getDateLabel(d)} ${i < s.dates.length - 1 ? ',' : ''}`;
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const dailyRunWindowAndIntervals = [
{ label: 'Morning (00:00 - 11:59)', value: 'morning' },
{ label: 'Afternoon (12:00 - 23:59)', value: 'afternoon' },
{ label: 'Overnight (Prev 12:00 - Current day 12:00)', value: 'overnight' },
{ label: 'Every 2 Days', value: 'every2Days' },
// { label: 'Every 2 Days', value: 'every2Days' },
];

// Daily schedule options
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ function JobMonitoring() {
const [bulkEditModalVisibility, setBulkEditModalVisibility] = useState(false);
const [filters, setFilters] = useState({});
const [filtersVisible, setFiltersVisible] = useState(true);
const [filteringJobs, setFilteringJobs] = useState(false);

// Create form instance
const [form] = Form.useForm();
Expand All @@ -84,7 +85,6 @@ function JobMonitoring() {
try {
const allMonitorings = await getAllJobMonitorings({ applicationId });
setJobMonitorings(allMonitorings);
setFilteredJobMonitoring(allMonitorings);
} catch (error) {
message.error('Error fetching job monitorings');
}
Expand Down Expand Up @@ -138,7 +138,7 @@ function JobMonitoring() {
}
}, [editingData, duplicatingData]);

// Get all teams hook, monitoring type ID, Filters from local storage
// Get monitoring type ID, Filters from local storage
useEffect(() => {
// Get monitoringType id for job monitoring
(async () => {
Expand Down Expand Up @@ -198,8 +198,11 @@ function JobMonitoring() {

// When filterChange filter the job monitorings
useEffect(() => {
if (jobMonitorings.length === 0) return;
if (Object.keys(filters).length < 1) return;
setFilteringJobs(true);
if (jobMonitorings.length === 0) {
setFilteringJobs(false);
}
// if (Object.keys(filters).length < 1) return;
const { approvalStatus, activeStatus, domain, frequency, product } = filters;

// Convert activeStatus to boolean
Expand All @@ -210,7 +213,7 @@ function JobMonitoring() {
activeStatusBool = false;
}

const filteredJobMonitorings = jobMonitorings.filter((jobMonitoring) => {
const filteredJm = jobMonitorings.filter((jobMonitoring) => {
let include = true;
const currentDomain = jobMonitoring?.metaData?.asrSpecificMetaData?.domain;
const currentProduct = jobMonitoring?.metaData?.asrSpecificMetaData?.productCategory;
Expand All @@ -237,7 +240,8 @@ function JobMonitoring() {
return include;
});

setFilteredJobMonitoring(filteredJobMonitorings);
setFilteredJobMonitoring(filteredJm);
setFilteringJobs(false);
}, [filters, jobMonitorings]);

// Function reset states when modal is closed
Expand Down Expand Up @@ -385,6 +389,7 @@ function JobMonitoring() {
allInputs = { ...allInputs, metaData };

const responseData = await createJobMonitoring({ inputData: allInputs });

setJobMonitorings([responseData, ...jobMonitorings]);
message.success('Job monitoring saved successfully');

Expand Down Expand Up @@ -648,6 +653,7 @@ function JobMonitoring() {
domains={domains}
productCategories={productCategories}
allProductCategories={allProductCategories}
filteringJobs={filteringJobs}
/>
<MonitoringDetailsModal
displayMonitoringDetailsModal={displayMonitoringDetailsModal}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const createJobMonitoring = async ({ inputData }) => {
const response = await fetch(`/api/jobmonitoring`, payload);

if (!response.ok) {
return message.error('Failed to save job monitoring');
throw new Error('Failed to save job monitoring');
}

const data = await response.json();
Expand Down Expand Up @@ -76,7 +76,7 @@ export const updateSelectedMonitoring = async ({ updatedData }) => {
const response = await fetch(`/api/jobmonitoring/`, payload);

if (!response.ok) {
return message.error('Failed to update job monitoring');
throw new Error('Failed to update job monitoring');
}

const data = await response.json();
Expand All @@ -94,15 +94,15 @@ export const handleDeleteJobMonitoring = async ({ id, jobMonitorings, setJobMoni
const response = await fetch(`/api/jobmonitoring/${id}`, payload);

if (!response.ok) {
return message.error('Failed to delete job monitoring');
throw new Error('Failed to delete job monitoring');
}

// Set job monitorings
const filteredJobMonitorings = jobMonitorings.filter((item) => item.id !== id);
setJobMonitorings(filteredJobMonitorings);
message.success('Job monitoring deleted successfully');
} catch (err) {
message.error(err.message);
throw new Error(err.message);
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,9 @@ function JobNamePattern() {

<h3>Invalid Job Name</h3>
<p>
If an invalid job name is provided, the system will handle it in the same way as an invalid host name. Please
see the Host field notes for details.
If an invalid job name or pattern is provided, Tombolo won&apos;t be able to monitor the job correctly. It may
search for a non-existent name or mistakenly monitor a wrong job that matches the pattern. Therefore, please
ensure the name or pattern you provide is correct.
</p>
</div>
);
Expand Down
6 changes: 3 additions & 3 deletions Tombolo/server/jobSchedularMethods/jobMonitoring.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ async function startJobMonitoring() {
let jobName = "job-monitoring" + new Date().getTime();
this.bree.add({
name: jobName,
//interval: "10s", // For development
// interval: "10s", // For development
interval: humanReadableIntervalForJobMonitoring,
path: path.join(
__dirname,
Expand Down Expand Up @@ -65,7 +65,7 @@ async function startIntermediateJobsMonitoring() {
let jobName = "intermediate-state-jobs-monitoring" + new Date().getTime();
this.bree.add({
name: jobName,
//interval: "20s", // For development
// interval: "20s", // For development
interval: humanReadableIntervalForIntermediateJobMonitoring,
path: path.join(
__dirname,
Expand Down Expand Up @@ -103,7 +103,7 @@ async function startJobPunctualityMonitoring() {
let jobName = "job-punctuality-monitoring" + new Date().getTime();
this.bree.add({
name: jobName,
//interval: "10s", // For development
// interval: "10s", // For development
interval: humanReadableIntervalForJobPunctualityMonitoring,
path: path.join(
__dirname,
Expand Down
Loading

0 comments on commit f19a197

Please sign in to comment.