diff --git a/groups/Tapops/css/documents.css b/groups/Tapops/css/documents.css
index 0b6e850..61bf593 100644
--- a/groups/Tapops/css/documents.css
+++ b/groups/Tapops/css/documents.css
@@ -365,6 +365,7 @@
/* Custom dd/mm/yyyy date input */
.custom-date-input {
+ position: relative;
display: flex;
align-items: center;
gap: 1px;
@@ -376,7 +377,8 @@
font-weight: 700;
color: #94a3b8;
user-select: none;
- padding: 0 1px;
+ padding: 0 2px;
+ flex-shrink: 0;
}
.date-part {
@@ -387,14 +389,14 @@
font-weight: 700;
color: var(--primary-blue);
text-align: center;
- padding: 2px 3px;
+ padding: 2px 4px;
border-radius: 3px;
transition: background 0.15s ease;
min-width: 0;
}
-.date-dd, .date-mm { width: 2.2ch; }
-.date-yyyy { width: 4.2ch; }
+.date-dd, .date-mm { width: 34px; }
+.date-yyyy { width: 56px; }
.date-part::placeholder {
color: #94a3b8;
@@ -406,6 +408,35 @@
background: rgba(0, 49, 80, 0.07);
}
+.date-calendar-btn {
+ background: none;
+ border: none;
+ cursor: pointer;
+ color: #94a3b8;
+ padding: 4px 2px 4px 6px;
+ display: flex;
+ align-items: center;
+ font-size: 0.9rem;
+ flex-shrink: 0;
+ transition: color 0.2s ease;
+}
+
+.date-calendar-btn:hover {
+ color: var(--primary-blue);
+}
+
+.date-hidden-picker {
+ position: absolute;
+ opacity: 0;
+ pointer-events: none;
+ width: 1px;
+ height: 1px;
+ border: none;
+ padding: 0;
+ margin: 0;
+ overflow: hidden;
+}
+
.range-divider {
font-size: 0.7rem;
font-weight: 800;
diff --git a/groups/Tapops/index.html b/groups/Tapops/index.html
index 898939f..23ca707 100644
--- a/groups/Tapops/index.html
+++ b/groups/Tapops/index.html
@@ -952,6 +952,10 @@
/
+
+
s/d
@@ -960,6 +964,10 @@
/
+
+
diff --git a/groups/Tapops/js/main.js b/groups/Tapops/js/main.js
index 1633c26..9d81bf3 100644
--- a/groups/Tapops/js/main.js
+++ b/groups/Tapops/js/main.js
@@ -430,14 +430,18 @@ class DocumentRepository {
this.statUpdatesEl = document.getElementById('stat-updates-value');
this.dateStartParts = {
- dd: document.getElementById('date-start-dd'),
- mm: document.getElementById('date-start-mm'),
- yyyy: document.getElementById('date-start-yyyy'),
+ dd: document.getElementById('date-start-dd'),
+ mm: document.getElementById('date-start-mm'),
+ yyyy: document.getElementById('date-start-yyyy'),
+ picker: document.getElementById('date-start-picker'),
+ calBtn: document.getElementById('date-start-cal-btn'),
};
this.dateEndParts = {
- dd: document.getElementById('date-end-dd'),
- mm: document.getElementById('date-end-mm'),
- yyyy: document.getElementById('date-end-yyyy'),
+ dd: document.getElementById('date-end-dd'),
+ mm: document.getElementById('date-end-mm'),
+ yyyy: document.getElementById('date-end-yyyy'),
+ picker: document.getElementById('date-end-picker'),
+ calBtn: document.getElementById('date-end-cal-btn'),
};
this.cards = [];
@@ -474,9 +478,10 @@ class DocumentRepository {
// • numeric-only keydown guard
// • auto-advance dd→mm after 2 chars, mm→yyyy after 2 chars
// • backspace from empty field navigates back
+ // • calendar button opens native date picker; selection syncs to text inputs
// • calls onUpdate() on every change
_bindDateParts(parts, onUpdate) {
- const { dd, mm, yyyy } = parts;
+ const { dd, mm, yyyy, picker, calBtn } = parts;
const CTRL_KEYS = new Set(['Backspace', 'Delete', 'Tab', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'Enter']);
const setup = (input, prev, next) => {
@@ -496,6 +501,21 @@ class DocumentRepository {
setup(dd, null, mm);
setup(mm, dd, yyyy);
setup(yyyy, mm, null);
+
+ // Calendar button → open native picker, then sync selection back to text inputs.
+ if (calBtn && picker) {
+ calBtn.addEventListener('click', () => {
+ try { picker.showPicker(); } catch { picker.click(); }
+ });
+ picker.addEventListener('change', () => {
+ if (!picker.value) return;
+ const [y, m, d] = picker.value.split('-');
+ if (dd) dd.value = d;
+ if (mm) mm.value = m;
+ if (yyyy) yyyy.value = y;
+ onUpdate();
+ });
+ }
}
async init() {