The Daily view is the primary data-entry surface in Shiftly. For a selected year and month it fetches the Hebrew calendar from the Hebcal API, generates one row per calendar day, and lets you record shift start/end times. Every time you save a shift the app recalculates that day’s pay breakdown and incrementally updates the running monthly total — no full recompute needed.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/dmaman86/shiftly/llms.txt
Use this file to discover all available pages before exploring further.
A base hourly rate must be entered in the Configuration panel before any monetary (₪) values appear in either the daily or monthly salary columns. Without a rate, the table still shows hours.
Work Table Layout
The work table renders every day of the selected month. Days are grouped into weekly bands separated by a bold bottom border on each Saturday (Shabbat). The table header adapts to the active display mode. Each row contains the following fixed left-hand columns, regardless of display mode:| Column | Width | Description |
|---|---|---|
| Day | 80 px | Weekday abbreviation + day-of-month number. Holiday/special-day chips (e.g. “Passover”, “Yom Kippur”) are shown inside this cell. |
| Sick | 48 px | Checkbox — marks the day as a sick day (WorkDayStatus.sick). Hidden on Shabbat / full-holiday days. |
| Vacation | 48 px | Checkbox — marks the day as a vacation day (WorkDayStatus.vacation). Hidden on Shabbat / full-holiday days. |
| Add shift (➕) | 48 px | Icon button that appends a new shift row for this day. Disabled when the day is marked sick or vacation. |
| In | 96 px | Shift start time picker (or read-only display when saved). |
| Out | 96 px | Shift end time picker (or read-only display when saved). |
| Controls | 120 px | Cross-day checkbox, duty toggle (🚗), save (💾) / edit (✏️), and delete (🗑️) buttons. |
How to Add a Shift
Select year and month
Use the Configuration panel at the top of the Daily page to choose the correct year and month. The table regenerates with fresh calendar data from the Hebcal API.
Locate the day
Scroll to the date you want to enter. Each row shows the abbreviated weekday name and day number (e.g.
Mo-14). Holiday chips appear on special days.Click ➕ to add a shift
Press the add-shift icon button in the fourth column. A new
ShiftRow is inserted with start and end time pickers initialised to midnight of that day.Set start and end times
Click the In time picker and choose the shift start. Click the Out time picker and choose the shift end. If the end time falls on the next calendar day, check the cross-day checkbox (see Cross-Day Shifts).
Toggle duty shift (optional)
Click the 🚗 car icon to mark the shift as a duty shift. Duty status affects meal-allowance eligibility in per-diem calculations.
Save the shift
Click 💾 Save. The shift time inputs switch to read-only display and the pay breakdown columns update immediately. The monthly totals in the footer also refresh.
Display Modes
The work table supports two display modes, toggled with the Full view switch in the table header. On mobile devices the table defaults to Compact mode; on desktop it defaults to Expanded mode.Compact Mode
Compact mode shows a condensed view with three or four columns after the fixed left-hand columns:| Column | Description |
|---|---|
| Total Hours | Sum of all hours worked that day. |
| Regular Hours | Hours at 100% rate (up to the standard daily threshold). |
| Extra Hours | Overtime hours above the standard daily threshold. |
| Daily Salary (optional) | Gross pay for the day in ₪. Only shown when baseRate > 0. |
Expanded Mode
Expanded mode shows a full breakdown across all pay categories:| Column Group | Column | Description |
|---|---|---|
| Regular (שע״נ) | 100% | Regular hours at standard rate. |
| 125% | First 2 overtime hours (next tier above standard). | |
| 150% | Further overtime hours beyond the 125% tier. | |
| Shabbat (שבת) | 150% | Shabbat/holiday hours between 06:00–22:00. |
| 200% | Shabbat/holiday hours between 22:00–06:00. | |
| Extras (תוספות) | Shabbat Eve | Shabbat-eve bonus 100% hours (extra100Shabbat). |
| 20% | Evening bonus hours (14:00–22:00). | |
| 50% | Night bonus hours (22:00–06:00). | |
| Absence (היעדרות) | Sick | Hours credited as sick-day pay. |
| Vacation | Hours credited as vacation-day pay. | |
| Per Diem (אש״ל) | Points | Per-diem allowance points accrued for the day. |
| Meal Allowance (כלכלה) | Large | Large meal-allowance points. |
| Small | Small meal-allowance points (shift C). | |
| Daily Salary | ₪ | Computed gross pay. Only shown when baseRate > 0. |
Cross-Day Shifts
When a shift’s end time is typed or selected as earlier than its start time on the same calendar date, the cross-day checkbox in the Controls column begins blinking in amber and displays a warning tooltip. This indicates the system has detected a likely midnight-crossing shift.- Check the cross-day box to confirm the end time belongs to the following calendar day. The system marks
end.dateone day ahead and recalculates accordingly. - Do not check it if the time entry was simply a mistake — correct the end time instead.
- Attempting to save a shift where end ≤ start without the cross-day box checked triggers a snackbar warning: “A shift crossing midnight was detected. Please check ‘cross day’ before saving.”
Sick and Vacation Days
Marking a day as sick (WorkDayStatus.sick) or vacation (WorkDayStatus.vacation) has the following effects:
- The sick and vacation checkboxes are mutually exclusive — checking one clears the other and resets shift entries for that day.
- All shift input controls (add, edit, save) are disabled for the day;
isEditableisfalsewheneverstatus !== WorkDayStatus.normal. - The pay breakdown columns display the standard daily hours as
hours100Sickorhours100Vacationin the expanded view.
WorkDayType.SpecialFull) cannot be marked sick or vacation. The checkboxes are hidden via display: specialFullDay ? "none" : "inline-flex".
Day Types
EveryWorkDayInfo carries a meta.typeDay value from the WorkDayType enum that drives which calculation path is used:
| Enum Value | Description |
|---|---|
WorkDayType.Regular | An ordinary weekday or non-special Saturday. Uses standard regular + overtime rates. |
WorkDayType.SpecialPartialStart | A Friday or holiday eve. Regular rates apply until 17:00 (winter) / 18:00 (summer DST), then Shabbat rates (150%/200%) kick in. |
WorkDayType.SpecialFull | A full Shabbat or Jewish public holiday. Shabbat rates apply from the start; sick/vacation checkboxes are hidden. |
Incremental Recalculation
Shiftly does not recompute the entire month on every keystroke. Instead the Redux store maintains adailyPayMaps dictionary keyed by ISO date string. When a saved shift changes:
- The previous
WorkDayMapfor that date is subtracted fromglobalBreakdownviaMonthPayMapReducer.subtract(). - The newly computed
WorkDayMapis accumulated intoglobalBreakdownviaMonthPayMapReducer.accumulate(). - The updated
WorkDayMapis stored back intodailyPayMaps[dateKey].
totalHours drops to zero (e.g. after deleting all shifts), removeDayPayMap is dispatched instead, cleanly removing the entry from the running total.
Monthly View
See the aggregated monthly salary summary with per-diem and meal-allowance amounts resolved at historical rates.
Configuration
Set the year, month, standard hours, and hourly base rate that power all calculations.