diff --git a/packages/client/src/components/chat/VoteViewer.svelte b/packages/client/src/components/chat/VoteViewer.svelte index faf329e..cb82601 100644 --- a/packages/client/src/components/chat/VoteViewer.svelte +++ b/packages/client/src/components/chat/VoteViewer.svelte @@ -14,6 +14,36 @@ const { isResultVisible } = $derived(myVotes()); let { selectedOptions } = $derived(proxify(myVotes())); + let numberOfAllVotes = $state(0); + + let numberOfVotesOfMostVotedOption = $state(0); + + let voteShareOfMostVotedOption = $state(0.0); + + let numbersOfVotersPerOption: number[] = $state([]); + + let selectedOptions: number[] = $state([]); + + if (vote.data) { + let tempNumbersOfVotersPerOption: number[] = []; + let tempNumberOfAllVotes = 0; + let max = 0; + for (let i = 0; i < vote.data.voteOptions.length; i++) { + let num = 0; + for (let j = 0; j < vote.data.voters.length; j++) { + if (vote.data.voters[j].votedOptions.includes(i)) { + num++; + } + } + if(num > max) max = num; + tempNumberOfAllVotes += num; + tempNumbersOfVotersPerOption.push(num); + } + numbersOfVotersPerOption = tempNumbersOfVotersPerOption; + numberOfAllVotes = tempNumberOfAllVotes; + voteShareOfMostVotedOption = tempNumberOfAllVotes? (max / tempNumberOfAllVotes) : 0; + numberOfVotesOfMostVotedOption = max; + interface CalculateVotesReturn { numbersOfVotersPerOption: number[]; } @@ -44,18 +74,34 @@ selectedOptions: [], }; } - function calculateVotes(): CalculateVotesReturn { - if (!vote.data) { - return { - numbersOfVotersPerOption: [], - }; - } - const numbersOfVotersPerOption: number[] = []; - for (let i = 0; i < vote.data.voteOptions.length; i++) { - let num = 0; - for (const voter of vote.data.voters) { - if (voter.votedOptions.includes(i)) { - num++; + + $effect(() => { + if (vote.data) { + let tempNumbersOfVotersPerOption: number[] = []; + let tempNumberOfAllVotes = 0; + let max = 0; + for (let i = 0; i < vote.data.voteOptions.length; i++) { + let num = 0; + for (let j = 0; j < vote.data.voters.length; j++) { + if (vote.data.voters[j].votedOptions.includes(i)) { + num++; + } + + } + if(num > max) max = num; + tempNumberOfAllVotes += num; + tempNumbersOfVotersPerOption.push(num); + } + numbersOfVotersPerOption = tempNumbersOfVotersPerOption; + numberOfAllVotes = tempNumberOfAllVotes; + voteShareOfMostVotedOption = tempNumberOfAllVotes? (max / tempNumberOfAllVotes) : 0; + numberOfVotesOfMostVotedOption = max; + if (me.data) { + for (let i = 0; i < vote.data.voters.length; i++) { + if (vote.data.voters[i].userId === me.data._id) { + selectedOptions = vote.data.voters[i].votedOptions; + isResultVisible = true; + } } } numbersOfVotersPerOption.push(num); @@ -93,24 +139,27 @@ } -{#if vote.data} -
-

投票:

-

{vote.data?.title}

-

- 一人の最大投票数:{vote.data?.maxVotes}票 -

- {#each vote.data?.voteOptions as option, i} - {@const status = clickableStatus(i)} -
-

- {#if isResultVisible && numbersOfVotersPerOption[i]} - {option}: {numbersOfVotersPerOption[i]}人 - {:else} - {option} - {/if} +

+

投票:

+

{vote.data?.title}

+

+ 一人の最大投票数:{vote.data?.maxVotes}票 +

+ {#each vote.data?.voteOptions as option, i} +
+
+
+

+ {option}{isResultVisible + ? ":" + numbersOfVotersPerOption[i] + "人" + : ""}

- -
- {/each} - -
-{:else}{/if} +
+ {/each} + +
+ diff --git a/packages/client/src/routes/orgs/[orgId]/settings/+page.svelte b/packages/client/src/routes/orgs/[orgId]/settings/+page.svelte index 2e2cbc3..c8344e7 100644 --- a/packages/client/src/routes/orgs/[orgId]/settings/+page.svelte +++ b/packages/client/src/routes/orgs/[orgId]/settings/+page.svelte @@ -1,6 +1,6 @@
@@ -143,7 +177,7 @@

メンバー

{#if organization.data?.permission === "admin"} - + {/if}
diff --git a/packages/convex/src/convex/users.ts b/packages/convex/src/convex/users.ts index 757267f..52b2c9a 100644 --- a/packages/convex/src/convex/users.ts +++ b/packages/convex/src/convex/users.ts @@ -1,7 +1,7 @@ import { getAuthUserId } from "@convex-dev/auth/server"; import { v } from "convex/values"; import type { Id } from "./_generated/dataModel"; -import { query } from "./_generated/server"; +import { query, mutation } from "./_generated/server"; export const me = query({ args: {}, @@ -64,3 +64,14 @@ export const getUserNicknames = query({ return userNicknames; }, }); + +export const getUsersByEmail = query({ + args: { + email: v.string(), + }, + handler: async (ctx, args) => { + return await ctx.db.query("users") + .filter((q) => q.eq(q.field("email"), args.email)) + .collect();; + } +});