v0.12.17 schedule view update
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "rosterchirp-backend",
|
"name": "rosterchirp-backend",
|
||||||
"version": "0.12.16",
|
"version": "0.12.17",
|
||||||
"description": "RosterChirp backend server",
|
"description": "RosterChirp backend server",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
2
build.sh
2
build.sh
@@ -13,7 +13,7 @@
|
|||||||
# ─────────────────────────────────────────────────────────────
|
# ─────────────────────────────────────────────────────────────
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
VERSION="${1:-0.12.16}"
|
VERSION="${1:-0.12.17}"
|
||||||
ACTION="${2:-}"
|
ACTION="${2:-}"
|
||||||
REGISTRY="${REGISTRY:-}"
|
REGISTRY="${REGISTRY:-}"
|
||||||
IMAGE_NAME="rosterchirp"
|
IMAGE_NAME="rosterchirp"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "rosterchirp-frontend",
|
"name": "rosterchirp-frontend",
|
||||||
"version": "0.12.16",
|
"version": "0.12.17",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { useState, useEffect, useCallback, useRef } from 'react';
|
import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
|
||||||
import ReactDOM from 'react-dom';
|
import ReactDOM from 'react-dom';
|
||||||
import { api } from '../utils/api.js';
|
import { api } from '../utils/api.js';
|
||||||
import { useToast } from '../contexts/ToastContext.jsx';
|
import { useToast } from '../contexts/ToastContext.jsx';
|
||||||
@@ -231,10 +231,36 @@ function TimeInput({ value, onChange, style }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ── Mini Calendar (desktop) ───────────────────────────────────────────────────
|
// ── Mini Calendar (desktop) ───────────────────────────────────────────────────
|
||||||
function MiniCalendar({ selected, onChange, eventDates=new Set() }) {
|
function MiniCalendar({ selected, onChange, events=[] }) {
|
||||||
const [cur, setCur] = useState(()=>{ const d=new Date(selected||Date.now()); d.setDate(1); return d; });
|
const [cur, setCur] = useState(()=>{ const d=new Date(selected||Date.now()); d.setDate(1); return d; });
|
||||||
|
|
||||||
|
// BUG FIX: sync displayed month when selected date changes (e.g. switching Day/Week/Month view resets to today)
|
||||||
|
useEffect(() => {
|
||||||
|
const n = new Date(selected || Date.now());
|
||||||
|
n.setDate(1); n.setHours(0,0,0,0);
|
||||||
|
setCur(prev => (prev.getFullYear()===n.getFullYear()&&prev.getMonth()===n.getMonth()) ? prev : n);
|
||||||
|
}, [selected]);
|
||||||
|
|
||||||
const y=cur.getFullYear(), m=cur.getMonth(), first=new Date(y,m,1).getDay(), total=daysInMonth(y,m), today=new Date();
|
const y=cur.getFullYear(), m=cur.getMonth(), first=new Date(y,m,1).getDay(), total=daysInMonth(y,m), today=new Date();
|
||||||
const cells=[]; for(let i=0;i<first;i++) cells.push(null); for(let d=1;d<=total;d++) cells.push(d);
|
const cells=[]; for(let i=0;i<first;i++) cells.push(null); for(let d=1;d<=total;d++) cells.push(d);
|
||||||
|
|
||||||
|
// BUG FIX: expand recurring events for the displayed month so all occurrences show as dots
|
||||||
|
const eventDates = useMemo(() => {
|
||||||
|
const rangeStart = new Date(y, m, 1);
|
||||||
|
const rangeEnd = new Date(y, m+1, 0, 23, 59, 59);
|
||||||
|
const s = new Set();
|
||||||
|
for (const ev of events) {
|
||||||
|
const occs = expandRecurringEvent(ev, rangeStart, rangeEnd);
|
||||||
|
for (const occ of occs) {
|
||||||
|
if (!occ.start_at) continue;
|
||||||
|
const d = new Date(occ.start_at);
|
||||||
|
if (d.getFullYear()===y && d.getMonth()===m)
|
||||||
|
s.add(`${y}-${String(m+1).padStart(2,'0')}-${String(d.getDate()).padStart(2,'0')}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}, [events, y, m]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{userSelect:'none'}}>
|
<div style={{userSelect:'none'}}>
|
||||||
<div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:8,fontSize:13,fontWeight:600}}>
|
<div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:8,fontSize:13,fontWeight:600}}>
|
||||||
@@ -1469,7 +1495,7 @@ export default function SchedulePage({ isToolManager, isMobile, onProfile, onHel
|
|||||||
setFilterKeyword('');
|
setFilterKeyword('');
|
||||||
setFilterTypeId('');
|
setFilterTypeId('');
|
||||||
setFilterAvailability(false);
|
setFilterAvailability(false);
|
||||||
}} eventDates={eventDates}/>
|
}} events={events}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* List view filters — only shown in Schedule list view */}
|
{/* List view filters — only shown in Schedule list view */}
|
||||||
|
|||||||
Reference in New Issue
Block a user