diff --git a/config/config-schema.json b/config/config-schema.json index cdd2eda..165e5f9 100644 --- a/config/config-schema.json +++ b/config/config-schema.json @@ -4,7 +4,7 @@ "properties": { "lunchBreakDuration": { "type": "string", - "description": "Remove or set as \"00:00\" if you don't have an unpaid lunch break or if you normally log your lunch break hours" + "description": "Comment out or remove if you don't have an unpaid lunch break or if you normally log your lunch break hours" }, "language": { "type": "string", @@ -23,7 +23,8 @@ "stopTime": { "type": ["string", "null"], "description": "The time you stop working. Can either be 'now' or a time" - } + }, + "hadLunch": { "type": "boolean", "description": "Wether you had lunch already or not" } }, "additionalProperties": false, "description": "Default values for inputs" @@ -37,8 +38,7 @@ }, "startTime": { "type": "boolean", "description": "Disable prompt for start time if set to false" }, "stopTime": { "type": "boolean", "description": "Disable prompt for stop time if set to false" }, - "logged": { "type": "boolean", "description": "Disable prompt for logged time if set to false" }, - "hadLunch": { "type": "boolean", "description": "Assumed that you didn't have lunch if this is false" } + "logged": { "type": "boolean", "description": "Disable prompt for logged time if set to false" } }, "additionalProperties": false, "description": "Settings to disable prompts" diff --git a/config/config.toml b/config/config.toml index d2f6235..cc7ead1 100644 --- a/config/config.toml +++ b/config/config.toml @@ -8,9 +8,9 @@ # usually ~/.config/wtc/config.toml # For windows, I don't know. -# Remove or set as "00:00" if you don't have an unpaid lunch break +# Comment out or remove if you don't have an unpaid lunch break # or if you normally log your lunch break hours -lunchBreakDuration = "00:30" +unpaidLunchBreakDuration = "00:30" # The language of the application. # Currently supported languages are "en", "fi" diff --git a/src/config.ts b/src/config.ts index 1275c06..6055013 100644 --- a/src/config.ts +++ b/src/config.ts @@ -6,23 +6,25 @@ import { parseDuration, parseTimestamp } from './parse.js'; import WtcConfig from './types/WtcConfig.js'; import Language from './types/Language.js'; -interface RawConfig extends Omit { - lunchBreakDuration: string; +interface RawConfig extends Omit { + unpaidLunchBreakDuration: string; defaults: { workDayDuration: string; startTime: string; stopTime: string; + hadLunch: boolean; }; } const defaultConfig: RawConfig = { language: Language.en, timestampFormat: 'YYYY-MM-DD HH:mm', - lunchBreakDuration: '00:30', + unpaidLunchBreakDuration: '00:30', defaults: { workDayDuration: '07:30', startTime: '08:00', stopTime: 'now', + hadLunch: true, }, askInput: { workDayLength: true, @@ -46,13 +48,14 @@ const getConfig = (): WtcConfig => { return { language: configData.language ?? defaultConfig.language, timestampFormat: configData.timestampFormat ?? defaultConfig.timestampFormat, - lunchBreakDuration: parseDuration(configData.lunchBreakDuration), + unpaidLunchBreakDuration: !configData.unpaidLunchBreakDuration ? undefined : parseDuration(configData.unpaidLunchBreakDuration), defaults: { workDayDuration: parseDuration( configData.defaults.workDayDuration ?? defaultConfig.defaults.workDayDuration, ), startTime: parseTimestamp(configData.defaults.startTime ?? defaultConfig.defaults.startTime), stopTime: parseTimestamp(configData.defaults.stopTime ?? defaultConfig.defaults.stopTime), + hadLunch: configData.defaults.hadLunch ?? defaultConfig.defaults.hadLunch, }, askInput: { workDayLength: configData.askInput.workDayLength ?? defaultConfig.askInput.workDayLength, diff --git a/src/format.ts b/src/format.ts index 2f16062..38c6c69 100644 --- a/src/format.ts +++ b/src/format.ts @@ -7,7 +7,8 @@ export const formatTime = (time: Dayjs): string => time.format('HH:mm'); export const formatDuration = (language: Language) => - (duration: Duration, short?: boolean): string => { + (duration?: Duration, short?: boolean): string => { + duration = duration ?? dayjs.duration(0, 'minutes'); if (duration.hours() === 0 && duration.minutes() === 0) { return 'none'; } diff --git a/src/i18n.ts b/src/i18n.ts index 9339014..329206a 100644 --- a/src/i18n.ts +++ b/src/i18n.ts @@ -1,12 +1,16 @@ import Language from './types/Language'; + export enum MessageKey { promptWorkDayDuration, + excludingLunch, promptStartTime, promptStopTime, parseTimeFailed, startTimeBeforeStopTimeError, promptLunchBreak, + promptYesNoYes, + promptYesNoNo, unpaidLunch, promptLogged, none, @@ -24,8 +28,12 @@ export enum MessageKey { const messages: Record> = { [MessageKey.promptWorkDayDuration]: { - [Language.en]: 'How long is your work day today, excluding the lunch break? [{0}]: ', - [Language.fi]: 'Kuinka pitkä työpäiväsi on tänään, poisluettuna lounastauko? [{0}]: ', + [Language.en]: 'How long is your work day today{0}? [{1}]: ', + [Language.fi]: 'Kuinka pitkä työpäiväsi on tänään{0}? [{1}]: ', + }, + [MessageKey.excludingLunch]: { + [Language.en]: ', excluding the lunch break', + [Language.fi]: ', poisluettuna lounastauko', }, [MessageKey.promptStartTime]: { [Language.en]: 'What time did you start work today? [{0}]: ', @@ -44,12 +52,20 @@ const messages: Record> = { [Language.fi]: 'Aloitusaika ({0}) pitää olla ennen lopetusaikaa ({1}). Ohjelma sammuu', }, [MessageKey.promptLunchBreak]: { - [Language.en]: 'Did you have a lunch break? [y/N]: ', - [Language.fi]: 'Piditkö jo lounastauon? [k/E]: ', + [Language.en]: 'Did you have a lunch break? [{0}]: ', + [Language.fi]: 'Piditkö jo lounastauon? [{0}]: ', + }, + [MessageKey.promptYesNoYes]: { + [Language.en]: 'Y/n', + [Language.fi]: 'K/e', + }, + [MessageKey.promptYesNoNo]: { + [Language.en]: 'y/N', + [Language.fi]: 'k/E', }, [MessageKey.unpaidLunch]: { - [Language.en]: 'Unpaid lunch duration:', - [Language.fi]: 'Palkattoman lounaan pituus:', + [Language.en]: 'Unpaid lunch:', + [Language.fi]: 'Palkaton lounas:', }, [MessageKey.promptLogged]: { [Language.en]: 'How many hours did you log already? [00:00] ', diff --git a/src/input.ts b/src/input.ts index b7ffbf6..5a2303c 100644 --- a/src/input.ts +++ b/src/input.ts @@ -16,7 +16,7 @@ const { error } = console; const input = async (config: WtcConfig): Promise => { const msg = message(config.language); const fmtDuration = formatDuration(config.language); - const { defaults, askInput, lunchBreakDuration } = config; + const { defaults, askInput, unpaidLunchBreakDuration: lunchBreakDuration } = config; const rl = readline.createInterface({ input: process.stdin, output: process.stdout, @@ -32,7 +32,11 @@ const input = async (config: WtcConfig): Promise => { if (askInput.workDayLength) { const durationAnswer = await rl.question( - msg(MessageKey.promptWorkDayDuration, fmtDuration(defaults.workDayDuration, true)), + msg( + MessageKey.promptWorkDayDuration, + config.unpaidLunchBreakDuration ? msg(MessageKey.excludingLunch) : '', + fmtDuration(defaults.workDayDuration, true), + ), ); if (durationAnswer !== '') { workDayDuration = parseDuration(durationAnswer); @@ -92,10 +96,21 @@ const input = async (config: WtcConfig): Promise => { let hadLunch = false; if (lunchBreakDuration) { - const lunchAnswer = (await rl.question(msg(MessageKey.promptLunchBreak))).toLowerCase(); + const lunchAnswer = ( + await rl.question( + msg( + MessageKey.promptLunchBreak, + msg(config.defaults.hadLunch ? MessageKey.promptYesNoYes : MessageKey.promptYesNoNo), + ), + ) + ).toLowerCase(); - if (lunchAnswer === 'y' || lunchAnswer === 'k') { - hadLunch = true + if ( + lunchAnswer === 'y' || + lunchAnswer === 'k' || + (config.defaults.hadLunch && lunchAnswer !== 'n' && lunchAnswer !== 'e') + ) { + hadLunch = true; worked = worked.subtract(lunchBreakDuration); } } diff --git a/src/output.ts b/src/output.ts index 8329fd4..49eaa33 100644 --- a/src/output.ts +++ b/src/output.ts @@ -23,7 +23,7 @@ const output = (result: WtcPromptResult, config: WtcConfig) => { log(msg(MessageKey.workedToday), chalk.green(fmtDuration(worked)), chalk.yellow(hoursRounded(worked))); if (hadLunch) { - log(msg(MessageKey.unpaidLunch), chalk.green(fmtDuration(config.defaults.lunchBreakDuration))); + log(msg(MessageKey.unpaidLunch), chalk.green(fmtDuration(config.unpaidLunchBreakDuration))); } const unLoggedMinutes = unLogged.asMinutes(); diff --git a/src/types/WtcConfig.ts b/src/types/WtcConfig.ts index 5add086..c0b9c62 100644 --- a/src/types/WtcConfig.ts +++ b/src/types/WtcConfig.ts @@ -5,11 +5,12 @@ import Language from './Language.js'; export default interface WtcConfig { language: Language, timestampFormat: string, - lunchBreakDuration?: Duration; + unpaidLunchBreakDuration?: Duration; defaults: { workDayDuration: Duration; startTime: Dayjs; stopTime: Dayjs; + hadLunch: boolean; }; askInput: { workDayLength: boolean;