Skip to content

Commit

Permalink
remove billable_rate_update_time_entries flag and always update all t…
Browse files Browse the repository at this point in the history
…ime entries
  • Loading branch information
Onatcer authored and korridor committed Jul 15, 2024
1 parent 1dc35f1 commit 7aab3d9
Show file tree
Hide file tree
Showing 14 changed files with 34 additions and 241 deletions.
41 changes: 1 addition & 40 deletions e2e/members.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,42 +76,6 @@ test('test that error shows if no role is selected', async ({ page }) => {
]);
});

test('test that member billable rate can be updated', async ({ page }) => {
await goToMembersPage(page);
const newBillableRate = Math.round(Math.random() * 10000);
await page.getByRole('row').first().getByRole('button').click();
await page.getByRole('button').getByText('Edit').first().click();
await page.getByText('Organization Default Rate').click();
await page.getByText('Custom Rate').click();
await page
.getByPlaceholder('Billable Rate')
.fill(newBillableRate.toString());
await page.getByRole('button', { name: 'Update Member' }).click();

await Promise.all([
page
.getByRole('button', { name: 'No, only for new time entries' })
.click(),
page.waitForRequest(
async (request) =>
request.url().includes('/members/') &&
request.method() === 'PUT' &&
request.postDataJSON().billable_rate ===
newBillableRate * 100 &&
request.postDataJSON().billable_rate_update_time_entries ===
false
),
page.waitForResponse(
async (response) =>
response.url().includes('/organizations/') &&
response.request().method() === 'PUT' &&
response.status() === 200 &&
(await response.json()).data.billable_rate ===
newBillableRate * 100
),
]);
});

