Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
b99a0bf
fix: add data-qa attributes for improved testing and accessibility
iacopolea Oct 22, 2025
4f1e79c
fix: Correct plan status
d-beezee Oct 29, 2025
25e6c12
Merge pull request #1455 from AppQuality/UN-1754
marcbon Oct 30, 2025
1ae89f6
feat: add disposable email validation using fakefilter package
iacopolea Oct 20, 2025
9056ead
refactor: clean up imports and remove unnecessary console log in Step…
iacopolea Oct 22, 2025
1112227
feat: add validation for disposable email addresses in signup process
iacopolea Oct 22, 2025
7a0063e
refactor: remove duplicate e2e tests for the Join page
iacopolea Oct 22, 2025
a61ac46
fix: update fakefilter dependency to version 0.1.1361
iacopolea Oct 30, 2025
6f25838
fix: include fakefilter in optimizeDeps for improved dependency manag…
iacopolea Oct 30, 2025
02fe00d
refactor: replace fakefilter with mailchecker for disposable email va…
iacopolea Oct 30, 2025
ee4ba8c
Merge pull request #1454 from AppQuality/UN-1913
marcbon Oct 31, 2025
4de1764
feat: Add user watcher list
d-beezee Oct 31, 2025
3e14b17
feat: Implement Plan Watchers functionality with add and remove capab…
d-beezee Nov 3, 2025
21401e6
feat: Add custom hook to determine if a user is the last one in the w…
Kariamos Nov 3, 2025
402ff16
feat: Add watcher list UI messages and error handling to enhance user…
Kariamos Nov 3, 2025
9c0f4d8
feat: Add Italian empty translations
Kariamos Nov 3, 2025
3661cd5
feat: Add tooltip for removing last watcher in the user list
Kariamos Nov 3, 2025
a189750
feat: Add tooltip for disabled unfollow button when last watcher
Kariamos Nov 3, 2025
eccc5f6
feat: Add tooltip for adding members during setup phase in watcher list
Kariamos Nov 3, 2025
ca4159f
feat: Add tooltip for adding workspace members during setup phase in …
Kariamos Nov 3, 2025
ad9ab03
feat: Add plan approval status handling in watcher list and user item…
d-beezee Nov 3, 2025
6147348
feat: Refactor tooltip handling for last watcher in user list
Kariamos Nov 3, 2025
5c5c8d7
feat: Refactor WatchButton component to improve tooltip handling and …
Kariamos Nov 3, 2025
ab73499
feat: Implement code changes for feature enhancement and bug fixes
d-beezee Nov 3, 2025
b15443d
Merge branch 'UN-1998' into UN-1998-notification-panel-interactions
d-beezee Nov 3, 2025
5b50e22
Merge pull request #1458 from AppQuality/UN-1998-notification-panel-i…
d-beezee Nov 3, 2025
32e3019
rework: Format
d-beezee Nov 3, 2025
e48eb3b
feat: Add Italian translations for watcher list notifications and alerts
Kariamos Nov 4, 2025
794e2db
feat: Add toast notification for successful follow action in WatchButton
Kariamos Nov 4, 2025
8fe0d6a
feat: Update toast messages for following and unfollowing activities …
Kariamos Nov 4, 2025
fd9a50f
feat: Add placeholder text for member selection in WatcherList component
Kariamos Nov 4, 2025
8195771
feat: Add error toast notification for failed self-follow action in W…
Kariamos Nov 4, 2025
fbdaa7c
feat: Update watcher list modal title description for clarity
Kariamos Nov 4, 2025
20337b2
refactor: removed default translations in UserItem, UserList, WatchBu…
Kariamos Nov 4, 2025
a75d726
feat: Enhance watcher list modal title description with notification …
Kariamos Nov 4, 2025
a18a429
refactor: remove unused toast notification hook from UserItem component
Kariamos Nov 4, 2025
0f23bc6
Merge pull request #1459 from AppQuality/UN-1998-notification-panel-i…
d-beezee Nov 4, 2025
dc7d7fd
fix: update eye-icon-slash.svg for improved visual consistency
Kariamos Nov 4, 2025
618a423
refactor: improve icon handling and color logic in WatchButton component
Kariamos Nov 4, 2025
62bbf87
feat: add Italian translations for watcher list modal messages
Kariamos Nov 4, 2025
b1c7fdf
feat: enhance EmptyState component to display messages based on watch…
Kariamos Nov 4, 2025
f49e1c0
feat: add tooltip to disabled remove button in UserItem component
Kariamos Nov 4, 2025
d90aee9
fix: adjust button size in WatcherList component for consistency
Kariamos Nov 4, 2025
dda95ba
feat: add save icon SVG for improved UI consistency
Kariamos Nov 4, 2025
896f89a
feat: update save configuration button with tooltip and icon for bett…
Kariamos Nov 4, 2025
9c92e79
feat: add tooltip to watcher list button for enhanced user guidance
Kariamos Nov 4, 2025
7e002c6
refactor: remove unused StyledPipe component from Controls
Kariamos Nov 4, 2025
be60264
refactor: remove unused imports and optimize SaveConfigurationButton …
Kariamos Nov 4, 2025
068d056
feat: Add basic structure for watchers on submit
d-beezee Nov 4, 2025
c9893b8
feat: add tooltip for disabled follow button in watcher list modal fo…
Kariamos Nov 5, 2025
b0e99a6
feat: update WatchButton to manage disabled state based on workspace …
Kariamos Nov 5, 2025
5907d83
feat: Add mutation for updating plan watchers and adjust watcher ID m…
d-beezee Nov 5, 2025
c45c0a5
feat: Add put mutation for updating plan watchers with tag invalidation
d-beezee Nov 5, 2025
ecd78b3
fix: Adjust condition in useEffect to simplify data dependency check
d-beezee Nov 5, 2025
8905394
Merge pull request #1462 from AppQuality/UN-1999
d-beezee Nov 5, 2025
24ffb77
Merge pull request #1460 from AppQuality/UN-1998-ui-fixes
d-beezee Nov 5, 2025
de51867
Merge branch 'UN-1998' into UN-2021-update-plan-header
d-beezee Nov 5, 2025
1f49c0b
Merge pull request #1461 from AppQuality/UN-2021-update-plan-header
d-beezee Nov 5, 2025
9185aa3
feat: Remove pending users from select
d-beezee Nov 5, 2025
390b5db
feat: Refactor WatchButton to use custom hook for workspace access
d-beezee Nov 5, 2025
38c98c3
feat: Replace div with IconButton for improved accessibility in Watch…
d-beezee Nov 5, 2025
db5b807
feat: Update Tooltip sizes for improved visibility in UserItem and Wa…
d-beezee Nov 5, 2025
b98ad2b
feat: Enhance watcher labels to indicate current user in Watchers modal
d-beezee Nov 5, 2025
432ead2
feat: Update WatchButton condition and increase TooltipModal maxHeigh…
Kariamos Nov 5, 2025
4ecc6a4
feat: Update watcher list alert texts for clarity and improved user g…
Kariamos Nov 6, 2025
3fe939b
feat: Improve EmptyState rendering logic for single watcher scenario
Kariamos Nov 6, 2025
372afb6
feat: add notification settings feature with UI components and transl…
iDome89 Nov 6, 2025
5a44376
Merge branch 'UN-1998' of github.com:AppQuality/unguess-react into UN…
iDome89 Nov 6, 2025
e519699
feat: add follow activities section with button and description in Fo…
iDome89 Nov 7, 2025
96456b8
feat: update FollowActivitiesPanel with new descriptions and hint tex…
iDome89 Nov 7, 2025
a132f51
feat: Add example JSON files for GET, POST, and PUT requests in watch…
Kariamos Nov 7, 2025
d8d210a
Merge pull request #1464 from AppQuality/UN-1998-more-ui-fixes
d-beezee Nov 7, 2025
25d1966
feat: Update JSON test files and add mock for watchers API
d-beezee Nov 7, 2025
1cfdb90
feat: Rename mockGetWatchers to mockWatchers and enhance its function…
d-beezee Nov 7, 2025
eb43ca7
feat: Update mock data and enhance testing setup for workspace users
d-beezee Nov 7, 2025
551889a
feat: Update JSON test files with new IDs and descriptions for tasks …
d-beezee Nov 7, 2025
86302cb
feat: Refactor tasks module tests to import API data and enhance mock…
d-beezee Nov 7, 2025
17fb03d
feat: Limit maximum selectable watchers before +X to 3 in the Watcher…
Kariamos Nov 7, 2025
acc19d8
Merge pull request #1466 from AppQuality/UN-1998
d-beezee Nov 7, 2025
c8a3571
feat: enhance notification settings with new fields and improved chec…
iDome89 Nov 7, 2025
0821fa4
feat: implement notification preferences update functionality with su…
iDome89 Nov 7, 2025
8faed43
feat: update notification settings success and error messages for imp…
iDome89 Nov 7, 2025
65c2003
feat: add functionality to unfollow activities with success and error…
iDome89 Nov 10, 2025
a85957a
feat: update FollowActivitiesPanel to display activity names and proj…
iDome89 Nov 10, 2025
78f1406
feat: enhance FollowActivitiesPanel to use dynamic profile ID for unf…
iDome89 Nov 10, 2025
5c6d1ce
feat: update @appquality/unguess-design-system to version 4.0.51 in p…
iDome89 Nov 11, 2025
7bdc6ab
feat: add UnfollowButton component with tooltip for disabled state an…
iDome89 Nov 11, 2025
c1393c9
feat: enhance Profile page with active tab state management and updat…
iDome89 Nov 11, 2025
5b52093
feat: update responsive breakpoints for accordions and refine transla…
iDome89 Nov 11, 2025
6685fe4
refactor: Remove unused preferences query and related settings from p…
Kariamos Nov 5, 2025
6849c97
Merge pull request #1463 from AppQuality/UN-2041-remove-notification-…
Kariamos Nov 12, 2025
b5ec1e7
Merge pull request #1467 from AppQuality/UN-2040
d-beezee Nov 13, 2025
570c301
feat: add TooltipModalContext for managing modal references in Observ…
iacopolea Oct 20, 2025
0a2c27a
fix: update unguess-design-system dependency to version 4.0.51 canary…
iacopolea Oct 20, 2025
05c86cc
fix: update TooltipModalContext to use HTMLDivElement instead of HTML…
iacopolea Oct 22, 2025
aae4d40
fix: update unguess-design-system dependency version in package.json …
iacopolea Oct 28, 2025
82117dd
fix: refactor edit modal handling in TitleDropdown component
iacopolea Oct 28, 2025
170ff46
fix: update TitleDropdown component to toggle expansion on click and …
iacopolea Oct 28, 2025
355e286
test: add end-to-end tests for Video page edit dialog functionality
iacopolea Oct 30, 2025
ba68f9f
squash: all changes from UN-408-tooltip-modal-spike for new branch UN…
iacopolea Nov 4, 2025
533a4ca
feat: enhance video tags and themes editing functionality with new mo…
iacopolea Nov 6, 2025
7df4b30
fix: remove console logs from TitleDropdown and Video page mock API r…
iacopolea Nov 6, 2025
fae5b0c
feat: update video tag editing functionality with new modal and impro…
iacopolea Nov 7, 2025
8c23af0
fix: ensure observation accordion is scrolled into view before openin…
iacopolea Nov 7, 2025
7d6f1ce
chore validate
iacopolea Nov 7, 2025
c9f7502
restore mock
iacopolea Nov 7, 2025
ca655cd
fix: update unguess-design-system version and improve translation key…
iacopolea Nov 7, 2025
ea614e7
feat: add Enter key functionality to submit tag edits in EditTagModal
iacopolea Nov 7, 2025
817ec21
feat: enhance EditTagModal and TitleDropdown with dynamic title, labe…
iacopolea Nov 10, 2025
fb90618
fix: update @appquality/unguess-design-system version to correct cana…
iacopolea Nov 10, 2025
664f385
fix: update @appquality/unguess-design-system version to 4.0.52 canary
iacopolea Nov 11, 2025
20f8245
feat: update video page test suite to improve themes and tags editing…
iacopolea Nov 11, 2025
8f5e735
refactor: simplify options mapping in TitleDropdown component
iacopolea Nov 11, 2025
c9c5a76
feat: enable option creation in TitleDropdown component
iacopolea Nov 11, 2025
f6eb4de
chore: update @appquality/unguess-design-system version
iacopolea Nov 12, 2025
a9bd10e
fix: remove focus on input element in handleAccordionChange function
iacopolea Nov 13, 2025
1dbc501
fix: adjust scroll position to account for header height in Observati…
iacopolea Nov 13, 2025
226f3ff
chore: update @appquality/unguess-design-system version
iacopolea Nov 14, 2025
b9c9a1c
feat: add edit icon to action items in ObservationForm and TitleDropd…
iacopolea Nov 17, 2025
f8f8813
Merge pull request #1465 from AppQuality/UN-1954
marcbon Nov 17, 2025
c218b06
feat: integrate analytics tracking for tag updates and dropdown inter…
iacopolea Nov 13, 2025
10d0198
fix: move null check for titles to fix hooks error order
iacopolea Nov 14, 2025
34d8678
Merge pull request #1468 from AppQuality/UN-1960-tag-edit-analytics
marcbon Nov 17, 2025
6a689b6
fix: change autocomplete inputvalue logic from label to children to a…
iacopolea Nov 17, 2025
94e4845
Merge pull request #1470 from AppQuality/fix-autocomplete
d-beezee Nov 17, 2025
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
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"@analytics/google-tag-manager": "^0.6.0",
"@analytics/hubspot": "^0.5.1",
"@appquality/languages": "1.4.3",
"@appquality/unguess-design-system": "4.0.50",
"@appquality/unguess-design-system": "4.0.53",
"@atlaskit/pragmatic-drag-and-drop": "^1.7.4",
"@atlaskit/pragmatic-drag-and-drop-flourish": "^2.0.3",
"@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.1.0",
Expand All @@ -22,6 +22,7 @@
"i18n-iso-countries": "^7.3.0",
"i18next": "^23.15.1",
"i18next-browser-languagedetector": "^8.0.0",
"mailchecker": "^6.0.19",
"motion": "^12.16.0",
"qs": "^6.10.3",
"query-string": "^7.1.1",
Expand Down Expand Up @@ -130,4 +131,4 @@
"*.{tsx,ts,js,css,md}": "prettier --write"
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}
}
3 changes: 3 additions & 0 deletions src/assets/icons/email-icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/assets/icons/eye-icon-fill.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions src/assets/icons/eye-icon-slash.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/assets/icons/eye-icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/assets/icons/save-icon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/assets/icons/save.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions src/common/disposableEmail.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import MailChecker from 'mailchecker';

