Skip to content

Commit

Permalink
feat(text-area): setup helper text props & slot
Browse files Browse the repository at this point in the history
  • Loading branch information
felipebritor committed Apr 15, 2023
1 parent af12cb3 commit 8abf3af
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/components/CvTextArea/CvTextArea.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@
>
<slot name="invalid-message">{{ invalidMessage }}</slot>
</div>
<div v-if="isHelper" :class="[`${carbonPrefix}--form__helper-text`]">
<slot name="helper-text">{{ helperText }}</slot>
</div>
</div>
</template>

Expand All @@ -43,6 +46,7 @@ import { carbonPrefix } from '../../global/settings';
import { useCvId, props as propsCvId } from '../../use/cvId';
const props = defineProps({
helperText: { type: String, default: undefined },
invalidMessage: { type: String, default: undefined },
label: String,
modelValue: String,
Expand All @@ -56,6 +60,7 @@ const slots = useSlots();
// Data
const isInvalid = ref(false);
const isHelper = ref(false);
// Computed
const errorId = computed(() => `error-${cvId.value}`);
Expand All @@ -66,6 +71,8 @@ function checkSlots() {
isInvalid.value = !!(
props.invalidMessage?.length || slots['invalid-message']
);
isHelper.value =
!isInvalid.value && !!(props.helperText?.length || slots['helper-text']);
}
// Life Hooks
Expand Down
65 changes: 65 additions & 0 deletions src/components/CvTextArea/__tests__/CvTextArea.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,4 +106,69 @@ describe('CvTextArea', () => {
expect(wrapper.classList.contains('bx--form-requirement')).toBeTruthy();
});
});

describe('Helper text', () => {
it("displays 'helper-text' slot content", () => {
const dummySlottedMessage = 'Slotted helper text';
const { getByText } = render(CvTextArea, {
slots: { 'helper-text': dummySlottedMessage },
});

const wrapper = getByText(dummySlottedMessage);
expect(wrapper.textContent).toBe(dummySlottedMessage);
expect(wrapper.classList.contains('bx--form__helper-text')).toBeTruthy();
});

it("displays 'helper-text' prop", () => {
const dummyHelperText = 'Prop helper text';
const { getByText } = render(CvTextArea, {
props: { helperText: dummyHelperText },
});

const wrapper = getByText(dummyHelperText);
expect(wrapper.textContent).toBe(dummyHelperText);
expect(wrapper.classList.contains('bx--form__helper-text')).toBeTruthy();
});

it('favors helper text slot when both prop and slot are set', () => {
const dummyHelperText = 'Prop helper text';
const dummySlottedMessage = 'Slotted helper text';
const { getByText } = render(CvTextArea, {
props: { helperText: dummyHelperText },
slots: { 'helper-text': dummySlottedMessage },
});

const wrapper = getByText(dummySlottedMessage);
expect(wrapper.textContent).toBe(dummySlottedMessage);
expect(wrapper.classList.contains('bx--form__helper-text')).toBeTruthy();
});

it('does not display helper text prop when invalid message slot is set', () => {
const dummyHelperText = 'Prop helper text';
const dummySlottedMessage = 'Slotted invalid message';
const { getByText, queryByText } = render(CvTextArea, {
props: { helperText: dummyHelperText },
slots: { 'invalid-message': dummySlottedMessage },
});

const wrapper = getByText(dummySlottedMessage);
expect(wrapper.textContent).toBe(dummySlottedMessage);
expect(queryByText(dummyHelperText)).toBeNull();
});

it('does not display helper slot when invalid message slot is set', () => {
const dummySlottedHelperMessage = 'Slotted helper text';
const dummySlottedInvalidMessage = 'Slotted invalid message';
const { getByText, queryByText } = render(CvTextArea, {
slots: {
'invalid-message': dummySlottedInvalidMessage,
'helper-text': dummySlottedHelperMessage,
},
});

const wrapper = getByText(dummySlottedInvalidMessage);
expect(wrapper.textContent).toBe(dummySlottedInvalidMessage);
expect(queryByText(dummySlottedHelperMessage)).toBeNull();
});
});
});

0 comments on commit 8abf3af

Please sign in to comment.