Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added option to prefill break time #591

Merged
merged 5 commits into from
Dec 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion __tests__/__main__/time-math.js
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,9 @@ describe('Time Math Functions', () =>
expect(validateTime('00:11')).toBeTruthy();
expect(validateTime('01:11')).toBeTruthy();
expect(validateTime('11:11')).toBeTruthy();
expect(validateTime('24:00')).toBeTruthy();
expect(validateTime('23:59')).toBeTruthy();
expect(validateTime('-04:00')).toBeTruthy();
expect(validateTime('24:00')).not.toBeTruthy();
expect(validateTime('34:00')).not.toBeTruthy();
expect(validateTime('4:00')).not.toBeTruthy();
expect(validateTime('00:1')).not.toBeTruthy();
Expand Down
26 changes: 19 additions & 7 deletions __tests__/__renderer__/user-preferences.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const {
getUserPreferences,
savePreferences,
isNotBoolean,
isValidPreferenceTime,
isNotificationInterval,
} = require('../../js/user-preferences');
const fs = require('fs');

Expand All @@ -23,19 +23,31 @@ describe('Should return false if the value is not boolean type', () =>
});
});

describe('Should return true if the value is a valid time', () =>
describe('Should return true if the value is a valid notification interval', () =>
{
test('Value as time format (hh:mm)', () =>
test('Value as number (val >= 1 || val <= 30)', () =>
{
expect(isValidPreferenceTime('00:35')).toBe(true);
expect(isNotificationInterval(1)).toBe(true);
expect(isNotificationInterval(15)).toBe(true);
expect(isNotificationInterval(30)).toBe(true);
expect(isNotificationInterval(-5)).not.toBe(true);
expect(isNotificationInterval(0)).not.toBe(true);
expect(isNotificationInterval(31)).not.toBe(true);
expect(isNotificationInterval(60)).not.toBe(true);
});
test('Value as number type (val < 1 || val > 30)', () =>
test('Value as string (val >= 1 || val <= 30)', () =>
{
expect(isValidPreferenceTime(60)).toBe(true);
expect(isNotificationInterval('1')).toBe(true);
expect(isNotificationInterval('30')).toBe(true);
expect(isNotificationInterval('-5')).not.toBe(true);
expect(isNotificationInterval('31')).not.toBe(true);
expect(isNotificationInterval('A')).not.toBe(true);
expect(isNotificationInterval('abc')).not.toBe(true);
});
test('Value as boolean type', () =>
{
expect(isValidPreferenceTime(true)).toBe(false);
expect(isNotificationInterval(true)).not.toBe(true);
expect(isNotificationInterval(false)).not.toBe(true);
});
});

Expand Down
3 changes: 2 additions & 1 deletion css/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,7 @@ input:checked + .slider::before {
/* Notification settings */

#notifications-interval:disabled,
#break-time-interval:disabled,
input:disabled + .slider {
background-color: var(--disabled-input-bground);
}
Expand Down Expand Up @@ -659,7 +660,7 @@ input:disabled + .slider {
left: 25px;
}

#preferences-window #hours-per-day {
#preferences-window #hours-per-day, #break-time-interval {
text-align: right;
}

Expand Down
64 changes: 61 additions & 3 deletions js/classes/BaseCalendar.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class BaseCalendar
/**
* Returns a date object for which the all time balance will be calculated.
* If current month, returns the actual day. If not, first day of following month.
* // deepcode ignore valid-jsdoc: <not yet implemented>
* @return {Date}
*/
_getTargetDayForAllTimeBalance()
Expand Down Expand Up @@ -274,6 +275,24 @@ class BaseCalendar
return this._preferences['hide-non-working-days'];
}

/**
* Returns if "enable prefill break time" was set in preferences
* @return {Boolean}
*/
_getEnablePrefillBreakTime()
{
return this._preferences['enable-prefill-break-time'];
}

/**
* Returns "break time interval" set in preferences
* @return {string}
*/
_getBreakTimeInterval()
{
return this._preferences['break-time-interval'];
}

/**
* Returns if "count today" was set in preferences.
* @return {Boolean}
Expand Down Expand Up @@ -388,6 +407,20 @@ class BaseCalendar
this._togglePunchButton(enableButton);
}

/**
* Calculates time for break end based on break interval
* @param {string} breakBegin
* @return {string}
*/
_calculateBreakEnd(breakBegin)
{
let breakInterval = this._getBreakTimeInterval();
let breakEnd = sumTime(breakBegin, breakInterval);

breakEnd = validateTime(breakEnd) ? breakEnd : '23:59';
return breakEnd;
}

/**
* Adds the next missing entry on the actual day and updates calendar.
*/
Expand All @@ -410,17 +443,42 @@ class BaseCalendar
const value = hourMinToHourFormatted(hour, min);
const key = generateKey(year, month, day);
const inputs = $('#' + key + ' input[type="time"]');
for (const element of inputs)

for (let i = 0; i < inputs.length; i++)
{
if ($(element).val().length === 0)
if ($(inputs[i]).val().length === 0)
{
$(element).val(value);
$(inputs[i]).val(value);

//Prefill break time
if (this._prefillEntryIndex(i, inputs))
{
const breakEnd = this._calculateBreakEnd(value);
$(inputs[i + 1]).val(breakEnd);
}
this._updateTimeDayCallback(key);
break;
}
}
}

/**
* Returns true if next entry should be prefilled based on break interval
* @param {number} idx
* @param {array} inputs
* @return {Boolean}
*/
_prefillEntryIndex(idx, inputs)
{
if (this._getEnablePrefillBreakTime() &&
idx !== inputs.length - 1 &&
idx % 2 === 1)
{
return true;
}
return false;
}

/**
* Based on the key of the input, updates the values for total in DB and display it on page.
* @param {string} key
Expand Down
2 changes: 1 addition & 1 deletion js/time-math.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ function sumTime(t1, t2)
*/
function validateTime(time)
{
let re = new RegExp('[0-2][0-9]:[0-5][0-9]');
let re = new RegExp('^-?(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$');
return re.test(time);
}

Expand Down
18 changes: 13 additions & 5 deletions js/user-preferences.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ const defaultPreferences = {
'minimize-to-tray': true,
'hide-non-working-days': false,
'hours-per-day': '08:00',
'enable-prefill-break-time': false,
'break-time-interval': '00:30',
'notification': true,
'repetition': true,
'notifications-interval': '5',
Expand All @@ -42,6 +44,7 @@ const booleanInputs = [
'close-to-tray',
'minimize-to-tray',
'hide-non-working-days',
'enable-prefill-break-time',
'notification',
'repetition',
'start-at-login',
Expand All @@ -57,10 +60,11 @@ const booleanInputs = [
const timeInputs = [
'notifications-interval',
'hours-per-day',
'break-time-interval',
];

const isNotBoolean = (val) => typeof val !== 'boolean';
const isValidPreferenceTime = (val) => validateTime(val) || Number.isNaN(Number(val)) || val < 1 || val > 30;
const isNotificationInterval = (val) => !Number.isNaN(Number(val)) && isNotBoolean(val) && val >= 1 && val <= 30;

/*
* Returns the preference file path, considering the userData path
Expand Down Expand Up @@ -151,10 +155,14 @@ function initPreferencesFileIfNotExistsOrInvalid()
shouldSaveDerivedPrefs = true;
}

if (timeInputs.includes(key) && isValidPreferenceTime(value))
if (timeInputs.includes(key))
{
derivedPrefs[key] = defaultPreferences[key];
shouldSaveDerivedPrefs = true;
// Set default preference value if notification or time interval is not valid
if ((key === 'notifications-interval' && !isNotificationInterval(value)) || !validateTime(value))
{
derivedPrefs[key] = defaultPreferences[key];
shouldSaveDerivedPrefs = true;
}
}

const inputEnum = {
Expand Down Expand Up @@ -290,7 +298,7 @@ module.exports = {
showDay,
switchCalendarView,
isNotBoolean,
isValidPreferenceTime,
isNotificationInterval,
notificationIsEnabled,
repetitionIsEnabled
};
2 changes: 2 additions & 0 deletions locales/ca-CA/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Ocultar els dies no laborables (Vista mensual)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Hores per dia",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Llenguatge",
"light": "Clar",
"minimizeToTray": "El botó de minimitzar hauria de minimitzar a la safata",
Expand Down
2 changes: 2 additions & 0 deletions locales/de-DE/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Arbeitsfreie Tage ausblenden (Monatsansicht)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Stunden pro Tag",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Sprache",
"light": "Hell",
"minimizeToTray": "Minimieren Button minimiert Fenster in den Tray",
Expand Down
2 changes: 2 additions & 0 deletions locales/dev/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Ocultar dias não úteis (Visão de mês)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Horas por dia",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Idioma",
"light": "Claro",
"minimizeToTray": "Clicá no tracin isconde",
Expand Down
2 changes: 2 additions & 0 deletions locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Hide non-working days (Month View)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Hours per day",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Language",
"light": "Light",
"minimizeToTray": "Minimize button should minimize to tray",
Expand Down
2 changes: 2 additions & 0 deletions locales/es/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Ocultar los días no laborables (Vista por mes)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Horas por día",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Languaje",
"light": "Claro",
"minimizeToTray": "El botón de minimizar debería minimizar a la bandeja",
Expand Down
2 changes: 2 additions & 0 deletions locales/fr-FR/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Masquer les jours non ouvrés (Vue Mois)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Heures par jour",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Langue",
"light": "Clair",
"minimizeToTray": "Le bouton Réduire doit être réduit dans le bac",
Expand Down
2 changes: 2 additions & 0 deletions locales/hi/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "गैर-कार्य दिवस (माह दृश्य) छुपाएं",
"hours-per-day": "HH:mm",
"hoursPerDay": "प्रति दिन घंटे",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "भाषा: हिन्दी",
"light": "रोशनी",
"minimizeToTray": "बटन को कम से कम ट्रे में रखना चाहिए",
Expand Down
2 changes: 2 additions & 0 deletions locales/id/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Sembunyikan hari Bukan-kerja (Tampilan Bulan)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Jam per-hari",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Bahasa",
"light": "Terang",
"minimizeToTray": "Tombol Minimalkan harus meminimalkan tray",
Expand Down
2 changes: 2 additions & 0 deletions locales/it/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Nascondi giorni festivi (visuale Mese)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Ore al giorno",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Linguaggio",
"light": "Chiaro",
"minimizeToTray": "Il pulsante di riduzione a icona deve ridurre a icona nella tray",
Expand Down
2 changes: 2 additions & 0 deletions locales/ko/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "휴일 숨기기 (월별 보기에 적용)",
"hours-per-day": "HH:mm",
"hoursPerDay": "하루 작업 목표 시간",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "언어",
"light": "밝음",
"minimizeToTray": "최소화 시 시스템 트레이로 이동",
Expand Down
2 changes: 2 additions & 0 deletions locales/mr/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "नॉन-कामकाजाचे दिवस लपवा (महिना दृश्य)",
"hours-per-day": "HH:mm",
"hoursPerDay": "दिवसाचे तास",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "भाषा",
"light": "प्रकाश",
"minimizeToTray": "ट्रेमध्ये मिनिमाइझ बटण कमीतकमी केले पाहिजे",
Expand Down
2 changes: 2 additions & 0 deletions locales/nl/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Niet-werkdagen verbergen (Maandoverzicht)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Aantal uur per dag",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Taal",
"light": "Licht",
"minimizeToTray": "Minimaliseerknop moet minimaliseren",
Expand Down
2 changes: 2 additions & 0 deletions locales/pl/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Ukryj dni wolne (Widok Miesiąca)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Ilość godzin pracy dzienie",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Język (Language)",
"light": "Jasny",
"minimizeToTray": "Prznieś do obszaru powiadomień przyciskiem minimalizacji",
Expand Down
2 changes: 2 additions & 0 deletions locales/pt-BR/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "Ocultar dias não úteis (Visão de mês)",
"hours-per-day": "HH:mm",
"hoursPerDay": "Horas por dia",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "Idioma",
"light": "Claro",
"minimizeToTray": "Botão de minimizar deve minimizar para o Tray",
Expand Down
2 changes: 2 additions & 0 deletions locales/th-TH/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "ซ่อนวันหยุด (มุมมองรายเดือน)",
"hours-per-day": "ชช:นน",
"hoursPerDay": "จำนวนชั่วโมงทำงานต่อวัน",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "ภาษา",
"light": "สว่าง",
"minimizeToTray": "ปุ่มย่อจะย่อไปยังถาด",
Expand Down
2 changes: 2 additions & 0 deletions locales/zh-TW/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,8 @@
"hideNonWorkingDay": "隱藏非工作日(月份視角)",
"hours-per-day": "HH:mm",
"hoursPerDay": "小時每日",
"enablePrefillBreakTime": "Enable prefilling of break time",
"breakTimeInterval": "Break time interval",
"language": "語言",
"light": "淺色",
"minimizeToTray": "當按下最小化按鈕時將程式最小化到任務欄",
Expand Down
Loading