Commit Graph

137 Commits

Author SHA1 Message Date
lenhanphung 53f763d6eb UI/update recurring event section (#544)
* Update global recurring event style

* #538 update date selector consistance

* update test cases
2026-02-13 09:34:33 +01:00
lenhanphung 1e312c1c8b Fix/time picker glitch (#542)
* update twake-mui

* #537 fix time picker glitch
2026-02-12 11:03:55 +01:00
Camille Moussu fad1dfe4c5 [#352] update exceptions on all update without reseting them (#510)
* [#352] update exceptions on all update without reseting them

* [#352] added tests
2026-02-11 11:20:10 +01:00
Camille Moussu d6e464afad [#421] added eslint check to CI (#534)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2026-02-10 10:41:37 +01:00
Camille Moussu 8a6ec8fc39 474 websocket add a snack bar to notify the user on websocket status changes (#483)
* [#474] added snackbar for websocket status

* [#474 & #447] added ping to complete browser online/offline status

* [#447] ping timeout as an env var
2026-02-09 19:14:13 +01:00
lenhanphung fe8e19686d Merge pull request #504 from linagora/UI/update-header-bar
UI/update header bar
2026-02-05 19:18:30 +07:00
Camille Moussu 9cf8d7f3ab [#494] switched UTC offset and timeZone name in timezone selector (#513) 2026-02-05 11:30:01 +01:00
lenhanphung ec258f4d42 restyle current date state 2026-02-05 17:08:51 +07:00
lenhanphung 201f9c722b Use @linagora/twake-mui 1.1.6 from registry 2026-02-05 17:08:51 +07:00
Camille Moussu 2d8196fc8e [#490 & #489] Removed duplicated api call to get event data (#492)
* [#490 & #489] Removed duplicated api call to get event data

* [#490] removed arbitrary timezone fallback to UTC/ETC & updated exdate formating

* [#490] updated test and fixed eventdiff utils to properly handle dates
2026-02-04 15:01:13 +01:00
lenhanphung 5ae838c425 UI/update sidebar (#480)
* update minicalendar

* update left sidebar

* chore: update twake-mui to version 1.1.4

- Update @linagora/twake-mui from local file to npm package 1.1.4
- Add margin to TempCalendarsInput section in sidebar
- Remove margin from PeopleSearch component (moved to parent)

* Changed wording on my calendars and event creation button

---------

Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2026-02-02 10:02:23 +01:00
Camille Moussu 0a8051870a [#469] fixed mail to attendees string (#484) 2026-01-30 15:51:04 +01:00
Camille Moussu 83fae6f1c2 [#448] added reconnection logic to websocket (#472)
* [#448] added reconnection logic to websocket

* [#448] added test

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-01-27 14:54:03 +01:00
Camille Moussu d966a9eb2f [FIX] fixed broken test after rebase (#485)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2026-01-27 14:38:26 +01:00
Camille Moussu dafac94aec [#449] added debounce for websocket updates (#476)
* [#449] added debounce for websocket updates

* [#449] changed behavior to have disableable debounce + changed debounced messages data storage to be handled by websocket Gate
2026-01-26 11:15:37 +01:00
lenhanphung 7058f1c2d6 Feat/update login flow reload page (#467)
* update spacing event modal

* update spacing create calendar modal

* fix evenchip description color

* using variant instead of sx

* update login flow

* fix: add useEffect import back to Calendar.tsx
2026-01-26 11:13:26 +01:00
Camille Moussu 00742119be [#446] removed direct state update (#468) 2026-01-21 15:17:49 +01:00
Camille Moussu 23d50f250d Refactor imports (#470) 2026-01-20 17:33:30 +01:00
lenhanphung aeb8670895 UI/update global UI (#459)
* Update loading screen to use Lottie animation

- Replace simple logo with Lottie animation from loadercalendar.lottie
- Center animation on screen with full viewport coverage
- Set animation width to 175px
- Install @lottiefiles/dotlottie-react package

* update spacing event modal

* add twake workplace logo to loading screen

* update spacing create calendar modal

* fix evenchip description color

* using variant instead of sx
2026-01-20 09:14:03 +01:00
Camille Moussu 00c3c0d6f0 444 use websocket to trigger reloads (#458)
* [#444] added refresh on sync token calendar update

* [#444] added refresh on register and tests

* [#444] extracted logic for useEffects and updates

* [#444] refactored code structure to use absolute paths
2026-01-19 09:09:23 +01:00
Camille Moussu 2fa8a7f16a [#451] added websocket connexion (#453)
* [#451] added websocket connexion

* [#451] added tests

* [#451] add missing cleanup for web socket causing memory leaks
2026-01-14 15:17:29 +01:00
lenhanphung 8b3afc1737 - Replace avatar image from API with gradient avatar from twake-mui (#457)
- Display 2-letter initials (e.g., "JD" for "John Doe") instead of single letter
- Add getInitials helper function in avatarUtils for reusability
- Update Avatar in PeopleSearch, CalendarSearch, and Menubar components
- Remove avatarUrl prop usage across all Avatar components
2026-01-13 14:44:42 +01:00
Camille Moussu 478a0e0eb0 405 back reload token with synctokens (#436)
* [#405] added syncToken in calendar params and fetch with sync token

* [#405] changed reload to work with sync-token

* [#405] fixup promise handling, added calendar adding and removing hanlding with refresh

* [#405]  fixed event expansion calls

* [#405 & refactor] added helperfunction to get base event uid + refactored synctoken updates management

* [#405] added pMap lib to process event expansion

* [#405] added flag for no synctoken / new synctoken
2026-01-13 11:06:34 +01:00
lenhanphung 994ea1c45e fix url endcoding 2026-01-08 13:31:13 +07:00
lenhanphung 24f8895baa Update avatar component 2026-01-08 11:41:38 +07:00
lenhanphung 462ad6d250 chore: update twake-mui dependency and use radius.lg for create event button 2026-01-08 11:41:37 +07:00
Camille Moussu 9ff75056c7 [#397 bis] added participation management on event from thunderbird (#432)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2026-01-07 11:45:17 +01:00
Camille Moussu 90d6058b0f [#425] Event title modification of all day event alter event dates (#431)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-12-18 09:09:02 +01:00
lenhanphung a935d2bc43 372 drag and drop multiple days event to use normal mode instead of extended mode (#407)
- When dragging from allday slot: open normal mode with allday checked, show start date and end date
- When dragging from week/month view grid: open normal mode with allday checked, show 4 fields (start date, start time, end date, end time)
- Update DateTimeFields logic to support displaying time fields when allday=true and hasEndDateChanged=true for multiple days events

Add setHasEndDateChanged(false) to resetAllStateToDefault function to prevent stale state when:
- User creates multi-day event from grid (sets hasEndDateChanged = true)
- Closes the modal
- Opens modal again for a single-day event

This ensures hasEndDateChanged is properly reset to false when modal is closed or reset.

Fix drag and drop logic: keep allday=false when dragging from week view

- Remove setAllDay(true) when dragging multiple days from week view grid
- Keep allday=false to show time fields for week view drag scenarios
- Add comprehensive test cases for drag and drop scenarios
- Test cases cover allday slot and week view drag scenarios
- Prevent regressions with test coverage for display logic
2025-12-17 10:28:11 +01:00
Camille Moussu c81153a119 [#523] changed search bar to work like an autocomplete (#406)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-12-15 22:10:17 +01:00
Camille Moussu d68b4146d3 [#397] Consider the calendar owner as the organizer when no organizer (#416)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-12-12 18:00:27 +01:00
Camille Moussu 22d674c6b5 [#4180] added support for instant event (#417)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-12-12 17:33:33 +01:00
Camille Moussu f863bb8194 394 search block empty field search on enter (#401)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-12-11 18:35:59 +01:00
lenhanphung bd33a93040 feat: #339 Add email notification toggle setting and update tests (#387) 2025-12-08 10:54:24 +01:00
Camille Moussu 1056220719 [#339] added API calls to timezone selectors (#396)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-12-07 07:43:00 +01:00
Camille Moussu 193c1a7166 [#337] added timezone loading from backend (#386)
* [#337] added timezone loading from backend

* [#337] changed data structure to allow patching timezone while keeping other datetime params value

* [#337] fixed gap, event create modale sync with settings and added checkbox

* [#337] isBrowserDefaultTimezone is set to true when API return null timezone

Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-12-04 15:14:43 +01:00
Camille Moussu 325d33caef [#361] Improve search result page (#375)
* [#361] added back button

* [#361] greatly improved looks of results

* [#361] added popup on click

* [#361] removed classnames with \!important replaced with style in component

---------

Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-12-02 15:26:00 +01:00
lenhanphung c408e1818f feat: #333 load language from backend configuration (#377)
* feat: #333 load language from backend configuration

* feat(settings): sync language with user configs api

* Update __test__/features/Settings/SettingsPage.test.tsx

Co-authored-by: Lê Nhân Phụng <lenhanphung@Phung-Mac-M4.local>
Co-authored-by: Benoit TELLIER <btellier@linagora.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-12-02 10:06:11 +01:00
Camille Moussu ae17ac2bd6 #12 topbar search (#371)
- added search in topbar
 - added skeleton search results page
 - added tests
 - set personal calendars as default search in and allow to select personal and shared as a search in option

---------

Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-11-28 14:54:13 +01:00
lenhanphung 1a85afc57d UI: #334 add config page language setting (#374)
* UI: #334 add config page language setting

* temporary remove logout button

* Unify fullscreen view class for dialog expanded and settings view

- Replace dialog-expanded and settings-view with single fullscreen-view class
- Update ResponsiveDialog to use fullscreen-view class
- Update CalendarLayout to use fullscreen-view class for settings view
- Consolidate CSS rules in Menubar.styl to use fullscreen-view
- Update test cases to use new class name

---------

Co-authored-by: Lê Nhân Phụng <lenhanphung@Phung-Mac-M4.local>
2025-11-28 14:25:06 +01:00
Benoit TELLIER 65c26f7627 [#318] implement SEQUENCE field for ICS events (#362)
- Add SEQUENCE property to ICS generation (starts at 1 for new events)
- Increment SEQUENCE on event updates (modal, drag & drop, resize)
- Handle SEQUENCE independently for recurring event instances
- Add comprehensive tests for SEQUENCE generation and incrementation
- Ensure proper event ordering for remote calendar participants

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-27 08:58:31 +01:00
lenhanphung 9151ff5563 fix: preserve form data on API error and fix test cases (#338)
- Add temp storage utility (eventFormTempStorage.ts) to save/restore form data
- Implement error handling: close modal immediately, reopen on API failure with saved data
- Add event listeners in Calendar.tsx and EventDisplayPreview.tsx to reopen modals on error
- Fix calendar change logic in EventUpdateModal: use oldCalendar for update before move
- Update all test mocks to support .unwrap() method for Redux thunks
- Add sessionStorage.clear() in test beforeEach hooks
- Fix test timing issues with act() wrappers and increased timeouts
- Mock putEventAsync in TempUpdate test to ensure updateTempCalendar is called

- Fix update modal not reopening when API fails for recurring events (solo/all)
- Move update modal reopen logic from EventDisplayPreview to Calendar.tsx
- Use sessionStorage to persist update modal info across component unmounts
- Handle typeOfAction matching for recurring events (undefined vs solo/all)
- Fix error handling in updateEventInstanceAsync and updateSeriesAsync
- Ensure all API failures properly dispatch eventModalError event
2025-11-25 15:30:58 +01:00
lenhanphung ffe14b6b6c refactor: #331 use Snackbar for event errors and add tests (#351)
Co-authored-by: Lê Nhân Phụng <lenhanphung@Phung-Mac-M4.local>
2025-11-25 11:17:06 +01:00
Camille Moussu fd588b4749 [#326] fixed attendees preview string + extensive tests (#357)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-11-25 11:15:47 +01:00
Camille Moussu 531d29f2ce [#313] removed withRights (#354)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-11-24 21:32:15 +01:00
lenhanphung 007266e7b0 Fix: #319 attendee role: use REQ-PARTICIPANT instead of CHAIR for nor… (#349)
- Change role from CHAIR to REQ-PARTICIPANT when adding attendees via PeopleSearch
- Keep CHAIR role only for organizers
2025-11-20 12:00:17 +01:00
lenhanphung bff1af31bd Fix: Preserve timezone used in create and update modal (#301)
- Fix timezone field display in event modals to show original timezone from server
- Fix formatDateToICal to use moment.utc(date).tz(timezone) for correct UTC instant preservation
- Fix parseCalendarEvent to convert event.start/end to ISO UTC strings after parsing
- Fix eventToFullCalendarFormat to ensure event times are ISO UTC before passing to FullCalendar
- Fix getEvent to normalize event.start/end to ISO UTC strings
- Ensure event.timezone is always set (defaults to Etc/UTC if not detected)
- Update eventUtils.test.ts to match new timezone conversion logic
- Fix event time shift issue on calendar grid display

This ensures:
- Events display in correct time slots on calendar grid
- Event times are correctly converted between timezones
- Original timezone from server is preserved and displayed
- All event times are stored as ISO UTC strings internally

* refactor: eliminate datetime format detection code duplication

- Add constants for datetime format strings and magic number (DATETIME_WITH_SECONDS_LENGTH, DATETIME_FORMAT_WITH_SECONDS, DATETIME_FORMAT_WITHOUT_SECONDS)
- Create shared detectDateTimeFormat() function to replace duplicated format detection logic
- Refactor convertFormDateTimeToISO, convertEventDateTimeToISO, and convertDateTimeStringToISO to use shared helper
- Add console.warn logging when invalid datetime is encountered (addresses silent fallback issue)
- Add comprehensive test coverage for dateTimeHelpers with full test suite
2025-11-20 09:32:15 +01:00
Camille Moussu ca2e8a479a [#309] homogenized add add Desc button (#345)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-11-19 15:23:37 +01:00
Camille Moussu cb69455a9b [#239] refresh is triggered only on save (#329)
Co-authored-by: Camille Moussu <cmoussu@linagora.com>
2025-11-18 10:41:58 +01:00
lenhanphung ffe204d60b refactor: stabilize calendar loading effects and menubar redirect
- Memoize calendar range strings and stabilize effect deps
- Guard updateDarkColor to avoid dispatch loops
- Add resilient cache-clear handling with refs
- Memoize calendar/temp ids to prevent rerenders
- Update event handler hooks with missing deps
- Add guards and dependency fixes across Calendar effects
2025-11-18 10:40:19 +01:00