export function isDisposableEmail(email: string): any {
return !MailChecker.isValid(email);
}
217 changes: 204 additions & 13 deletions src/common/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@ export interface paths {
};
"/buy": {
/**
* Stripe webhook destination, listen three event types:
* - charge.failed,
* - checkout.session.completed
* - checkout.session.expired
* Stripe webhook destination, listen following event types:
* - checkout.session.completed (Occurs when a Checkout Session has been successfully completed)
* - checkout.session.expired (Occurs when a Checkout Session is expired)
* - checkout.session.async_payment_failed (Occurs when a payment intent using a delayed payment method fails)
* - checkout.session.async_payment_succeeded (Occurs when a payment intent using a delayed payment method finally succeeds)
* - charge.refunded (Occurs whenever a charge is refunded, including partial refunds. Listen to refund.created for information about the refund)
*/
post: operations["post-buy"];
};
Expand Down Expand Up @@ -296,6 +298,15 @@ export interface paths {
};
};
};
"/campaigns/{cid}/video-tags/{tagId}": {
patch: operations["patch-campaigns-cid-video-tags-tagId"];
parameters: {
path: {
cid: string;
tagId: string;
};
};
};
"/campaigns/{cid}/videos": {
/** Return all published video for a specific campaign */
get: operations["get-campaigns-cid-videos"];
Expand Down Expand Up @@ -475,6 +486,10 @@ export interface paths {
};
};
};
"/users/me/watched/plans": {
get: operations["get-users-me-watched-plans"];
parameters: {};
};
"/users/roles": {
get: operations["get-users-roles"];
parameters: {};
Expand Down Expand Up @@ -622,6 +637,17 @@ export interface paths {
};
};
};
"/plans/{pid}/watchers": {
/** Returns all the watcher added to a plan. It always returns at least one item. */
get: operations["get-plans-pid-watchers"];
put: operations["put-plans-pid-watchers"];
post: operations["post-plans-pid-watchers"];
parameters: {
path: {
pid: string;
};
};
};
"/workspaces/{wid}/templates": {
get: operations["get-workspaces-templates"];
post: operations["post-workspaces-wid-templates"];
Expand Down Expand Up @@ -656,6 +682,15 @@ export interface paths {
};
};
};
"/plans/{pid}/watchers/{profile_id}": {
delete: operations["delete-plans-pid-watchers-profile_id"];
parameters: {
path: {
pid: string;
profile_id: string;
};
};
};
}

