| 13 |
13 |
|
<header class="app-header">
|
| 14 |
14 |
|
<div class="header-content">
|
| 15 |
15 |
|
<h1 class="app-title">GoingsOn</h1>
|
| 16 |
|
- |
<span class="app-subtitle">Project Management</span>
|
|
16 |
+ |
<span class="app-subtitle">Personal Productivity</span>
|
| 17 |
17 |
|
<span class="mobile-view-title" id="mobile-view-title"></span>
|
| 18 |
18 |
|
</div>
|
| 19 |
19 |
|
<nav class="tab-navigation" role="tablist" aria-label="Main navigation">
|
| 31 |
31 |
|
<button class="sync-indicator" id="sync-indicator" onclick="GoingsOn.settings.openCloudSync()" title="Cloud Sync" aria-label="Cloud sync status" style="display:none;">
|
| 32 |
32 |
|
<span class="sync-dot" id="sync-dot"></span>
|
| 33 |
33 |
|
</button>
|
|
34 |
+ |
<button class="settings-btn" onclick="GoingsOn.search.open()" title="Search (Cmd+K)" aria-label="Search">Search</button>
|
| 34 |
35 |
|
<button class="settings-btn" onclick="GoingsOn.settings.open()" title="Settings" aria-label="Open settings">Settings</button>
|
| 35 |
36 |
|
<button class="settings-btn shortcut-hint-btn" onclick="GoingsOn.keyboard.showShortcuts()" title="Keyboard shortcuts (?)" aria-label="Show keyboard shortcuts">?</button>
|
| 36 |
37 |
|
</div>
|
| 211 |
212 |
|
</div>
|
| 212 |
213 |
|
</div>
|
| 213 |
214 |
|
</div>
|
|
215 |
+ |
<!-- Task Overview Sub-View -->
|
|
216 |
+ |
<div id="task-overview-view" class="subview hidden">
|
|
217 |
+ |
<div class="page-header">
|
|
218 |
+ |
<div style="display: flex; align-items: center; gap: 1rem;">
|
|
219 |
+ |
<button class="btn btn-secondary" onclick="GoingsOn.taskOverview.close()">← Back</button>
|
|
220 |
+ |
<h2 class="page-title" id="task-overview-title">Task Overview</h2>
|
|
221 |
+ |
</div>
|
|
222 |
+ |
<div id="task-overview-actions"></div>
|
|
223 |
+ |
</div>
|
|
224 |
+ |
<div id="task-overview-content">
|
|
225 |
+ |
<div class="skeleton-shimmer" aria-label="Loading task overview">
|
|
226 |
+ |
<div class="skeleton-row"><div class="skeleton-lines"><div class="skeleton-line long"></div><div class="skeleton-line medium"></div></div></div>
|
|
227 |
+ |
<div class="skeleton-row"><div class="skeleton-lines"><div class="skeleton-line medium"></div><div class="skeleton-line short"></div></div></div>
|
|
228 |
+ |
</div>
|
|
229 |
+ |
</div>
|
|
230 |
+ |
</div>
|
|
231 |
+ |
|
| 214 |
232 |
|
</div><!-- /work-view -->
|
| 215 |
233 |
|
|
| 216 |
234 |
|
<!-- Time Tab Group -->
|
| 217 |
235 |
|
<div id="time-view" class="view tab-group hidden">
|
| 218 |
236 |
|
<div class="pill-nav" role="tablist" aria-label="Time views">
|
| 219 |
|
- |
<button class="pill active" data-subview="day-plan">Day</button>
|
| 220 |
|
- |
<button class="pill" data-subview="weekly-review">Week</button>
|
| 221 |
|
- |
<button class="pill" data-subview="monthly-review">Month</button>
|
|
237 |
+ |
<button class="pill active" data-subview="day-plan">Day Plan</button>
|
|
238 |
+ |
<button class="pill" data-subview="weekly-review">Weekly Review</button>
|
|
239 |
+ |
<button class="pill" data-subview="monthly-review">Monthly Review</button>
|
| 222 |
240 |
|
<button class="pill" data-subview="events">Events</button>
|
| 223 |
241 |
|
<button class="pill" data-subview="timer">Timer</button>
|
| 224 |
242 |
|
</div>
|
| 233 |
251 |
|
<input type="date" id="day-plan-date" class="day-plan-date-picker" onchange="GoingsOn.dayPlan.onDatePickerChange()">
|
| 234 |
252 |
|
<span id="day-plan-date-display" class="day-plan-date-display"></span>
|
| 235 |
253 |
|
</div>
|
| 236 |
|
- |
<button class="btn btn-primary" onclick="GoingsOn.dayPlan.openDailyReview()" title="Review your day">
|
| 237 |
|
- |
Review Day
|
| 238 |
|
- |
</button>
|
|
254 |
+ |
<div class="view-toggle" id="day-plan-review-toggle" data-plan-pane="day-plan-pane" data-review-pane="day-review-pane">
|
|
255 |
+ |
<button class="view-toggle-btn active" data-mode="plan" onclick="GoingsOn.planReviewToggle.setMode('day', 'plan')">Plan</button>
|
|
256 |
+ |
<button class="view-toggle-btn" data-mode="review" onclick="GoingsOn.planReviewToggle.setMode('day', 'review')">Review</button>
|
|
257 |
+ |
</div>
|
| 239 |
258 |
|
</div>
|
| 240 |
|
- |
<div class="day-plan-content">
|
|
259 |
+ |
<!-- Plan pane -->
|
|
260 |
+ |
<div id="day-plan-pane" class="day-plan-content">
|
| 241 |
261 |
|
<div class="day-plan-main" id="day-plan-container">
|
| 242 |
262 |
|
<div class="timeline-container" id="timeline-container">
|
| 243 |
263 |
|
<p class="timeline-hint" style="text-align: center; color: var(--text-secondary); font-size: 0.8rem; margin: 0.25rem 0 0;">Drag across time slots to block time</p>
|
| 262 |
282 |
|
</div>
|
| 263 |
283 |
|
</div>
|
| 264 |
284 |
|
</div>
|
|
285 |
+ |
<!-- Review pane -->
|
|
286 |
+ |
<div id="day-review-pane" class="hidden">
|
|
287 |
+ |
<div id="day-review-content" class="day-review-inline">
|
|
288 |
+ |
<p style="color: var(--text-secondary);">Loading...</p>
|
|
289 |
+ |
</div>
|
|
290 |
+ |
</div>
|
| 265 |
291 |
|
</div>
|
| 266 |
292 |
|
|
| 267 |
293 |
|
<!-- Weekly Review Sub-View -->
|
| 268 |
294 |
|
<div id="weekly-review-view" class="subview hidden" role="tabpanel" aria-labelledby="weekly-review-tab">
|
| 269 |
295 |
|
<div class="page-header">
|
| 270 |
296 |
|
<h2 class="page-title">Weekly Review</h2>
|
|
297 |
+ |
<div class="view-toggle" id="week-plan-review-toggle" data-plan-pane="week-plan-pane" data-review-pane="week-review-pane">
|
|
298 |
+ |
<button class="view-toggle-btn active" data-mode="plan" onclick="GoingsOn.planReviewToggle.setMode('week', 'plan')">Plan</button>
|
|
299 |
+ |
<button class="view-toggle-btn" data-mode="review" onclick="GoingsOn.planReviewToggle.setMode('week', 'review')">Review</button>
|
|
300 |
+ |
</div>
|
| 271 |
301 |
|
</div>
|
| 272 |
302 |
|
<div id="weekly-review-content" class="weekly-review-content">
|
| 273 |
303 |
|
<div class="skeleton-shimmer" aria-label="Loading weekly review">
|
| 287 |
317 |
|
<button class="btn btn-secondary" onclick="GoingsOn.monthlyReview.nextMonth()" title="Next month">→</button>
|
| 288 |
318 |
|
<span id="monthly-review-month-display" class="monthly-review-month-display"></span>
|
| 289 |
319 |
|
</div>
|
|
320 |
+ |
<div class="view-toggle" id="month-plan-review-toggle" data-plan-pane="month-plan-pane" data-review-pane="month-review-pane">
|
|
321 |
+ |
<button class="view-toggle-btn active" data-mode="plan" onclick="GoingsOn.planReviewToggle.setMode('month', 'plan')">Plan</button>
|
|
322 |
+ |
<button class="view-toggle-btn" data-mode="review" onclick="GoingsOn.planReviewToggle.setMode('month', 'review')">Review</button>
|
|
323 |
+ |
</div>
|
| 290 |
324 |
|
</div>
|
| 291 |
325 |
|
<div id="monthly-review-content" class="monthly-review-content">
|
| 292 |
326 |
|
<div class="skeleton-shimmer" aria-label="Loading monthly review">
|
| 310 |
344 |
|
<div id="events-view" class="subview hidden" role="tabpanel" aria-labelledby="events-tab">
|
| 311 |
345 |
|
<div class="page-header">
|
| 312 |
346 |
|
<h2 class="page-title">Events</h2>
|
| 313 |
|
- |
<button class="btn btn-primary" onclick="GoingsOn.events.openNew()" title="New event (n)">+ New Event</button>
|
|
347 |
+ |
<div style="display: flex; align-items: center; gap: 1rem;">
|
|
348 |
+ |
<div class="view-toggle" id="events-view-toggle">
|
|
349 |
+ |
<button class="view-toggle-btn active" data-mode="list" onclick="GoingsOn.events.setViewMode('list')">List</button>
|
|
350 |
+ |
<button class="view-toggle-btn" data-mode="month" onclick="GoingsOn.events.setViewMode('month')">Month</button>
|
|
351 |
+ |
<button class="view-toggle-btn" data-mode="week" onclick="GoingsOn.events.setViewMode('week')">Week</button>
|
|
352 |
+ |
</div>
|
|
353 |
+ |
<button class="btn btn-primary" onclick="GoingsOn.events.openNew()" title="New event (n)">+ New Event</button>
|
|
354 |
+ |
</div>
|
|
355 |
+ |
</div>
|
|
356 |
+ |
<div id="events-bulk-bar" class="bulk-actions-bar hidden">
|
|
357 |
+ |
<span class="bulk-count">0 selected</span>
|
|
358 |
+ |
<button class="btn btn-sm" onclick="GoingsOn.events.selectAllEvents()">Select All</button>
|
|
359 |
+ |
<button class="btn btn-sm" onclick="GoingsOn.events.bulkDelete()">Delete</button>
|
|
360 |
+ |
<button class="btn btn-sm" onclick="GoingsOn.events.clearEventSelection()">Cancel</button>
|
| 314 |
361 |
|
</div>
|
| 315 |
362 |
|
<div class="events-list" id="events-list">
|
| 316 |
363 |
|
<div class="event-table-virtual" id="event-table" role="grid" aria-label="Events list">
|
| 319 |
366 |
|
<div class="event-cell" role="columnheader">Time</div>
|
| 320 |
367 |
|
<div class="event-cell" role="columnheader">Event</div>
|
| 321 |
368 |
|
<div class="event-cell" role="columnheader">Location</div>
|
|
369 |
+ |
<div class="event-cell" role="columnheader"></div>
|
| 322 |
370 |
|
</div>
|
| 323 |
371 |
|
<div class="event-list-container" id="event-list-container" aria-live="polite">
|
| 324 |
372 |
|
<div class="skeleton-shimmer" aria-label="Loading events">
|
| 345 |
393 |
|
</div>
|
| 346 |
394 |
|
</details>
|
| 347 |
395 |
|
</div>
|
|
396 |
+ |
<!-- Month Calendar View -->
|
|
397 |
+ |
<div id="events-month-view" class="events-calendar-container hidden">
|
|
398 |
+ |
<div class="calendar-nav">
|
|
399 |
+ |
<button class="btn btn-secondary" onclick="GoingsOn.eventsCalendar.prevMonth()">←</button>
|
|
400 |
+ |
<button class="btn btn-secondary" onclick="GoingsOn.eventsCalendar.goToThisMonth()">This Month</button>
|
|
401 |
+ |
<button class="btn btn-secondary" onclick="GoingsOn.eventsCalendar.nextMonth()">→</button>
|
|
402 |
+ |
<span class="calendar-nav-label" id="month-calendar-label"></span>
|
|
403 |
+ |
</div>
|
|
404 |
+ |
<div id="month-calendar-grid"></div>
|
|
405 |
+ |
<div id="month-day-detail" class="month-day-detail hidden"></div>
|
|
406 |
+ |
</div>
|
|
407 |
+ |
<!-- Week Calendar View -->
|
|
408 |
+ |
<div id="events-week-view" class="events-calendar-container hidden">
|
|
409 |
+ |
<div class="calendar-nav">
|
|
410 |
+ |
<button class="btn btn-secondary" onclick="GoingsOn.eventsCalendar.prevWeek()">←</button>
|
|
411 |
+ |
<button class="btn btn-secondary" onclick="GoingsOn.eventsCalendar.goToThisWeek()">This Week</button>
|
|
412 |
+ |
<button class="btn btn-secondary" onclick="GoingsOn.eventsCalendar.nextWeek()">→</button>
|
|
413 |
+ |
<span class="calendar-nav-label" id="week-calendar-label"></span>
|
|
414 |
+ |
</div>
|
|
415 |
+ |
<div id="week-calendar-grid"></div>
|
|
416 |
+ |
</div>
|
| 348 |
417 |
|
</div>
|
| 349 |
418 |
|
</div><!-- /time-view -->
|
| 350 |
419 |
|
|
| 413 |
482 |
|
<button class="btn btn-primary" onclick="GoingsOn.contacts.openNew()" title="New contact (n)">+ New Contact</button>
|
| 414 |
483 |
|
</div>
|
| 415 |
484 |
|
</div>
|
|
485 |
+ |
<div id="contacts-bulk-bar" class="bulk-actions-bar hidden">
|
|
486 |
+ |
<span class="bulk-count">0 selected</span>
|
|
487 |
+ |
<button class="btn btn-sm" onclick="GoingsOn.contacts.selectAll()">Select All</button>
|
|
488 |
+ |
<button class="btn btn-sm" onclick="GoingsOn.contacts.bulkTag()">Tag</button>
|
|
489 |
+ |
<button class="btn btn-sm" onclick="GoingsOn.contacts.bulkDelete()">Delete</button>
|
|
490 |
+ |
<button class="btn btn-sm" onclick="GoingsOn.contacts.clearSelection()">Cancel</button>
|
|
491 |
+ |
</div>
|
| 416 |
492 |
|
<div class="cards-grid" id="contacts-grid">
|
| 417 |
493 |
|
<div class="skeleton-shimmer" aria-label="Loading contacts">
|
| 418 |
494 |
|
<div class="skeleton-row"><div class="skeleton-avatar"></div><div class="skeleton-lines"><div class="skeleton-line long"></div><div class="skeleton-line short"></div></div></div>
|
| 421 |
497 |
|
</div>
|
| 422 |
498 |
|
</div>
|
| 423 |
499 |
|
</div>
|
|
500 |
+ |
<!-- Contact Dashboard Sub-View -->
|
|
501 |
+ |
<div id="contact-dashboard-view" class="subview hidden">
|
|
502 |
+ |
<div class="page-header">
|
|
503 |
+ |
<div style="display: flex; align-items: center; gap: 1rem;">
|
|
504 |
+ |
<button class="btn btn-secondary" onclick="GoingsOn.contactDashboard.close()">← Back</button>
|
|
505 |
+ |
<h2 class="page-title" id="contact-dashboard-title">Contact</h2>
|
|
506 |
+ |
</div>
|
|
507 |
+ |
<div id="contact-dashboard-actions"></div>
|
|
508 |
+ |
</div>
|
|
509 |
+ |
<div id="contact-dashboard-content">
|
|
510 |
+ |
<div class="skeleton-shimmer" aria-label="Loading contact">
|
|
511 |
+ |
<div class="skeleton-row"><div class="skeleton-avatar"></div><div class="skeleton-lines"><div class="skeleton-line long"></div><div class="skeleton-line medium"></div></div></div>
|
|
512 |
+ |
<div class="skeleton-row"><div class="skeleton-lines"><div class="skeleton-line long"></div><div class="skeleton-line short"></div></div></div>
|
|
513 |
+ |
</div>
|
|
514 |
+ |
</div>
|
|
515 |
+ |
</div>
|
|
516 |
+ |
|
| 424 |
517 |
|
</div><!-- /messages-view -->
|
|
518 |
+ |
|
|
519 |
+ |
<!-- Settings View (standalone, not a tab group) -->
|
|
520 |
+ |
<div id="settings-view" class="view hidden">
|
|
521 |
+ |
<div class="settings-page-layout">
|
|
522 |
+ |
<nav class="settings-sidebar">
|
|
523 |
+ |
<button class="settings-back-btn" onclick="GoingsOn.settings.goBack()" aria-label="Go back">← Back</button>
|
|
524 |
+ |
<div class="settings-nav-items">
|
|
525 |
+ |
<button class="settings-nav-item active" data-section="appearance" onclick="GoingsOn.settings.showSection('appearance')">Appearance</button>
|
|
526 |
+ |
<button class="settings-nav-item" data-section="notifications" onclick="GoingsOn.settings.showSection('notifications')">Notifications</button>
|
|
527 |
+ |
<button class="settings-nav-item" data-section="planning" onclick="GoingsOn.settings.showSection('planning')">Planning & Review</button>
|
|
528 |
+ |
<button class="settings-nav-item" data-section="plugins" onclick="GoingsOn.settings.showSection('plugins')">Plugins</button>
|
|
529 |
+ |
<button class="settings-nav-item" data-section="sync" onclick="GoingsOn.settings.showSection('sync')">Cloud Sync</button>
|
|
530 |
+ |
<button class="settings-nav-item" data-section="data" onclick="GoingsOn.settings.showSection('data')">Import & Export</button>
|
|
531 |
+ |
</div>
|
|
532 |
+ |
</nav>
|
|
533 |
+ |
<div class="settings-content" id="settings-content">
|
|
534 |
+ |
<!-- Populated by JS -->
|
|
535 |
+ |
</div>
|
|
536 |
+ |
</div>
|
|
537 |
+ |
</div><!-- /settings-view -->
|
|
538 |
+ |
|
| 425 |
539 |
|
</main>
|
| 426 |
540 |
|
</div><!-- /app-body -->
|
| 427 |
541 |
|
|
| 519 |
633 |
|
<script src="js/task-board.js"></script>
|
| 520 |
634 |
|
<script src="js/attachments.js"></script>
|
| 521 |
635 |
|
<script src="js/autocomplete.js"></script>
|
|
636 |
+ |
<script src="js/address-highlight.js"></script>
|
| 522 |
637 |
|
<script src="js/tasks.js"></script>
|
|
638 |
+ |
<script src="js/task-overview.js"></script>
|
| 523 |
639 |
|
<script src="js/events.js"></script>
|
|
640 |
+ |
<script src="js/events-calendar.js"></script>
|
| 524 |
641 |
|
<script src="js/emails.js"></script>
|
| 525 |
642 |
|
<script src="js/email-accounts.js"></script>
|
| 526 |
643 |
|
<script src="js/contacts.js"></script>
|
|
644 |
+ |
<script src="js/contact-dashboard.js"></script>
|
|
645 |
+ |
<script src="js/plan-review-toggle.js"></script>
|
| 527 |
646 |
|
<script src="js/day-planning.js"></script>
|
| 528 |
647 |
|
<script src="js/weekly-review.js"></script>
|
| 529 |
648 |
|
<script src="js/monthly-review.js"></script>
|
| 534 |
653 |
|
|
| 535 |
654 |
|
<!-- Features (with domain dependencies) -->
|
| 536 |
655 |
|
<script src="js/bulk-actions.js"></script>
|
|
656 |
+ |
<script src="js/search.js"></script>
|
| 537 |
657 |
|
<script src="js/keyboard.js"></script>
|
| 538 |
658 |
|
|
| 539 |
659 |
|
<!-- UI -->
|