test('test that organization billable rate can be updated with all existing time entries', async ({
page,
}) => {
Expand All @@ -132,10 +96,7 @@ test('test that organization billable rate can be updated with all existing time
async (request) =>
request.url().includes('/members/') &&
request.method() === 'PUT' &&
request.postDataJSON().billable_rate ===
newBillableRate * 100 &&
request.postDataJSON().billable_rate_update_time_entries ===
true
request.postDataJSON().billable_rate === newBillableRate * 100
),
page.waitForResponse(
async (response) =>
Expand Down
42 changes: 1 addition & 41 deletions e2e/organization.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,43 +17,6 @@ test('test that organization name can be updated', async ({ page }) => {
).toContainText('NEW ORG NAME');
});

test('test that organization billable rate can be updated', async ({
page,
}) => {
await goToOrganizationSettings(page);
const newBillableRate = Math.round(Math.random() * 10000);
await page.getByLabel('Organization Billable Rate').click();
await page
.getByLabel('Organization Billable Rate')
.fill(newBillableRate.toString());
await page
.locator('button')
.filter({ hasText: /^Save$/ })
.click();
await Promise.all([
page
.getByRole('button', { name: 'No, only for new time entries' })
.click(),
page.waitForRequest(
async (request) =>
request.url().includes('/organizations/') &&
request.method() === 'PUT' &&
request.postDataJSON().billable_rate ===
newBillableRate * 100 &&
request.postDataJSON().billable_rate_update_time_entries ===
false
),
page.waitForResponse(
async (response) =>
response.url().includes('/organizations/') &&
response.request().method() === 'PUT' &&
response.status() === 200 &&
(await response.json()).data.billable_rate ===
newBillableRate * 100
),
]);
});

test('test that organization billable rate can be updated with all existing time entries', async ({
page,
}) => {
Expand All @@ -75,10 +38,7 @@ test('test that organization billable rate can be updated with all existing time
async (request) =>
request.url().includes('/organizations/') &&
request.method() === 'PUT' &&
request.postDataJSON().billable_rate ===
newBillableRate * 100 &&
request.postDataJSON().billable_rate_update_time_entries ===
true
request.postDataJSON().billable_rate === newBillableRate * 100
),
page.waitForResponse(
async (response) =>
Expand Down
65 changes: 1 addition & 64 deletions e2e/project-members.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,66 +7,6 @@ async function goToProjectsOverview(page: Page) {
await page.goto(PLAYWRIGHT_BASE_URL + '/projects');
}

test('test that updating project member billable rate works', async ({
page,
}) => {
const newProjectName =
'New Project ' + Math.floor(1 + Math.random() * 10000);
const newBillableRate = Math.round(Math.random() * 10000);
await goToProjectsOverview(page);
await page.getByRole('button', { name: 'Create Project' }).click();
await page.getByLabel('Project Name').fill(newProjectName);

await page.getByRole('button', { name: 'Create Project' }).nth(1).click();
await expect(page.getByText(newProjectName)).toBeVisible();

await page.getByText(newProjectName).click();
await page.getByRole('button', { name: 'Add Member' }).click();

await expect(page.getByText('Add Project Member').first()).toBeVisible();
await page.keyboard.press('Enter');
await page.getByRole('button', { name: 'Add Project Member' }).click();

await page
.getByTestId('project_member_table')
.getByRole('row')
.first()
.getByRole('button')
.click();
await page.getByRole('button', { name: 'Edit' }).first().click();
await page.getByLabel('Billable Rate').fill(newBillableRate.toString());
await page.getByRole('button', { name: 'Update Project Member' }).click();

await Promise.all([
page
.getByRole('button', { name: 'No, only for new time entries' })
.click(),
page.waitForRequest(
async (request) =>
request.url().includes('/project-members/') &&
request.method() === 'PUT' &&
request.postDataJSON().billable_rate ===
newBillableRate * 100 &&
request.postDataJSON().billable_rate_update_time_entries ===
false
),
page.waitForResponse(
async (response) =>
response.url().includes('/project-members/') &&
response.request().method() === 'PUT' &&
response.status() === 200 &&
(await response.json()).data.billable_rate ===
newBillableRate * 100
),
]);
await expect(
page
.getByRole('row')
.first()
.getByText(formatCents(newBillableRate * 100))
).toBeVisible();
});

test('test that updating project member billable rate works for existing time entries', async ({
page,
}) => {
Expand Down Expand Up @@ -103,10 +43,7 @@ test('test that updating project member billable rate works for existing time en
async (request) =>
request.url().includes('/project-members/') &&
request.method() === 'PUT' &&
request.postDataJSON().billable_rate ===
newBillableRate * 100 &&
request.postDataJSON().billable_rate_update_time_entries ===
true
request.postDataJSON().billable_rate === newBillableRate * 100
),
page.waitForResponse(
async (response) =>
Expand Down
55 changes: 1 addition & 54 deletions e2e/projects.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,56 +86,6 @@ test('test that archiving and unarchiving projects works', async ({ page }) => {
]);
});

test('test that updating billable rate works', async ({ page }) => {
const newProjectName =
'New Project ' + Math.floor(1 + Math.random() * 10000);
const newBillableRate = Math.round(Math.random() * 10000);
await goToProjectsOverview(page);
await page.getByRole('button', { name: 'Create Project' }).click();
await page.getByLabel('Project Name').fill(newProjectName);

await page.getByRole('button', { name: 'Create Project' }).nth(1).click();
await expect(page.getByText(newProjectName)).toBeVisible();

await page.getByRole('row').first().getByRole('button').click();
await page.getByRole('button').getByText('Edit').first().click(),
await page.getByText('Non-Billable').click();
await page.getByText('Custom Rate').click();
await page
.getByPlaceholder('Billable Rate')
.fill(newBillableRate.toString());
await page.getByRole('button', { name: 'Update Project' }).click();

await Promise.all([
page
.getByRole('button', { name: 'No, only for new time entries' })
.click(),
page.waitForRequest(
async (request) =>
request.url().includes('/projects/') &&
request.method() === 'PUT' &&
request.postDataJSON().billable_rate ===
newBillableRate * 100 &&
request.postDataJSON().billable_rate_update_time_entries ===
false
),
page.waitForResponse(
async (response) =>
response.url().includes('/projects/') &&
response.request().method() === 'PUT' &&
response.status() === 200 &&
(await response.json()).data.billable_rate ===
newBillableRate * 100
),
]);
await expect(
page
.getByRole('row')
.first()
.getByText(formatCents(newBillableRate * 100))
).toBeVisible();
});

test('test that updating billable rate works with existing time entries', async ({
page,
}) => {
Expand Down Expand Up @@ -166,10 +116,7 @@ test('test that updating billable rate works with existing time entries', async
async (request) =>
request.url().includes('/projects/') &&
request.method() === 'PUT' &&
request.postDataJSON().billable_rate ===
newBillableRate * 100 &&
request.postDataJSON().billable_rate_update_time_entries ===
true
request.postDataJSON().billable_rate === newBillableRate * 100
),
page.waitForResponse(
async (response) =>
Expand Down
24 changes: 13 additions & 11 deletions openapi.json.client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,7 @@ const MemberPivotResource = z
})
.passthrough();
const updateMember_Body = z
.object({
role: Role,
billable_rate: z.union([z.number(), z.null()]),
billable_rate_update_time_entries: z.boolean(),
})
.object({ role: Role, billable_rate: z.union([z.number(), z.null()]) })
.partial()
.passthrough();
const MemberResource = z
Expand All @@ -66,7 +62,6 @@ const updateOrganization_Body = z
.object({
name: z.string(),
billable_rate: z.union([z.number(), z.null()]).optional(),
billable_rate_update_time_entries: z.boolean().optional(),
})
.passthrough();
const ProjectResource = z
Expand Down Expand Up @@ -97,7 +92,6 @@ const updateProject_Body = z
is_archived: z.boolean().optional(),
client_id: z.union([z.string(), z.null()]).optional(),
billable_rate: z.union([z.number(), z.null()]).optional(),
billable_rate_update_time_entries: z.boolean().optional(),
})
.passthrough();
const ProjectMemberResource = z
Expand All @@ -115,10 +109,7 @@ const createProjectMember_Body = z
})
.passthrough();
const updateProjectMember_Body = z
.object({
billable_rate: z.union([z.number(), z.null()]),
billable_rate_update_time_entries: z.boolean(),
})
.object({ billable_rate: z.union([z.number(), z.null()]) })
.partial()
.passthrough();
const TagResource = z
Expand Down Expand Up @@ -869,6 +860,17 @@ const endpoints = makeApi([
],
response: z.object({ data: MemberResource }).passthrough(),
errors: [
{
status: 400,
description: `API exception`,
schema: z
.object({
error: z.boolean(),
key: z.string(),
message: z.string(),
})
.passthrough(),
},
{
status: 403,
description: `Authorization error`,
Expand Down
10 changes: 2 additions & 8 deletions resources/js/Components/Common/BillableRateModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const show = defineModel('show', { default: false });
const saving = defineModel('saving', { default: false });
const emit = defineEmits<{
submit: [billable_rate_update_time_entries: boolean];
submit: [];
}>();
defineProps<{
Expand All @@ -31,15 +31,9 @@ defineProps<{
<PrimaryButton
:class="{ 'opacity-25': saving }"
:disabled="saving"
@click="emit('submit', true)">
@click="emit('submit')">
Yes, update existing time entries
</PrimaryButton>
<PrimaryButton
:class="{ 'opacity-25': saving }"
:disabled="saving"
@click="emit('submit', false)">
No, only for new time entries
</PrimaryButton>
</div>
<p class="text-center pt-3 pb-1">
Learn more about the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ defineProps<{
}>();
defineEmits<{
submit: [billable_rate_update_time_entries: boolean];
submit: [];
}>();
</script>

<template>
<BillableRateModal
@submit="(...args) => $emit('submit', ...args)"
@submit="$emit('submit')"
v-model:show="show"
v-model:saving="saving"
title="Update Member Billable Rate">
Expand Down
6 changes: 2 additions & 4 deletions resources/js/Components/Common/Member/MemberEditModal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,7 @@ const memberBody = ref<UpdateMemberBody>({
billable_rate: props.member.billable_rate,
});
async function submitBillableRate(billableRateUpdateTimeEntries: boolean) {
memberBody.value.billable_rate_update_time_entries =
billableRateUpdateTimeEntries;
async function submitBillableRate() {
if (memberBody.value.role === 'owner' && props.member.role !== 'owner') {
show.value = false;
showOwnershipTransferConfirmModal.value = true;
Expand Down Expand Up @@ -59,7 +57,7 @@ function saveWithChecks() {
show.value = false;
showOwnershipTransferConfirmModal.value = true;
} else {
submitBillableRate(false);
submitBillableRate();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ defineProps<{
}>();
defineEmits<{
submit: [billable_rate_update_time_entries: boolean];
submit: [];
}>();
</script>

<template>
<BillableRateModal
@submit="(...args) => $emit('submit', ...args)"
@submit="$emit('submit')"
v-model:show="show"
v-model:saving="saving"
title="Update Organization Billable Rate">
Expand Down
Loading

0 comments on commit 7aab3d9

Please sign in to comment.