export interface components {
Expand Down Expand Up @@ -1332,8 +1367,7 @@ export interface components {
kind: "app";
os: {
ios?: string;
linux?: string;
windows?: string;
android?: string;
};
};
/** OutputModuleTouchpointsWebDesktop */
Expand Down Expand Up @@ -1442,7 +1476,8 @@ export interface components {
| "module_type"
| "number_of_testers"
| "number_of_tasks"
| "task_type";
| "task_type"
| "duplicate_touchpoint_form_factors";
/** Report */
Report: {
creation_date?: string;
Expand Down Expand Up @@ -1999,10 +2034,12 @@ export interface operations {
requestBody: components["requestBodies"]["Credentials"];
};
/**
* Stripe webhook destination, listen three event types:
* - charge.failed,
* - checkout.session.completed
* - checkout.session.expired
* Stripe webhook destination, listen following event types:
* - checkout.session.completed (Occurs when a Checkout Session has been successfully completed)
* - checkout.session.expired (Occurs when a Checkout Session is expired)
* - checkout.session.async_payment_failed (Occurs when a payment intent using a delayed payment method fails)
* - checkout.session.async_payment_succeeded (Occurs when a payment intent using a delayed payment method finally succeeds)
* - charge.refunded (Occurs whenever a charge is refunded, including partial refunds. Listen to refund.created for information about the refund)
*/
"post-buy": {
responses: {
Expand All @@ -2027,13 +2064,17 @@ export interface operations {
key: string;
tag: string;
};
/** @enum {string} */
payment_status?: "paid" | "unpaid";
};
};
/** @enum {undefined} */
type:
| "checkout.session.completed"
| "checkout.session.async_payment_succeeded"
| "checkout.session.async_payment_failed"
| "checkout.session.expired";
| "checkout.session.completed"
| "checkout.session.expired"
| "charge.refunded";
};
};
};
Expand Down Expand Up @@ -3119,6 +3160,37 @@ export interface operations {
};
};
};
"patch-campaigns-cid-video-tags-tagId": {
parameters: {
path: {
cid: string;
tagId: string;
};
};
responses: {
/** OK */
200: {
content: {
"application/json": { [key: string]: unknown };
};
};
/** Bad Request */
400: unknown;
/** Conflict */
409: {
content: {
"application/json": { [key: string]: unknown };
};
};
};
requestBody: {
content: {
"application/json": {
newTagName: string;
};
};
};
};
/** Return all published video for a specific campaign */
"get-campaigns-cid-videos": {
parameters: {
Expand Down Expand Up @@ -3864,6 +3936,31 @@ export interface operations {
};
};
};
"get-users-me-watched-plans": {
parameters: {};
responses: {
200: {
content: {
"application/json": {
items: {
id?: number;
name?: string;
project?: {
name?: string;
id?: number;
};
isLast?: boolean;
}[];
allItems: number;
};
};
};
400: components["responses"]["Error"];
403: components["responses"]["Error"];
404: components["responses"]["Error"];
500: components["responses"]["Error"];
};
};
"get-users-roles": {
parameters: {};
responses: {
Expand Down Expand Up @@ -4393,6 +4490,81 @@ export interface operations {
500: components["responses"]["Error"];
};
};
/** Returns all the watcher added to a plan. It always returns at least one item. */
"get-plans-pid-watchers": {
parameters: {
path: {
pid: string;
};
};
responses: {
/** OK */
200: {
content: {
"application/json": {
items: {
id: number;
name: string;
surname: string;
email: string;
image?: string;
isInternal: boolean;
}[];
};
};
};
403: components["responses"]["Error"];
404: components["responses"]["Error"];
500: components["responses"]["Error"];
};
};
"put-plans-pid-watchers": {
parameters: {
path: {
pid: string;
};
};
responses: {
/** OK */
200: unknown;
400: components["responses"]["Error"];
403: components["responses"]["Error"];
404: components["responses"]["Error"];
500: components["responses"]["Error"];
};
requestBody: {
content: {
"application/json": {
users: {
id: number;
}[];
};
};
};
};
"post-plans-pid-watchers": {
parameters: {
path: {
pid: string;
};
};
responses: {
/** OK */
200: unknown;
403: components["responses"]["Error"];
404: components["responses"]["Error"];
500: components["responses"]["Error"];
};
requestBody: {
content: {
"application/json": {
users: {
id: number;
}[];
};
};
};
};
"get-workspaces-templates": {
parameters: {
path: {
Expand Down Expand Up @@ -4596,6 +4768,25 @@ export interface operations {
};
};
};
"delete-plans-pid-watchers-profile_id": {
parameters: {
path: {
pid: string;
profile_id: string;
};
};
responses: {
/** OK */
200: {
content: {
"application/json": {
success?: boolean;
};
};
};
403: components["responses"]["Error"];
};
};
}

export interface external {}
1 change: 1 addition & 0 deletions src/features/api/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export const apiSlice = createApi({
'Tags',
'CustomStatuses',
'Bug',
'PlanWatchers',
'BugComments',
'Preferences',
'VideoTags',
Expand Down
Loading
Loading