hr_lite 0.21.1 → 0.21.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/app/assets/stylesheets/hr_lite/hr_lite.css +12 -10
- data/app/models/hr_lite/leave_request.rb +2 -0
- data/app/views/hr_lite/appraisals/show.html.erb +2 -2
- data/app/views/hr_lite/attendance/_month_grid.html.erb +1 -1
- data/lib/hr_lite/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1a2ff1c82bd28a7f542134062771f3429fa3f2d9883b56fef9ca7e4b3443d12b
|
|
4
|
+
data.tar.gz: 0a6c75ff2b12cfd705015f30126f4a3352614323fe16beb31ec2604a65d44d86
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9d38f6d0deaebc0e0d8f9b66d2c439280c7fa667ae6e2a800c1c6805007fdba2f8edd742d69103d468492ee3778a0644a60a7f2e0d9d675ea51db9368ff55d2c
|
|
7
|
+
data.tar.gz: 6c7f7c9c4f1316f6de85af950622579a9c23749a52a9a391a2f02ea775cffebfa813d37b6bd1f882d4eac1f96a326f78971d5c743a6fa010cdbfc98bb27da286
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.21.3] - 2026-10-09
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- Phones: My attendance, the team calendar and an employee's attendance in admin no longer run wider than the screen once a month has punches; Sa/Su are back and check-in/check-out stack in each day.
|
|
14
|
+
- Phones: a long name or an email as the display name in the top bar no longer widens every screen and pushes the tab bar off.
|
|
15
|
+
- Phones: long links, file names and emails in policies, HR requests, appraisals, flashes and stacked tables (audit trail, approvals, team board, request lists) wrap instead of widening the page or hiding values.
|
|
16
|
+
- Admin employee profile with a salary card fits a phone; payroll and overview tiles go 2×2 below 1100px so amounts stay on one line beside the side rail.
|
|
17
|
+
|
|
18
|
+
## [0.21.2] - 2026-10-07
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
- HR recording leave for an employee on probation is no longer refused by the 1-day-a-month cap; the cap still applies when the employee applies themselves.
|
|
22
|
+
|
|
10
23
|
## [0.21.1] - 2026-10-07
|
|
11
24
|
|
|
12
25
|
### Fixed
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
}
|
|
66
66
|
.hrl-appbar__brand { font-weight: 700; font-size: 1.02rem; color: var(--hrl-ink); display: inline-flex; align-items: center; }
|
|
67
67
|
.hrl-appbar__logo { height: 28px; width: auto; display: block; }
|
|
68
|
-
.hrl-appbar__user { margin-left: auto; color: var(--hrl-muted); font-size: .82rem; white-space: nowrap; }
|
|
68
|
+
.hrl-appbar__user { margin-left: auto; color: var(--hrl-muted); font-size: .82rem; white-space: nowrap; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
69
69
|
|
|
70
70
|
/* Bottom tab bar (phone) */
|
|
71
71
|
.hrl-tabbar {
|
|
@@ -135,13 +135,13 @@
|
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
/* Flash */
|
|
138
|
-
.hrl-flash { padding: .7rem .9rem; border-radius: var(--hrl-radius-sm); margin-bottom: .85rem; font-size: .9rem; }
|
|
138
|
+
.hrl-flash { padding: .7rem .9rem; border-radius: var(--hrl-radius-sm); margin-bottom: .85rem; font-size: .9rem; overflow-wrap: anywhere; }
|
|
139
139
|
.hrl-flash--ok { background: var(--hrl-ok-bg); color: var(--hrl-ok); }
|
|
140
140
|
.hrl-flash--warn { background: var(--hrl-warn-bg); color: var(--hrl-warn); }
|
|
141
141
|
|
|
142
142
|
/* Page scaffold */
|
|
143
143
|
.hrl-page__head { display: flex; flex-wrap: wrap; align-items: center; gap: .6rem; margin: .25rem 0 .9rem; }
|
|
144
|
-
.hrl-page__title { font-size: 1.25rem; font-weight: 700; margin: 0; }
|
|
144
|
+
.hrl-page__title { font-size: 1.25rem; font-weight: 700; margin: 0; overflow-wrap: anywhere; }
|
|
145
145
|
.hrl-page__sub { color: var(--hrl-muted); font-size: .86rem; margin: .15rem 0 0; width: 100%; }
|
|
146
146
|
.hrl-page__actions { margin-left: auto; display: flex; flex-wrap: wrap; gap: .5rem; }
|
|
147
147
|
|
|
@@ -154,13 +154,14 @@
|
|
|
154
154
|
.hrl-card__title { font-weight: 650; font-size: .95rem; margin: 0 0 .6rem; }
|
|
155
155
|
.hrl-card--empty { text-align: center; color: var(--hrl-muted); padding: 1.8rem 1rem; }
|
|
156
156
|
.hrl-grid { display: grid; gap: .85rem; grid-template-columns: 1fr; }
|
|
157
|
+
.hrl-grid > * { min-width: 0; }
|
|
157
158
|
@media (min-width: 700px) { .hrl-grid--2 { grid-template-columns: 1fr 1fr; } }
|
|
158
159
|
|
|
159
160
|
/* KPI tiles */
|
|
160
|
-
.hrl-kpis { display: grid; grid-template-columns: repeat(2, 1fr); gap: .6rem; margin-bottom: .85rem; }
|
|
161
|
-
@media (min-width:
|
|
161
|
+
.hrl-kpis { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .6rem; margin-bottom: .85rem; }
|
|
162
|
+
@media (min-width: 1100px) { .hrl-kpis { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
|
|
162
163
|
.hrl-kpi { background: var(--hrl-card); border: 1px solid var(--hrl-line); border-radius: var(--hrl-radius); padding: .7rem .8rem; }
|
|
163
|
-
.hrl-kpi__value { font-size: 1.35rem; font-weight: 700; }
|
|
164
|
+
.hrl-kpi__value { font-size: 1.35rem; font-weight: 700; overflow-wrap: anywhere; }
|
|
164
165
|
.hrl-kpi__label { color: var(--hrl-muted); font-size: .78rem; }
|
|
165
166
|
|
|
166
167
|
/* Buttons */
|
|
@@ -199,7 +200,7 @@
|
|
|
199
200
|
@media (max-width: 640px) {
|
|
200
201
|
.hrl-table--stack thead { display: none; }
|
|
201
202
|
.hrl-table--stack tr { display: block; border-bottom: 6px solid var(--hrl-bg); }
|
|
202
|
-
.hrl-table--stack td { display: flex; justify-content: space-between; gap: .8rem; border-bottom: 1px dashed var(--hrl-line); }
|
|
203
|
+
.hrl-table--stack td { display: flex; flex-wrap: wrap; justify-content: space-between; gap: .8rem; border-bottom: 1px dashed var(--hrl-line); overflow-wrap: anywhere; }
|
|
203
204
|
.hrl-table--stack td::before { content: attr(data-label); color: var(--hrl-muted); font-size: .78rem; }
|
|
204
205
|
.hrl-table--stack td.hrl-num { text-align: left; }
|
|
205
206
|
.hrl-table--stack td.hrl-cell--void { display: none; }
|
|
@@ -294,11 +295,12 @@
|
|
|
294
295
|
.hrl-deflist dd { margin: 0; overflow-wrap: anywhere; }
|
|
295
296
|
|
|
296
297
|
/* Month grid (attendance) */
|
|
297
|
-
|
|
298
|
+
/* minmax(0, …): a bare 1fr never shrinks below its nowrap tags and pushes Sa/Su off a phone */
|
|
299
|
+
.hrl-mgrid { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 3px; }
|
|
298
300
|
.hrl-mgrid__head { text-align: center; color: var(--hrl-muted); font-size: .68rem; padding: .2rem 0; }
|
|
299
301
|
.hrl-mgrid__day {
|
|
300
302
|
min-height: 44px; border-radius: 7px; background: var(--hrl-card);
|
|
301
|
-
border: 1px solid var(--hrl-line); padding: .2rem
|
|
303
|
+
border: 1px solid var(--hrl-line); padding: .2rem; font-size: .72rem;
|
|
302
304
|
display: flex; flex-direction: column; gap: .1rem; position: relative;
|
|
303
305
|
}
|
|
304
306
|
.hrl-mgrid__day--muted { opacity: .45; }
|
|
@@ -322,7 +324,7 @@
|
|
|
322
324
|
|
|
323
325
|
/* Long-form policy text. Constrained measure — a policy read across the
|
|
324
326
|
full width of a laptop is a policy nobody finishes. */
|
|
325
|
-
.hrl-prose { max-width: 68ch; }
|
|
327
|
+
.hrl-prose { max-width: 68ch; overflow-wrap: anywhere; }
|
|
326
328
|
.hrl-prose p { margin: 0 0 .8rem; line-height: 1.6; }
|
|
327
329
|
.hrl-prose p:last-child { margin-bottom: 0; }
|
|
328
330
|
|
|
@@ -333,8 +333,10 @@ module HrLite
|
|
|
333
333
|
end
|
|
334
334
|
|
|
335
335
|
# Probation: at most one day of leave (any type) in a calendar month.
|
|
336
|
+
# Caps self-service only; HR recording leave is already the approval.
|
|
336
337
|
def within_probation_cap
|
|
337
338
|
return unless start_date && days_count
|
|
339
|
+
return if recorded_by_hr?
|
|
338
340
|
return unless EmployeeProfile.find_by(user_id: user_id)&.on_probation?(start_date)
|
|
339
341
|
|
|
340
342
|
taken = self.class.where(user_id: user_id, status: %w[pending approved])
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
<% if @appraisal.strengths.present? %>
|
|
21
21
|
<section class="hrl-card">
|
|
22
22
|
<h2 class="hrl-card__title">Strengths</h2>
|
|
23
|
-
<
|
|
23
|
+
<div class="hrl-prose"><%= simple_format(@appraisal.strengths) %></div>
|
|
24
24
|
</section>
|
|
25
25
|
<% end %>
|
|
26
26
|
|
|
27
27
|
<% if @appraisal.improvements.present? %>
|
|
28
28
|
<section class="hrl-card">
|
|
29
29
|
<h2 class="hrl-card__title">Areas to grow</h2>
|
|
30
|
-
<
|
|
30
|
+
<div class="hrl-prose"><%= simple_format(@appraisal.improvements) %></div>
|
|
31
31
|
</section>
|
|
32
32
|
<% end %>
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
<% end %>
|
|
28
28
|
</span>
|
|
29
29
|
<% if day.record&.check_in_at %>
|
|
30
|
-
<span class="hrl-mgrid__tag"><%= day.record.check_in_at.strftime("%H:%M")
|
|
30
|
+
<span class="hrl-mgrid__tag"><%= day.record.check_in_at.strftime("%H:%M") %><% if day.record.check_out_at %><br><%= day.record.check_out_at.strftime("%H:%M") %><% end %></span>
|
|
31
31
|
<% elsif day.kind == :absent %>
|
|
32
32
|
<span class="hrl-mgrid__tag">absent</span>
|
|
33
33
|
<% end %>
|
data/lib/hr_lite/version.rb
CHANGED