Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
421 changes: 421 additions & 0 deletions DURATION_FEATURE.md

Large diffs are not rendered by default.

42 changes: 41 additions & 1 deletion src/components/Calendar20/AgendaView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,17 @@ const AgendaView: React.FC<AgendaViewProps> = ({
? t('calendar20.allDay')
: `${item.startDayjs.format('HH:mm')} - ${item.endDayjs.format('HH:mm')}`;

// Format duration from server data if available
const durationStr = (() => {
const mins = item.duration_minutes;
if (!mins || mins <= 0) return null;
if (mins < 60) return `${mins} min`;
const h = Math.floor(mins / 60);
const m = mins % 60;
if (m === 0) return h === 1 ? '1 ora' : `${h} ore`;
return `${h}h ${m}min`;
})();

return (
<TouchableOpacity
style={styles.taskRow}
Expand Down Expand Up @@ -129,7 +140,15 @@ const AgendaView: React.FC<AgendaViewProps> = ({
>
{item.title}
</Text>
<Text style={styles.taskTime}>{timeStr}</Text>
<View style={styles.taskTimeRow}>
<Text style={styles.taskTime}>{timeStr}</Text>
{durationStr && (
<View style={styles.durationBadge}>
<Ionicons name="hourglass-outline" size={12} color="#666" />
<Text style={styles.durationText}>{durationStr}</Text>
</View>
)}
</View>
</View>

{item.category_name && (
Expand Down Expand Up @@ -292,6 +311,27 @@ const styles = StyleSheet.create({
fontWeight: '400',
fontFamily: 'System',
},
taskTimeRow: {
flexDirection: 'row',
alignItems: 'center',
marginTop: 4,
gap: 8,
},
durationBadge: {
flexDirection: 'row',
alignItems: 'center',
gap: 3,
backgroundColor: '#f5f5f5',
borderRadius: 8,
paddingHorizontal: 6,
paddingVertical: 2,
},
durationText: {
fontSize: 12,
color: '#666666',
fontFamily: 'System',
fontWeight: '400',
},
});

export default React.memo(AgendaView);
14 changes: 12 additions & 2 deletions src/components/Calendar20/Calendar20View.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,11 @@ const Calendar20View: React.FC<Calendar20ViewProps> = ({ onClose }) => {
const displayColor = colorService.getColor(categoryName);
const startDayjs = task.start_time ? dayjs(task.start_time) : dayjs();
const endDayjs = task.end_time ? dayjs(task.end_time) : startDayjs;
const durationMinutes = endDayjs.diff(startDayjs, 'minute');
const computedDuration = endDayjs.diff(startDayjs, 'minute');
// Use server-provided duration_minutes if available, otherwise compute from dates
const durationMinutes = (task.duration_minutes && task.duration_minutes > 0)
? task.duration_minutes
: computedDuration;
const isMultiDay = !startDayjs.isSame(endDayjs, 'day');
const isAllDay = durationMinutes >= 1440 || (!task.start_time && !!task.end_time);

Expand Down Expand Up @@ -261,7 +265,9 @@ const Calendar20View: React.FC<Calendar20ViewProps> = ({ onClose }) => {
description: string,
dueDate: string,
priority: number,
categoryNameParam?: string
categoryNameParam?: string,
recurrence?: any,
durationMinutes?: number | null
) => {
const { addTask } = await import('../../services/taskService');
const priorityString = priority === 1 ? 'Bassa' : priority === 2 ? 'Media' : 'Alta';
Expand All @@ -277,6 +283,10 @@ const Calendar20View: React.FC<Calendar20ViewProps> = ({ onClose }) => {
status: 'In sospeso',
category_name: category,
};
// Add duration_minutes if provided (API v2.1.0)
if (durationMinutes !== undefined && durationMinutes !== null) {
newTask.duration_minutes = durationMinutes;
}
try {
await addTask(newTask);
} catch (error) {
Expand Down
8 changes: 8 additions & 0 deletions src/components/Notes/NotesCanvas.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import Animated, {
import Svg, { Defs, Pattern, Rect, Circle } from 'react-native-svg';
import { useNotesState } from '../../context/NotesContext';
import { StickyNote } from './StickyNote';
import { canvasViewport } from '../../utils/canvasViewport';

// Context per gestire il focus globale delle note
export const NotesFocusContext = React.createContext<{
Expand Down Expand Up @@ -133,6 +134,13 @@ export const NotesCanvas: React.FC = () => {
lastTranslateX.value = translateX.value;
lastTranslateY.value = translateY.value;
lastScale.value = scale.value;

// Update shared viewport state for note positioning
canvasViewport.translateX = translateX.value;
canvasViewport.translateY = translateY.value;
canvasViewport.scale = scale.value;
canvasViewport.screenWidth = screenWidth;
canvasViewport.screenHeight = screenHeight;

isPinching.current = false;
gestureState.current.initialDistance = null;
Expand Down
Loading
Loading