diff --git a/resources/js/Components/CommandPalette/CommandPaletteProvider.vue b/resources/js/Components/CommandPalette/CommandPaletteProvider.vue index 43aa0e3c..910c766b 100644 --- a/resources/js/Components/CommandPalette/CommandPaletteProvider.vue +++ b/resources/js/Components/CommandPalette/CommandPaletteProvider.vue @@ -29,6 +29,7 @@ import ClientCreateModal from '@/Components/Common/Client/ClientCreateModal.vue' import TaskCreateModal from '@/Components/Common/Task/TaskCreateModal.vue'; import TagCreateModal from '@/packages/ui/src/Tag/TagCreateModal.vue'; import GoalCreateModal from '@/Components/Common/Goal/GoalCreateModal.vue'; +import UpgradeModal from '@/packages/ui/src/UpgradeModal.vue'; import MemberInviteModal from '@/Components/Common/Member/MemberInviteModal.vue'; import TimeEntryCreateModal from '@/packages/ui/src/TimeEntry/TimeEntryCreateModal.vue'; @@ -53,6 +54,7 @@ const { showCreateTaskModal, showCreateTagModal, showCreateGoalModal, + showGoalUpgradeModal, showInviteMemberModal, showCreateTimeEntryModal, showProjectSelector, @@ -185,6 +187,7 @@ const firstProjectId = computed(() => projects.value[0]?.id ?? ''); + diff --git a/resources/js/Components/Common/Goal/GoalCreateButton.test.ts b/resources/js/Components/Common/Goal/GoalCreateButton.test.ts new file mode 100644 index 00000000..52ef7cac --- /dev/null +++ b/resources/js/Components/Common/Goal/GoalCreateButton.test.ts @@ -0,0 +1,43 @@ +import { describe, it, expect } from 'vitest'; +import { mount } from '@vue/test-utils'; +import GoalCreateButton from './GoalCreateButton.vue'; + +function mountGoalCreateButton(canCreateMoreGoals: boolean) { + return mount(GoalCreateButton, { + props: { canCreateMoreGoals }, + slots: { default: 'Create your first goal' }, + global: { + stubs: { + GoalCreateModal: { name: 'GoalCreateModal', props: ['show'], template: '
' }, + UpgradeModal: { + name: 'UpgradeModal', + props: ['show', 'feature'], + template: '
', + }, + }, + }, + }); +} + +describe('GoalCreateButton', () => { + it('opens the create modal while more goals can be created', async () => { + const wrapper = mountGoalCreateButton(true); + + await wrapper.get('button').trigger('click'); + + expect(wrapper.getComponent({ name: 'GoalCreateModal' }).props('show')).toBe(true); + expect(wrapper.getComponent({ name: 'UpgradeModal' }).props('show')).toBe(false); + }); + + it('opens the upgrade modal once the goal limit is reached', async () => { + const wrapper = mountGoalCreateButton(false); + + expect(wrapper.get('button').text()).toBe('Create your first goal'); + await wrapper.get('button').trigger('click'); + + const upgradeModal = wrapper.getComponent({ name: 'UpgradeModal' }); + expect(upgradeModal.props('show')).toBe(true); + expect(upgradeModal.props('feature')).toBe('goals'); + expect(wrapper.getComponent({ name: 'GoalCreateModal' }).props('show')).toBe(false); + }); +}); diff --git a/resources/js/Components/Common/Goal/GoalCreateButton.vue b/resources/js/Components/Common/Goal/GoalCreateButton.vue new file mode 100644 index 00000000..17928e43 --- /dev/null +++ b/resources/js/Components/Common/Goal/GoalCreateButton.vue @@ -0,0 +1,31 @@ + + + diff --git a/resources/js/Components/Common/Goal/GoalTable.vue b/resources/js/Components/Common/Goal/GoalTable.vue index a5360828..53606f65 100644 --- a/resources/js/Components/Common/Goal/GoalTable.vue +++ b/resources/js/Components/Common/Goal/GoalTable.vue @@ -1,12 +1,9 @@