Skip to content

Commit f8ac61d

Browse files
billyvgsoerface
andauthored
feat(feedback/v7): Make "required" text for input elements configurable (#11287)
Backport of #11153 From the OP (h/t @soerface): This introduces an option `isRequiredLabel`, and I planned to also add `errorMessageText`. However, this PR is branched off from a version that is a couple days old. Right now, @c298lee is currently working on getsentry/sentry#63749, which is causing major changes and the current version on master doesn't work yet. Therefore, I didn't yet implement `errorMessageText`. So consider this PR as a PoC, and either feel free to tag me when the screenshot changes are done – then I'll redo the changes based on the version that supports screenshots – or add the option on your own; however you prefer 🙂 --------- Co-authored-by: Soeren Wegener <[email protected]>
1 parent 16dc092 commit f8ac61d

File tree

8 files changed

+25
-6
lines changed

8 files changed

+25
-6
lines changed

packages/feedback/src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export const MESSAGE_PLACEHOLDER = "What's the bug? What did you expect?";
7070
export const MESSAGE_LABEL = 'Description';
7171
export const NAME_PLACEHOLDER = 'Your Name';
7272
export const NAME_LABEL = 'Name';
73+
export const IS_REQUIRED_LABEL = '(required)';
7374
export const SUCCESS_MESSAGE_TEXT = 'Thank you for your report!';
7475

7576
export const FEEDBACK_WIDGET_SOURCE = 'widget';

packages/feedback/src/integration.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
EMAIL_LABEL,
99
EMAIL_PLACEHOLDER,
1010
FORM_TITLE,
11+
IS_REQUIRED_LABEL,
1112
MESSAGE_LABEL,
1213
MESSAGE_PLACEHOLDER,
1314
NAME_LABEL,
@@ -105,6 +106,7 @@ export class Feedback implements Integration {
105106
messageLabel = MESSAGE_LABEL,
106107
namePlaceholder = NAME_PLACEHOLDER,
107108
nameLabel = NAME_LABEL,
109+
isRequiredLabel = IS_REQUIRED_LABEL,
108110
successMessageText = SUCCESS_MESSAGE_TEXT,
109111

110112
onFormClose,
@@ -152,6 +154,7 @@ export class Feedback implements Integration {
152154
messagePlaceholder,
153155
nameLabel,
154156
namePlaceholder,
157+
isRequiredLabel,
155158
successMessageText,
156159

157160
onFormClose,

packages/feedback/src/types/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ export interface FeedbackTextConfiguration {
149149
* Message after feedback was sent successfully
150150
*/
151151
successMessageText: string;
152+
153+
/**
154+
* Label shown when an input field is required
155+
*/
156+
isRequiredLabel: string;
152157
}
153158

154159
/**

packages/feedback/src/widget/Form.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export function Form({
5353
emailPlaceholder,
5454
messageLabel,
5555
messagePlaceholder,
56+
isRequiredLabel,
5657
cancelButtonLabel,
5758
submitButtonLabel,
5859

@@ -176,7 +177,8 @@ export function Form({
176177
'span',
177178
{ className: 'form__label__text' },
178179
nameLabel,
179-
isNameRequired && createElement('span', { className: 'form__label__text--required' }, ' (required)'),
180+
isNameRequired &&
181+
createElement('span', { className: 'form__label__text--required' }, ` ${isRequiredLabel}`),
180182
),
181183
nameEl,
182184
],
@@ -195,7 +197,8 @@ export function Form({
195197
'span',
196198
{ className: 'form__label__text' },
197199
emailLabel,
198-
isEmailRequired && createElement('span', { className: 'form__label__text--required' }, ' (required)'),
200+
isEmailRequired &&
201+
createElement('span', { className: 'form__label__text--required' }, ` ${isRequiredLabel}`),
199202
),
200203
emailEl,
201204
],
@@ -213,7 +216,7 @@ export function Form({
213216
'span',
214217
{ className: 'form__label__text' },
215218
messageLabel,
216-
createElement('span', { className: 'form__label__text--required' }, ' (required)'),
219+
createElement('span', { className: 'form__label__text--required' }, ` ${isRequiredLabel}`),
217220
),
218221
messageEl,
219222
],

packages/feedback/src/widget/createWidget.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ export function createWidget({
200200
messagePlaceholder: options.messagePlaceholder,
201201
nameLabel: options.nameLabel,
202202
namePlaceholder: options.namePlaceholder,
203+
isRequiredLabel: options.isRequiredLabel,
203204
defaultName: (userKey && user && user[userKey.name]) || '',
204205
defaultEmail: (userKey && user && user[userKey.email]) || '',
205206
onClosed: () => {

packages/feedback/test/widget/Dialog.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ function renderDialog({
2323
messagePlaceholder = 'What is the issue?',
2424
cancelButtonLabel = 'Cancel!',
2525
submitButtonLabel = 'Submit!',
26+
isRequiredLabel = '(needed!)',
2627
...rest
2728
}: Partial<DialogProps> = {}) {
2829
return Dialog({
@@ -44,6 +45,7 @@ function renderDialog({
4445
messagePlaceholder,
4546
cancelButtonLabel,
4647
submitButtonLabel,
48+
isRequiredLabel,
4749
...rest,
4850
}) as NonNullableFields<ReturnType<typeof Dialog>>;
4951
}

packages/feedback/test/widget/Form.test.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ function renderForm({
2020
messagePlaceholder = 'What is the issue?',
2121
cancelButtonLabel = 'Cancel!',
2222
submitButtonLabel = 'Submit!',
23+
isRequiredLabel = '(needed!)',
2324
...rest
2425
}: Partial<FormComponentProps> = {}) {
2526
return Form({
@@ -37,6 +38,7 @@ function renderForm({
3738
messagePlaceholder,
3839
cancelButtonLabel,
3940
submitButtonLabel,
41+
isRequiredLabel,
4042
...rest,
4143
}) as NonNullableFields<ReturnType<typeof Form>>;
4244
}
@@ -89,9 +91,9 @@ describe('Form', () => {
8991
const nameLabel = formComponent.el.querySelector('label[htmlFor="name"]') as HTMLLabelElement;
9092
const emailLabel = formComponent.el.querySelector('label[htmlFor="email"]') as HTMLLabelElement;
9193
const messageLabel = formComponent.el.querySelector('label[htmlFor="message"]') as HTMLLabelElement;
92-
expect(nameLabel.textContent).toBe('Name! (required)');
93-
expect(emailLabel.textContent).toBe('Email! (required)');
94-
expect(messageLabel.textContent).toBe('Description! (required)');
94+
expect(nameLabel.textContent).toBe('Name! (needed!)');
95+
expect(emailLabel.textContent).toBe('Email! (needed!)');
96+
expect(messageLabel.textContent).toBe('Description! (needed!)');
9597

9698
const nameInput = formComponent.el.querySelector('[name="name"]') as HTMLInputElement;
9799
const emailInput = formComponent.el.querySelector('[name="email"]') as HTMLInputElement;

packages/feedback/test/widget/createWidget.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
EMAIL_LABEL,
66
EMAIL_PLACEHOLDER,
77
FORM_TITLE,
8+
IS_REQUIRED_LABEL,
89
MESSAGE_LABEL,
910
MESSAGE_PLACEHOLDER,
1011
NAME_LABEL,
@@ -47,6 +48,7 @@ const DEFAULT_OPTIONS = {
4748
messageLabel: MESSAGE_LABEL,
4849
namePlaceholder: NAME_PLACEHOLDER,
4950
nameLabel: NAME_LABEL,
51+
isRequiredLabel: IS_REQUIRED_LABEL,
5052
successMessageText: SUCCESS_MESSAGE_TEXT,
5153

5254
onFormClose: jest.fn(),

0 commit comments

Comments
 (0)