mirror of
https://github.com/kremalicious/umami.git
synced 2025-02-14 21:10:34 +01:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
d7f32e6987
@ -49,6 +49,7 @@ export function ReportDeleteButton({
|
|||||||
error={error}
|
error={error}
|
||||||
onConfirm={handleConfirm.bind(null, close)}
|
onConfirm={handleConfirm.bind(null, close)}
|
||||||
onClose={close}
|
onClose={close}
|
||||||
|
buttonLabel={formatMessage(labels.delete)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</Modal>
|
</Modal>
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
import {
|
|
||||||
Form,
|
|
||||||
FormRow,
|
|
||||||
FormInput,
|
|
||||||
FormButtons,
|
|
||||||
TextField,
|
|
||||||
Button,
|
|
||||||
SubmitButton,
|
|
||||||
} from 'react-basics';
|
|
||||||
import { touch } from 'store/modified';
|
|
||||||
import { useApi, useMessages } from 'components/hooks';
|
import { useApi, useMessages } from 'components/hooks';
|
||||||
|
import {
|
||||||
|
Button,
|
||||||
|
Form,
|
||||||
|
FormButtons,
|
||||||
|
FormInput,
|
||||||
|
FormRow,
|
||||||
|
SubmitButton,
|
||||||
|
TextField,
|
||||||
|
} from 'react-basics';
|
||||||
|
|
||||||
export function TeamAddForm({ onSave, onClose }: { onSave: () => void; onClose: () => void }) {
|
export function TeamAddForm({ onSave, onClose }: { onSave: () => void; onClose: () => void }) {
|
||||||
const { formatMessage, labels } = useMessages();
|
const { formatMessage, labels } = useMessages();
|
||||||
@ -20,7 +19,6 @@ export function TeamAddForm({ onSave, onClose }: { onSave: () => void; onClose:
|
|||||||
const handleSubmit = async (data: any) => {
|
const handleSubmit = async (data: any) => {
|
||||||
mutate(data, {
|
mutate(data, {
|
||||||
onSuccess: async () => {
|
onSuccess: async () => {
|
||||||
touch('teams');
|
|
||||||
onSave?.();
|
onSave?.();
|
||||||
onClose?.();
|
onClose?.();
|
||||||
},
|
},
|
||||||
|
@ -24,7 +24,7 @@ export function TeamLeaveForm({
|
|||||||
const handleConfirm = async () => {
|
const handleConfirm = async () => {
|
||||||
mutate(null, {
|
mutate(null, {
|
||||||
onSuccess: async () => {
|
onSuccess: async () => {
|
||||||
touch('team:members');
|
touch('teams:members');
|
||||||
onSave();
|
onSave();
|
||||||
onClose();
|
onClose();
|
||||||
},
|
},
|
||||||
|
@ -1,10 +1,19 @@
|
|||||||
import { Button, Icon, Modal, ModalTrigger, Text } from 'react-basics';
|
import { Button, Icon, Modal, ModalTrigger, Text, useToasts } from 'react-basics';
|
||||||
import Icons from 'components/icons';
|
import Icons from 'components/icons';
|
||||||
import { useMessages } from 'components/hooks';
|
import { useMessages } from 'components/hooks';
|
||||||
import TeamAddForm from './TeamAddForm';
|
import TeamAddForm from './TeamAddForm';
|
||||||
|
import { messages } from 'components/messages';
|
||||||
|
import { touch } from 'store/modified';
|
||||||
|
|
||||||
export function TeamsAddButton({ onAdd }: { onAdd?: () => void }) {
|
export function TeamsAddButton({ onSave }: { onSave?: () => void }) {
|
||||||
const { formatMessage, labels } = useMessages();
|
const { formatMessage, labels } = useMessages();
|
||||||
|
const { showToast } = useToasts();
|
||||||
|
|
||||||
|
const handleSave = async () => {
|
||||||
|
showToast({ message: formatMessage(messages.saved), variant: 'success' });
|
||||||
|
touch('teams');
|
||||||
|
onSave?.();
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ModalTrigger>
|
<ModalTrigger>
|
||||||
@ -15,7 +24,7 @@ export function TeamsAddButton({ onAdd }: { onAdd?: () => void }) {
|
|||||||
<Text>{formatMessage(labels.createTeam)}</Text>
|
<Text>{formatMessage(labels.createTeam)}</Text>
|
||||||
</Button>
|
</Button>
|
||||||
<Modal title={formatMessage(labels.createTeam)}>
|
<Modal title={formatMessage(labels.createTeam)}>
|
||||||
{(close: () => void) => <TeamAddForm onSave={onAdd} onClose={close} />}
|
{(close: () => void) => <TeamAddForm onSave={handleSave} onClose={close} />}
|
||||||
</Modal>
|
</Modal>
|
||||||
</ModalTrigger>
|
</ModalTrigger>
|
||||||
);
|
);
|
||||||
|
@ -22,7 +22,7 @@ export function TeamMemberRemoveButton({
|
|||||||
const handleRemoveTeamMember = () => {
|
const handleRemoveTeamMember = () => {
|
||||||
mutate(null, {
|
mutate(null, {
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
touch('team:members');
|
touch('teams:members');
|
||||||
onSave?.();
|
onSave?.();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -16,7 +16,7 @@ export function TeamDeleteForm({
|
|||||||
const { labels, formatMessage } = useMessages();
|
const { labels, formatMessage } = useMessages();
|
||||||
const { del, useMutation } = useApi();
|
const { del, useMutation } = useApi();
|
||||||
const { mutate, error, isPending } = useMutation({
|
const { mutate, error, isPending } = useMutation({
|
||||||
mutationFn: (data: any) => del(`/teams/${teamId}`, data),
|
mutationFn: () => del(`/teams/${teamId}`),
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleConfirm = async () => {
|
const handleConfirm = async () => {
|
||||||
|
@ -15,7 +15,7 @@ export function WebsiteDeleteForm({
|
|||||||
const { formatMessage, labels } = useMessages();
|
const { formatMessage, labels } = useMessages();
|
||||||
const { del, useMutation } = useApi();
|
const { del, useMutation } = useApi();
|
||||||
const { mutate, isPending, error } = useMutation({
|
const { mutate, isPending, error } = useMutation({
|
||||||
mutationFn: (data: any) => del(`/websites/${websiteId}`, data),
|
mutationFn: () => del(`/websites/${websiteId}`),
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleConfirm = async () => {
|
const handleConfirm = async () => {
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
|
import useModified from 'store/modified';
|
||||||
import useApi from './useApi';
|
import useApi from './useApi';
|
||||||
import useFilterQuery from './useFilterQuery';
|
import useFilterQuery from './useFilterQuery';
|
||||||
|
|
||||||
export function useTeamMembers(teamId: string) {
|
export function useTeamMembers(teamId: string) {
|
||||||
const { get } = useApi();
|
const { get } = useApi();
|
||||||
|
const modified = useModified((state: any) => state?.['teams:members']);
|
||||||
|
|
||||||
return useFilterQuery({
|
return useFilterQuery({
|
||||||
queryKey: ['teams:users', { teamId }],
|
queryKey: ['teams:members', { teamId, modified }],
|
||||||
queryFn: (params: any) => {
|
queryFn: (params: any) => {
|
||||||
return get(`/teams/${teamId}/users`, params);
|
return get(`/teams/${teamId}/users`, params);
|
||||||
},
|
},
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
import useApi from './useApi';
|
import useApi from './useApi';
|
||||||
import useFilterQuery from './useFilterQuery';
|
import useFilterQuery from './useFilterQuery';
|
||||||
import { useLogin } from 'components/hooks';
|
import { useLogin } from 'components/hooks';
|
||||||
|
import useModified from 'store/modified';
|
||||||
|
|
||||||
export function useTeams(userId?: string) {
|
export function useTeams(userId?: string) {
|
||||||
const { get } = useApi();
|
const { get } = useApi();
|
||||||
const { user } = useLogin();
|
const { user } = useLogin();
|
||||||
|
const modified = useModified((state: any) => state?.teams);
|
||||||
|
|
||||||
return useFilterQuery({
|
return useFilterQuery({
|
||||||
queryKey: ['teams', { userId: userId || user?.id }],
|
queryKey: ['teams', { userId: userId || user?.id, modified }],
|
||||||
queryFn: (params: any) => {
|
queryFn: (params: any) => {
|
||||||
return get(`/teams`, params);
|
return get(`/teams`, params);
|
||||||
},
|
},
|
||||||
|
@ -3,15 +3,13 @@ import { useFilterQuery } from './useFilterQuery';
|
|||||||
import { useLogin } from './useLogin';
|
import { useLogin } from './useLogin';
|
||||||
import useModified from 'store/modified';
|
import useModified from 'store/modified';
|
||||||
|
|
||||||
const selector = (state: any) => state?.websites;
|
|
||||||
|
|
||||||
export function useWebsites(
|
export function useWebsites(
|
||||||
{ userId, teamId }: { userId?: string; teamId?: string },
|
{ userId, teamId }: { userId?: string; teamId?: string },
|
||||||
params?: { [key: string]: string | number },
|
params?: { [key: string]: string | number },
|
||||||
) {
|
) {
|
||||||
const { get } = useApi();
|
const { get } = useApi();
|
||||||
const { user } = useLogin();
|
const { user } = useLogin();
|
||||||
const modified = useModified(selector);
|
const modified = useModified((state: any) => state?.websites);
|
||||||
|
|
||||||
return useFilterQuery({
|
return useFilterQuery({
|
||||||
queryKey: ['websites', { userId, teamId, modified, ...params }],
|
queryKey: ['websites', { userId, teamId, modified, ...params }],
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
import { Prisma, Report } from '@prisma/client';
|
import { Prisma, Report } from '@prisma/client';
|
||||||
import prisma from 'lib/prisma';
|
import prisma from 'lib/prisma';
|
||||||
import { FilterResult, ReportSearchFilter } from 'lib/types';
|
import { FilterResult, ReportSearchFilter } from 'lib/types';
|
||||||
import ReportFindUniqueArgs = Prisma.ReportFindUniqueArgs;
|
|
||||||
import ReportFindManyArgs = Prisma.ReportFindManyArgs;
|
import ReportFindManyArgs = Prisma.ReportFindManyArgs;
|
||||||
|
|
||||||
async function findReport(criteria: ReportFindUniqueArgs) {
|
async function findReport(criteria: Prisma.ReportFindUniqueArgs): Promise<Report> {
|
||||||
return prisma.client.report.findUnique(criteria);
|
return prisma.client.report.findUnique(criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,8 +5,8 @@ import prisma from 'lib/prisma';
|
|||||||
import { FilterResult, TeamSearchFilter } from 'lib/types';
|
import { FilterResult, TeamSearchFilter } from 'lib/types';
|
||||||
import TeamFindManyArgs = Prisma.TeamFindManyArgs;
|
import TeamFindManyArgs = Prisma.TeamFindManyArgs;
|
||||||
|
|
||||||
export async function findTeam(criteria: Prisma.TeamFindFirstArgs): Promise<Team> {
|
export async function findTeam(criteria: Prisma.TeamFindUniqueArgs): Promise<Team> {
|
||||||
return prisma.client.team.findFirst(criteria);
|
return prisma.client.team.findUnique(criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getTeam(teamId: string, options: { includeMembers?: boolean } = {}) {
|
export async function getTeam(teamId: string, options: { includeMembers?: boolean } = {}) {
|
||||||
|
@ -4,6 +4,10 @@ import prisma from 'lib/prisma';
|
|||||||
import { FilterResult, TeamUserSearchFilter } from 'lib/types';
|
import { FilterResult, TeamUserSearchFilter } from 'lib/types';
|
||||||
import TeamUserFindManyArgs = Prisma.TeamUserFindManyArgs;
|
import TeamUserFindManyArgs = Prisma.TeamUserFindManyArgs;
|
||||||
|
|
||||||
|
export async function findTeamUser(criteria: Prisma.TeamUserFindUniqueArgs): Promise<TeamUser> {
|
||||||
|
return prisma.client.teamUser.findUnique(criteria);
|
||||||
|
}
|
||||||
|
|
||||||
export async function getTeamUser(teamId: string, userId: string): Promise<TeamUser> {
|
export async function getTeamUser(teamId: string, userId: string): Promise<TeamUser> {
|
||||||
return prisma.client.teamUser.findFirst({
|
return prisma.client.teamUser.findFirst({
|
||||||
where: {
|
where: {
|
||||||
@ -49,21 +53,20 @@ export async function createTeamUser(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function updateTeamUser(teamUserId: string, data: any): Promise<TeamUser> {
|
export async function updateTeamUser(
|
||||||
return prisma.client.teamUser.update(
|
teamUserId: string,
|
||||||
{
|
data: Prisma.TeamUserUpdateInput,
|
||||||
where: {
|
): Promise<TeamUser> {
|
||||||
id: teamUserId,
|
return prisma.client.teamUser.update({
|
||||||
},
|
where: {
|
||||||
|
id: teamUserId,
|
||||||
},
|
},
|
||||||
data,
|
data,
|
||||||
);
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function deleteTeamUser(teamId: string, userId: string): Promise<TeamUser> {
|
export async function deleteTeamUser(teamId: string, userId: string): Promise<Prisma.BatchPayload> {
|
||||||
const { client } = prisma;
|
return prisma.client.teamUser.deleteMany({
|
||||||
|
|
||||||
return client.teamUser.deleteMany({
|
|
||||||
where: {
|
where: {
|
||||||
teamId,
|
teamId,
|
||||||
userId,
|
userId,
|
||||||
|
@ -221,7 +221,7 @@ export async function deleteUser(
|
|||||||
id: userId,
|
id: userId,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
]).then(async (data: any) => {
|
]).then(async data => {
|
||||||
if (cache.enabled) {
|
if (cache.enabled) {
|
||||||
const ids = websites.map(a => a.id);
|
const ids = websites.map(a => a.id);
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ import prisma from 'lib/prisma';
|
|||||||
import { FilterResult, WebsiteSearchFilter } from 'lib/types';
|
import { FilterResult, WebsiteSearchFilter } from 'lib/types';
|
||||||
import WebsiteFindManyArgs = Prisma.WebsiteFindManyArgs;
|
import WebsiteFindManyArgs = Prisma.WebsiteFindManyArgs;
|
||||||
|
|
||||||
async function findWebsite(criteria: Prisma.WebsiteFindManyArgs): Promise<Website> {
|
async function findWebsite(criteria: Prisma.WebsiteFindUniqueArgs): Promise<Website> {
|
||||||
return prisma.client.website.findUnique(criteria);
|
return prisma.client.website.findUnique(criteria);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ export async function createWebsite(
|
|||||||
.create({
|
.create({
|
||||||
data,
|
data,
|
||||||
})
|
})
|
||||||
.then(async (data: { id: any }) => {
|
.then(async data => {
|
||||||
if (cache.enabled) {
|
if (cache.enabled) {
|
||||||
await cache.storeWebsite(data);
|
await cache.storeWebsite(data);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user