From 2f696ddd13c245c9943e3b01ce69000609a95a86 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Tue, 6 Feb 2024 18:55:16 +0100 Subject: [PATCH 01/14] feat: blog article why i started documenso --- .../content/blog/why-i-started-documenso.mdx | 67 ++++++++++++++++++ apps/marketing/public/blog/burgers.jpeg | Bin 0 -> 166613 bytes 2 files changed, 67 insertions(+) create mode 100644 apps/marketing/content/blog/why-i-started-documenso.mdx create mode 100644 apps/marketing/public/blog/burgers.jpeg diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx new file mode 100644 index 000000000..58da0956e --- /dev/null +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -0,0 +1,67 @@ +--- +title: Why I started Documenso +description: TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the internet/ world more open. +authorName: 'Timur Ercan' +authorImage: '/blog/blog-author-timur.jpeg' +authorRole: 'Co-Founder' +date: 2024-02-06 +Tags: + - Founders + - Mission + - Open Source +--- + +
+ + +
+ No the burger from the story. But it could be as well, the place is pretty generic. +
+
+ +> TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the world/ Internet more open + +It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with @FelixM while discussing what’s next in late 2022. Shortly after i sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. + +Personally I’ve had some time off and was actively looking for my next move. Looking back, my first company I stumbled into, the second one less so, but I joined my co-founders and did not come up with the concept myself. While coming up with Documenso, I was deliberatly looking for: + +- An entrepreneurial space, that was big enough opportunity +- A huge macro trend, lifting everything in it’s space +- A mode of working that fits my personal flow (which luckily for me, pretty close to the modern startup/ tech scene) +- An bigger impact to be made, that just earning lots of money (though there is nothing wrong with that) + +Quick shoutout to everyone feeling even a pinch of imposter syndrom while calling themselves a founder. It was after 10 years, slightly after starting Documenso, that I started doing it in my head without cringing. So cut yourself some slack. Considering how long I’ve been doing this, I guess I would have earned the internal title sooner and so do you probably. So after grappeling with my identity for second, as is customary for founders, my decision to start this journey came pretty quickly. + +Aside from the personal dimension, I had a pretty clear mindset of what I was looking for. The criteria I go on describing happend to click into place one after another, in no particular order. Having experienced no market demand and a very grindy market, I was looking for something more fundamental. Something basic, infrastructure-like, with a huge demand. A growing market, deeply rooted in the growing digitalization of the world. + +And to be honest, I just always liked digital signature tools. It’s a product, easy enough to comprehend and build but complex and impactful enough to satisfy a hard need. It’s a product you can build very product-driven since the market and domain are well understood at this point. So when asked about what’s next for me, I literally said “digital, um, let’s say… signatures”. As it turns out, my first gut feeling was spot on, but how spot on I only realized when I started researching the space. An open source document signing company happens to be the perfect intersection of all criteria and personal preferences I described above, it’s pretty amazing actually: + +- The global signing market is huge and rapidly growing +- The signing space is huge dominated by one outdated player, to put it bluntly. Outdated in terms of tech, pricing and ecosystem +- The signing space is also ridiculously opaque for a space that is based on open web tech, open encryption tech and open signing standards. Even by closed source standards +- We are currently seeing a renaissance for commercial open source startups, combining venture founder financial with open source mechanics +- Rebuilding a fundamental infrastructure as open source with a meaningful scale, has a profoundly transformative effect for a space +- Working in open source requires you to be open, cooperative and inclusive. It also requires quite a bit of context jumping, “going with the flow” and empathy +- Apart from fixing the signing space, making Documenso successful, would be another domino tile toward open source eating the world, which is great for everyone + +Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynmamics it the best founders can do in my humble opinion. After these fundamental decisions you are (almost) just along for the ride and need to focus on solving the “convential” problems of starting a company the best you can. With digital signatures hitting so many point of my personal and professional checklist, this already was a great fit. What got me exited at first though, apart from the perspective of drinking caffeine and coding, was this: + +Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for ecommerce, no wonder considering it costed so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers basically block unencrypted sites. Mostly even build into hosting plattforms so you barely even notice as a developer. + +I had forgotten all about that story until I realized, this is where signing is today. A global need, fullfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another todo on the [longterm roadmap](https://documen.so/roadmap) list for open signing ecossytem. Actually effecting this change in any way, is a huge driver for me, personally. + +Apart from my personal gripes with the coporate certificate industry, I always found encryption fascinating. It’s such a fundamental force in society when you think about it: Secure Communication, Secure Commerce and even internet native money (Bitcoin) was created using a bit of smart math. All these examples are expressions of very fundamental human behaviours, that should be enabled and protected by open infrastructures. + +I never told anyone before, but since starting Documenso I realized that I underestimated the impact and importance of open source for quite some time. When I was in University, I distantly remember my mindset of “yeah open source is nice, but the great, commercially successful products used in the real world are build by closed companies (aka Microsoft)” _shudder_ It was never really a conscious thought, but enough that I started learning MS Silverlight before plain Javascript. It was slowly over time, that I realized that open web standards are superior to closed ones and even later that I understood the same holds true for all software. Open sources fixes something in the economy, I find hard to articulate. I did my best in [commodifying signing]. + +To wrap this up, Documenso happens to be the perfect storm of market opportunity, my personal interests and passions. Creating a company people actually want to work for longterm while tackleing these issues is critical side quest of Documenso. This is not only about building the next generation signing tech, it’s also about doing our part to normalize open, healthy, efficient working cultures, tackling relevant problems. + +As always, feel free to connect on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord) if you have any questions or comments. + +Best from Hamburg\ +Timur diff --git a/apps/marketing/public/blog/burgers.jpeg b/apps/marketing/public/blog/burgers.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4fd897e759cc088eed32481a498824eeb52b48dd GIT binary patch literal 166613 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⋘wh|Ug#R0FT_^yAf}%J4zTm;y4FN&ZDwp<` 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 LF`i2+hJXLrIGefV literal 0 HcmV?d00001 From 94ddb0252b099ad47579d3a009c140b39d0fd5eb Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Tue, 6 Feb 2024 19:09:27 +0100 Subject: [PATCH 02/14] fix: stuff --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 58da0956e..31d29a1a6 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -26,7 +26,7 @@ Tags: > TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the world/ Internet more open -It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with @FelixM while discussing what’s next in late 2022. Shortly after i sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. +It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what’s next in late 2022. Shortly after i sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. Personally I’ve had some time off and was actively looking for my next move. Looking back, my first company I stumbled into, the second one less so, but I joined my co-founders and did not come up with the concept myself. While coming up with Documenso, I was deliberatly looking for: From 58e2eda5e9929c91fd5ab0a904cbbec2ecb8208f Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 7 Feb 2024 14:40:15 +1100 Subject: [PATCH 03/14] fix: update field remove logic --- packages/lib/server-only/field/set-fields-for-document.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/lib/server-only/field/set-fields-for-document.ts b/packages/lib/server-only/field/set-fields-for-document.ts index 2ba592f31..ecb45d461 100644 --- a/packages/lib/server-only/field/set-fields-for-document.ts +++ b/packages/lib/server-only/field/set-fields-for-document.ts @@ -56,11 +56,7 @@ export const setFieldsForDocument = async ({ }); const removedFields = existingFields.filter( - (existingField) => - !fields.find( - (field) => - field.id === existingField.id || field.signerEmail === existingField.Recipient?.email, - ), + (existingField) => !fields.find((field) => field.id === existingField.id), ); const linkedFields = fields From bf26f2cb9d972d17c2419f9a747d7e26b7e2f74e Mon Sep 17 00:00:00 2001 From: Sumit Bisht <75713174+sumitbishti@users.noreply.github.com> Date: Wed, 7 Feb 2024 10:55:39 +0530 Subject: [PATCH 04/14] fix: empty document titles (#917) fixes: #909 --- packages/ui/primitives/document-flow/add-title.tsx | 5 ++++- packages/ui/primitives/document-flow/add-title.types.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/ui/primitives/document-flow/add-title.tsx b/packages/ui/primitives/document-flow/add-title.tsx index 730c4248f..a6390fd3a 100644 --- a/packages/ui/primitives/document-flow/add-title.tsx +++ b/packages/ui/primitives/document-flow/add-title.tsx @@ -1,5 +1,6 @@ 'use client'; +import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; import type { Field, Recipient } from '@documenso/prisma/client'; @@ -10,6 +11,7 @@ import { Input } from '../input'; import { Label } from '../label'; import { useStep } from '../stepper'; import type { TAddTitleFormSchema } from './add-title.types'; +import { ZAddTitleFormSchema } from './add-title.types'; import { DocumentFlowFormContainerActions, DocumentFlowFormContainerContent, @@ -40,6 +42,7 @@ export const AddTitleFormPartial = ({ handleSubmit, formState: { errors, isSubmitting }, } = useForm({ + resolver: zodResolver(ZAddTitleFormSchema), defaultValues: { title: document.title, }, @@ -71,7 +74,7 @@ export const AddTitleFormPartial = ({ id="title" className="bg-background my-2" disabled={isSubmitting} - {...register('title', { required: "Title can't be empty" })} + {...register('title')} /> diff --git a/packages/ui/primitives/document-flow/add-title.types.ts b/packages/ui/primitives/document-flow/add-title.types.ts index aaa8c17e4..b910c060a 100644 --- a/packages/ui/primitives/document-flow/add-title.types.ts +++ b/packages/ui/primitives/document-flow/add-title.types.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; export const ZAddTitleFormSchema = z.object({ - title: z.string().min(1), + title: z.string().trim().min(1, { message: "Title can't be empty" }), }); export type TAddTitleFormSchema = z.infer; From 7d39e3d0658206b34b3f1dc85a3457783c9f09ea Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Wed, 7 Feb 2024 21:32:44 +1100 Subject: [PATCH 05/14] feat: add team feature flag (#915) ## Description Add the ability to feature flag the teams feature via UI. Also added minor UI changes ## Checklist - [X] I have tested these changes locally and they work as expected. - [X] I have added/updated tests that prove the effectiveness of these changes. - [X] I have followed the project's coding style guidelines. --- .../components/(dashboard)/layout/header.tsx | 38 +++- .../(dashboard)/layout/mobile-navigation.tsx | 2 +- .../(dashboard)/layout/profile-dropdown.tsx | 169 ++++++++++++++++++ .../settings/layout/desktop-nav.tsx | 27 +-- .../settings/layout/mobile-nav.tsx | 27 +-- .../dialogs/create-team-checkout-dialog.tsx | 3 +- .../forms/2fa/authenticator-app.tsx | 2 - packages/lib/constants/feature-flags.ts | 1 + packages/ui/primitives/sheet.tsx | 9 +- 9 files changed, 244 insertions(+), 34 deletions(-) create mode 100644 apps/web/src/components/(dashboard)/layout/profile-dropdown.tsx diff --git a/apps/web/src/components/(dashboard)/layout/header.tsx b/apps/web/src/components/(dashboard)/layout/header.tsx index 753f5fb11..65bb63230 100644 --- a/apps/web/src/components/(dashboard)/layout/header.tsx +++ b/apps/web/src/components/(dashboard)/layout/header.tsx @@ -7,6 +7,7 @@ import { useParams } from 'next/navigation'; import { MenuIcon, SearchIcon } from 'lucide-react'; +import { useFeatureFlags } from '@documenso/lib/client-only/providers/feature-flag'; import type { GetTeamsResponse } from '@documenso/lib/server-only/team/get-teams'; import { getRootHref } from '@documenso/lib/utils/params'; import type { User } from '@documenso/prisma/client'; @@ -18,6 +19,7 @@ import { CommandMenu } from '../common/command-menu'; import { DesktopNav } from './desktop-nav'; import { MenuSwitcher } from './menu-switcher'; import { MobileNavigation } from './mobile-navigation'; +import { ProfileDropdown } from './profile-dropdown'; export type HeaderProps = HTMLAttributes & { user: User; @@ -27,6 +29,10 @@ export type HeaderProps = HTMLAttributes & { export const Header = ({ className, user, teams, ...props }: HeaderProps) => { const params = useParams(); + const { getFlag } = useFeatureFlags(); + + const isTeamsEnabled = getFlag('app_teams'); + const [isCommandMenuOpen, setIsCommandMenuOpen] = useState(false); const [isHamburgerMenuOpen, setIsHamburgerMenuOpen] = useState(false); const [scrollY, setScrollY] = useState(0); @@ -41,6 +47,34 @@ export const Header = ({ className, user, teams, ...props }: HeaderProps) => { return () => window.removeEventListener('scroll', onScroll); }, []); + if (!isTeamsEnabled) { + return ( +
5 && 'border-b-border', + className, + )} + {...props} + > +
+ + + + + + +
+ +
+
+
+ ); + } + return (
{
diff --git a/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx b/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx index 7142de5dc..a77300d9e 100644 --- a/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx +++ b/apps/web/src/components/(dashboard)/layout/mobile-navigation.tsx @@ -47,7 +47,7 @@ export const MobileNavigation = ({ isMenuOpen, onMenuOpenChange }: MobileNavigat return ( - + Documenso Logo { + const { getFlag } = useFeatureFlags(); + const { theme, setTheme } = useTheme(); + const isUserAdmin = isAdmin(user); + + const isBillingEnabled = getFlag('app_billing'); + + const avatarFallback = user.name + ? extractInitials(user.name) + : user.email.slice(0, 1).toUpperCase(); + + return ( + + + + + + + Account + + {isUserAdmin && ( + <> + + + + Admin + + + + + + )} + + + + + Profile + + + + + + + Security + + + + {isBillingEnabled && ( + + + + Billing + + + )} + + + + + + Templates + + + + + + + + Themes + + + + + + Light + + + + Dark + + + + System + + + + + + + + + + Star on Github + + + + + + + void signOut({ + callbackUrl: '/', + }) + } + > + + Sign Out + + + + ); +}; diff --git a/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx b/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx index c7ab61d8a..572c91c76 100644 --- a/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx +++ b/apps/web/src/components/(dashboard)/settings/layout/desktop-nav.tsx @@ -19,6 +19,7 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { const { getFlag } = useFeatureFlags(); const isBillingEnabled = getFlag('app_billing'); + const isTeamsEnabled = getFlag('app_teams'); return (
@@ -35,18 +36,20 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { - - - + {isTeamsEnabled && ( + + + + )} - - - + {isTeamsEnabled && ( + + + + )}
diff --git a/apps/web/src/components/forms/2fa/authenticator-app.tsx b/apps/web/src/components/forms/2fa/authenticator-app.tsx index 316272e34..3aa0e123e 100644 --- a/apps/web/src/components/forms/2fa/authenticator-app.tsx +++ b/apps/web/src/components/forms/2fa/authenticator-app.tsx @@ -30,13 +30,11 @@ export const AuthenticatorApp = ({ isTwoFactorEnabled }: AuthenticatorAppProps)
!open && setModalState(null)} /> !open && setModalState(null)} /> diff --git a/packages/lib/constants/feature-flags.ts b/packages/lib/constants/feature-flags.ts index e972b47c2..947409be1 100644 --- a/packages/lib/constants/feature-flags.ts +++ b/packages/lib/constants/feature-flags.ts @@ -17,6 +17,7 @@ export const FEATURE_FLAG_POLL_INTERVAL = 30000; */ export const LOCAL_FEATURE_FLAGS: Record = { app_billing: process.env.NEXT_PUBLIC_FEATURE_BILLING_ENABLED === 'true', + app_teams: true, marketing_header_single_player_mode: false, } as const; diff --git a/packages/ui/primitives/sheet.tsx b/packages/ui/primitives/sheet.tsx index e9f1b4401..a6326de0f 100644 --- a/packages/ui/primitives/sheet.tsx +++ b/packages/ui/primitives/sheet.tsx @@ -3,7 +3,8 @@ import * as React from 'react'; import * as SheetPrimitive from '@radix-ui/react-dialog'; -import { VariantProps, cva } from 'class-variance-authority'; +import type { VariantProps } from 'class-variance-authority'; +import { cva } from 'class-variance-authority'; import { X } from 'lucide-react'; import { cn } from '../lib/utils'; @@ -12,7 +13,7 @@ const Sheet = SheetPrimitive.Root; const SheetTrigger = SheetPrimitive.Trigger; -const portalVariants = cva('fixed inset-0 z-50 flex', { +const portalVariants = cva('fixed inset-0 z-[61] flex', { variants: { position: { top: 'items-start', @@ -42,7 +43,7 @@ const SheetOverlay = React.forwardRef< >(({ className, children: _children, ...props }, ref) => ( Date: Wed, 7 Feb 2024 11:40:11 +0100 Subject: [PATCH 06/14] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 31d29a1a6..eb7a492fe 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -20,7 +20,7 @@ Tags: />
- No the burger from the story. But it could be as well, the place is pretty generic. + Not the burger from the story. But it could be as well, the place is pretty generic.
From 2431db06f56ae1150b5e4509459fa73982f515f4 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 11:41:14 +0100 Subject: [PATCH 07/14] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index eb7a492fe..f270208c3 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -26,7 +26,7 @@ Tags: > TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the world/ Internet more open -It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what’s next in late 2022. Shortly after i sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. +It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what’s next in late 2022. Shortly after I sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. Personally I’ve had some time off and was actively looking for my next move. Looking back, my first company I stumbled into, the second one less so, but I joined my co-founders and did not come up with the concept myself. While coming up with Documenso, I was deliberatly looking for: From 2e719288ffa811a1bfb3948653e487f30bd8b637 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 11:41:32 +0100 Subject: [PATCH 08/14] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index f270208c3..dc165dad5 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -49,7 +49,7 @@ And to be honest, I just always liked digital signature tools. It’s a product, - Working in open source requires you to be open, cooperative and inclusive. It also requires quite a bit of context jumping, “going with the flow” and empathy - Apart from fixing the signing space, making Documenso successful, would be another domino tile toward open source eating the world, which is great for everyone -Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynmamics it the best founders can do in my humble opinion. After these fundamental decisions you are (almost) just along for the ride and need to focus on solving the “convential” problems of starting a company the best you can. With digital signatures hitting so many point of my personal and professional checklist, this already was a great fit. What got me exited at first though, apart from the perspective of drinking caffeine and coding, was this: +Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynamics it is the best founders can do in my humble opinion. After these fundamental decisions, you are (almost) just along for the ride and need to focus on solving the “conventional” problems of starting a company the best you can. With digital signatures hitting so many points of my personal and professional checklist, this already was a great fit. What got me excited at first though, apart from the perspective of drinking caffeine and coding, was this: Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for ecommerce, no wonder considering it costed so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers basically block unencrypted sites. Mostly even build into hosting plattforms so you barely even notice as a developer. From 58477e060aba7a5f97e1aa981c79000b827cf5aa Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 11:41:40 +0100 Subject: [PATCH 09/14] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index dc165dad5..13db38209 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -51,7 +51,7 @@ And to be honest, I just always liked digital signature tools. It’s a product, Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynamics it is the best founders can do in my humble opinion. After these fundamental decisions, you are (almost) just along for the ride and need to focus on solving the “conventional” problems of starting a company the best you can. With digital signatures hitting so many points of my personal and professional checklist, this already was a great fit. What got me excited at first though, apart from the perspective of drinking caffeine and coding, was this: -Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for ecommerce, no wonder considering it costed so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers basically block unencrypted sites. Mostly even build into hosting plattforms so you barely even notice as a developer. +Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for e-commerce, no wonder considering it cost so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers block unencrypted sites. Mostly even build into hosting platforms so you barely even notice as a developer. I had forgotten all about that story until I realized, this is where signing is today. A global need, fullfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another todo on the [longterm roadmap](https://documen.so/roadmap) list for open signing ecossytem. Actually effecting this change in any way, is a huge driver for me, personally. From 718f5664ac9ca6b38514f0a1bb1735c2681aa8f1 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 12:00:01 +0100 Subject: [PATCH 10/14] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 13db38209..95f750e9b 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -53,7 +53,7 @@ Building a company is so complex, it can’t be planned out. Basing it on great Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for e-commerce, no wonder considering it cost so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers block unencrypted sites. Mostly even build into hosting platforms so you barely even notice as a developer. -I had forgotten all about that story until I realized, this is where signing is today. A global need, fullfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another todo on the [longterm roadmap](https://documen.so/roadmap) list for open signing ecossytem. Actually effecting this change in any way, is a huge driver for me, personally. +I had forgotten all about that story until I realized, this is where signing is today. A global need, fulfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another to-do on the [longterm roadmap](https://documen.so/roadmap) list for the open signing ecosystem. Effecting this change in any way is a huge driver for me. Apart from my personal gripes with the coporate certificate industry, I always found encryption fascinating. It’s such a fundamental force in society when you think about it: Secure Communication, Secure Commerce and even internet native money (Bitcoin) was created using a bit of smart math. All these examples are expressions of very fundamental human behaviours, that should be enabled and protected by open infrastructures. From b6bdbf72a71b59c3ebc54119b36edf5ca7e2375f Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 12:00:12 +0100 Subject: [PATCH 11/14] Update apps/marketing/content/blog/why-i-started-documenso.mdx Co-authored-by: Adithya Krishna --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 95f750e9b..228efdc0f 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -59,7 +59,7 @@ Apart from my personal gripes with the coporate certificate industry, I always f I never told anyone before, but since starting Documenso I realized that I underestimated the impact and importance of open source for quite some time. When I was in University, I distantly remember my mindset of “yeah open source is nice, but the great, commercially successful products used in the real world are build by closed companies (aka Microsoft)” _shudder_ It was never really a conscious thought, but enough that I started learning MS Silverlight before plain Javascript. It was slowly over time, that I realized that open web standards are superior to closed ones and even later that I understood the same holds true for all software. Open sources fixes something in the economy, I find hard to articulate. I did my best in [commodifying signing]. -To wrap this up, Documenso happens to be the perfect storm of market opportunity, my personal interests and passions. Creating a company people actually want to work for longterm while tackleing these issues is critical side quest of Documenso. This is not only about building the next generation signing tech, it’s also about doing our part to normalize open, healthy, efficient working cultures, tackling relevant problems. +To wrap this up, Documenso happens to be the perfect storm of market opportunity, my interests, and my passions. Creating a company people want to work for the long term while tackling these issues is a critical side quest of Documenso. This is not only about building the next generation of signing tech, it’s also about doing our part to normalize open, healthy, efficient working cultures, and tackling relevant problems. As always, feel free to connect on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord) if you have any questions or comments. From 33ab8797a556a5388bb38b0c55daec6c930cf214 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 12:22:07 +0100 Subject: [PATCH 12/14] chore: text --- apps/marketing/content/blog/why-i-started-documenso.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 228efdc0f..458a4823a 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -1,6 +1,6 @@ --- title: Why I started Documenso -description: TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the internet/ world more open. +description: I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the internet/ world more open. authorName: 'Timur Ercan' authorImage: '/blog/blog-author-timur.jpeg' authorRole: 'Co-Founder' From e2a5638f50cdb51eb32c9070faebfbce52f67be1 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 7 Feb 2024 13:07:22 +0100 Subject: [PATCH 13/14] chore: fixed --- .../content/blog/why-i-started-documenso.mdx | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/apps/marketing/content/blog/why-i-started-documenso.mdx b/apps/marketing/content/blog/why-i-started-documenso.mdx index 458a4823a..2fceddd25 100644 --- a/apps/marketing/content/blog/why-i-started-documenso.mdx +++ b/apps/marketing/content/blog/why-i-started-documenso.mdx @@ -24,44 +24,45 @@ Tags: -> TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption and want to help make the world/ Internet more open +> TLDR; I started Documenso because I wanted to build a modern tech company in a growing space with a mission bigger than money, I overpaid for a SSL cert 13 years ago, like encryption, and wanted to help make the world/ Internet more open. -It’s hard to pinpoint when I decided to start Documenso. I first uttered the word “Documenso” while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what’s next in late 2022. Shortly after I sat down with a can of caffeine and started building Documenso 0.9. Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. +It's hard to pinpoint when I decided to start Documenso. I first uttered the word "Documenso" while sitting in a restaurant with [Felix](https://twitter.com/flxmgdnz), eating a burger and discussing what's next in late 2022. Shortly after, I sat down with a can of caffeine and started building [Documenso 0.9](https://github.com/documenso/documenso/releases/tag/0.9-developer-preview). Starting Documenso is the most deliberate business decision I ever made. It was deliberate from the personal side and deliberate from the business side. -Personally I’ve had some time off and was actively looking for my next move. Looking back, my first company I stumbled into, the second one less so, but I joined my co-founders and did not come up with the concept myself. While coming up with Documenso, I was deliberatly looking for: +Looking at the personal side, I've had some time off and was actively looking for my next move. Looking back, I stumbled into my first company. Less so with the second one, but I joined my co-founders and did not develop the core concept myself. While coming up with Documenso, I was deliberately looking for a few things, based on my previous experiences: -- An entrepreneurial space, that was big enough opportunity -- A huge macro trend, lifting everything in it’s space -- A mode of working that fits my personal flow (which luckily for me, pretty close to the modern startup/ tech scene) -- An bigger impact to be made, that just earning lots of money (though there is nothing wrong with that) +- An entrepreneurial space that was a big enough opportunity +- A huge macro trend, lifting everything in it's space +- A mode of working that fits my flow (which, luckily for me, is pretty close to the modern startup/ tech scene) +- A more significant impact to be made than just earning lots of money (though there is nothing wrong with that) -Quick shoutout to everyone feeling even a pinch of imposter syndrom while calling themselves a founder. It was after 10 years, slightly after starting Documenso, that I started doing it in my head without cringing. So cut yourself some slack. Considering how long I’ve been doing this, I guess I would have earned the internal title sooner and so do you probably. So after grappeling with my identity for second, as is customary for founders, my decision to start this journey came pretty quickly. +Quick shoutout to everyone feeling even a pinch of imposter syndrome while calling themselves a founder. It was after ten years, slightly after starting Documenso, that I started doing it in my head without cringing. So cut yourself some slack. Considering how long I've been doing this, I would have earned the internal title sooner, and so do you. After grappling with my identity for a second, as is customary for founders, my decision to start this journey came quickly. -Aside from the personal dimension, I had a pretty clear mindset of what I was looking for. The criteria I go on describing happend to click into place one after another, in no particular order. Having experienced no market demand and a very grindy market, I was looking for something more fundamental. Something basic, infrastructure-like, with a huge demand. A growing market, deeply rooted in the growing digitalization of the world. +Aside from the personal dimension, I had a clear mindset of what I wanted. The criteria I describe below clicked into place one after another, in no particular order. Having experienced no market demand and a very gritty, grindy market, I was looking for something more fundamental. Something basic, infrastructure-like, with a huge demand. A growing market deeply rooted in the ever-increasing digitalization of the world. -And to be honest, I just always liked digital signature tools. It’s a product, easy enough to comprehend and build but complex and impactful enough to satisfy a hard need. It’s a product you can build very product-driven since the market and domain are well understood at this point. So when asked about what’s next for me, I literally said “digital, um, let’s say… signatures”. As it turns out, my first gut feeling was spot on, but how spot on I only realized when I started researching the space. An open source document signing company happens to be the perfect intersection of all criteria and personal preferences I described above, it’s pretty amazing actually: +And to be honest, I just always liked digital signature tools. It's a product that is easy enough to comprehend and build but complex and impactful enough to satisfy a hard need. It's a product you can build very product-driven since the market and domain are well understood. So when asked about what's next for me, I literally said, "Digital, um, let's say… signatures". As it turns out, my first gut feeling was spot on, but how spot on I only realized when I started researching the space. An open source document signing company happens to be the perfect intersection of all the criteria and personal preferences I described above; it's pretty amazing, actually: -- The global signing market is huge and rapidly growing -- The signing space is huge dominated by one outdated player, to put it bluntly. Outdated in terms of tech, pricing and ecosystem -- The signing space is also ridiculously opaque for a space that is based on open web tech, open encryption tech and open signing standards. Even by closed source standards -- We are currently seeing a renaissance for commercial open source startups, combining venture founder financial with open source mechanics -- Rebuilding a fundamental infrastructure as open source with a meaningful scale, has a profoundly transformative effect for a space -- Working in open source requires you to be open, cooperative and inclusive. It also requires quite a bit of context jumping, “going with the flow” and empathy -- Apart from fixing the signing space, making Documenso successful, would be another domino tile toward open source eating the world, which is great for everyone +- The global signing market is enormous and rapidly growing +- To put it bluntly, the signing space is vast and dominated by one outdated player. Outdated in terms of tech, pricing, and ecosystem +- The signing space is also ridiculously opaque for a space based on open web tech, open encryption tech, and open signing standards. Even by closed-source standards +- We are currently seeing a renaissance for commercial open source startups, combining venture founder financials with open source mechanics +- Rebuilding a fundamental infrastructure as open source with a meaningful scale has a profoundly transformative effect on any space +- Working in open source requires being open, cooperative, and inclusive. It also requires quite a bit of context jumping, "going with the flow," and empathy +- Apart from fixing the signing space, making Documenso successful would be another domino tile toward open source eating the world, which is great for everyone -Building a company is so complex, it can’t be planned out. Basing it on great fundamentals and the expected dynamics it is the best founders can do in my humble opinion. After these fundamental decisions, you are (almost) just along for the ride and need to focus on solving the “conventional” problems of starting a company the best you can. With digital signatures hitting so many points of my personal and professional checklist, this already was a great fit. What got me excited at first though, apart from the perspective of drinking caffeine and coding, was this: +Building a company is so complex it can't be planned out. Basing it on great fundamentals and the expected dynamics is the best founders can do, in my humble opinion. After these fundamental decisions, you are (almost) just along for the ride and need to focus on solving the "conventional" problems of starting a company the best you can. With digital signatures hitting so many points of my personal and professional checklist, this already was a great fit. What got me excited at first, though, apart from the perspective of drinking caffeine and coding, was this: -Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, 2 years validity, from VeriSign I think. Apart from it being ridiculously complicated to get, even back then it bothered me, that we had basically paid for $200 for what is essentially a long number, someone generated. SSL wasn’t even that widespread back then, because it was mainly considered important for e-commerce, no wonder considering it cost so much. “Why would I encrypt a blog?”. Fast forward to today, and everyone can get a free SSL cert courtesy of Let’s Encrypt and browsers block unencrypted sites. Mostly even build into hosting platforms so you barely even notice as a developer. +Roughly 13 years ago, I was launching my first product. We obviously wanted SSL encryption on the product site, so I had to buy an SSL certificate. ~$200ish, two years validity, from VeriSign, I think. Apart from it being ridiculously complicated to get, it bothered me that we had basically paid $200 for what is essentially a long number someone generated. SSL wasn't even that widespread back then because it was mainly considered important for e-commerce, no wonder considering it cost so much. "Why would I encrypt a blog?". Fast forward to today, and everyone can get a free SSL cert courtesy of [Let's Encrypt](https://letsencrypt.org/) and browsers are basically blocking unencrypted sites. Mostly, it is even built into hosting platforms, so you barely even notice as a developer. -I had forgotten all about that story until I realized, this is where signing is today. A global need, fulfilled only by closed ecosystem, not really state-of-the-art companies, leading to, let’s call it steep prices. I had for so long considered Let’s Encrypt a pillar of the open internet, that I forgot that they weren’t always there. One day someone said, let’s make the internet better. Signing is another domain, that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the “pre Let’s Encrypt world”. Free document signing certificates via "Let’s Sign" are now another to-do on the [longterm roadmap](https://documen.so/roadmap) list for the open signing ecosystem. Effecting this change in any way is a huge driver for me. +I had forgotten all about that story until I realized this is where signing is today. A global need fulfilled only by a closed ecosystem, not really state-of-the-art companies, leading to, let's call it, steep prices. I had considered Let's Encrypt a pillar of the open internet for so long that I forgot that they weren't always there. One day, someone said, let's make the internet better. Signing is another domain that should have had an open ecosystem for a long time. Another parallel to that story is the fact that the cryptographic certificates you need for document signing are also stuck in the "pre-Let's Encrypt world." Free document signing certificates via "Let's Sign" are now another to-do on the [long-term roadmap](https://documen.so/roadmap) list for the open signing ecosystem. Effecting this change in any way is a huge driver for me. -Apart from my personal gripes with the coporate certificate industry, I always found encryption fascinating. It’s such a fundamental force in society when you think about it: Secure Communication, Secure Commerce and even internet native money (Bitcoin) was created using a bit of smart math. All these examples are expressions of very fundamental human behaviours, that should be enabled and protected by open infrastructures. +Apart from my personal gripes with the corporate certificate industry, I have always found encryption fascinating. It's such a fundamental force in society when you think about it: Secure Communication, Secure Commerce, and even [internet native, open source money (Bitcoin)](https://github.com/bitcoin/bitcoin) were created using a bit of smart math. All these examples are expressions of very fundamental human behaviors that should be enabled and protected by open infrastructures. -I never told anyone before, but since starting Documenso I realized that I underestimated the impact and importance of open source for quite some time. When I was in University, I distantly remember my mindset of “yeah open source is nice, but the great, commercially successful products used in the real world are build by closed companies (aka Microsoft)” _shudder_ It was never really a conscious thought, but enough that I started learning MS Silverlight before plain Javascript. It was slowly over time, that I realized that open web standards are superior to closed ones and even later that I understood the same holds true for all software. Open sources fixes something in the economy, I find hard to articulate. I did my best in [commodifying signing]. +I never told rthis to anyone before, but since starting Documenso, I realized that I underestimated the impact and importance of open source for quite some time. When I was in University, I distantly remember my mindset of "yeah, open source is nice, but the great, commercially successful products used in the real world are built by closed companies (aka Microsoft)" _shudder_ It was never really a conscious thought, but enough that I started learning MS Silverlight before plain Javascript. It was slowly, over time, that I realized that open web standards are superior to closed ones, and even later, I understood the same holds true for all software. Open source fixes something in the economy I find hard to articulate. I did my best in [Commodifying Signing](https://documenso.com/blog/commodifying-signing). -To wrap this up, Documenso happens to be the perfect storm of market opportunity, my interests, and my passions. Creating a company people want to work for the long term while tackling these issues is a critical side quest of Documenso. This is not only about building the next generation of signing tech, it’s also about doing our part to normalize open, healthy, efficient working cultures, and tackling relevant problems. +To wrap this up, Documenso happens to be the perfect storm of market opportunity, my interests, and my passions. Creating a company in which people want to work for the long term while tackling these issues is a critical side quest of Documenso. This is not only about building the next generation of signing tech; it's also about doing our part to normalize open, healthy, efficient working cultures and tackling relevant problems. -As always, feel free to connect on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord) if you have any questions or comments. +As always, feel free to connect on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord) if you have any questions, comments, thoughts or feelings. +\ Best from Hamburg\ Timur From e97b9b4f1cd9a200e169059593737853fc351957 Mon Sep 17 00:00:00 2001 From: David Nguyen Date: Thu, 8 Feb 2024 12:33:20 +1100 Subject: [PATCH 14/14] feat: add team templates (#912) --- .../documents/[id]/document-page-view.tsx | 4 +- .../app/(dashboard)/documents/[id]/page.tsx | 2 +- .../documents/documents-page-view.tsx | 7 +- .../src/app/(dashboard)/documents/page.tsx | 2 +- .../templates/[id]/edit-template.tsx | 4 +- .../app/(dashboard)/templates/[id]/page.tsx | 81 +------ .../templates/[id]/template-page-view.tsx | 86 ++++++++ .../templates/data-table-action-dropdown.tsx | 25 ++- .../templates/data-table-templates.tsx | 15 +- .../templates/delete-template-dialog.tsx | 35 ++- .../templates/duplicate-template-dialog.tsx | 56 ++--- .../templates/new-template-dialog.tsx | 11 +- .../src/app/(dashboard)/templates/page.tsx | 50 +---- .../templates/templates-page-view.tsx | 73 +++++++ .../t/[teamUrl]/documents/[id]/page.tsx | 4 +- .../(teams)/t/[teamUrl]/documents/page.tsx | 2 +- .../t/[teamUrl]/templates/[id]/page.tsx | 22 ++ .../(teams)/t/[teamUrl]/templates/page.tsx | 26 +++ .../(dashboard)/layout/desktop-nav.tsx | 34 ++- .../(dashboard)/layout/menu-switcher.tsx | 22 +- .../(dashboard)/layout/mobile-navigation.tsx | 2 +- .../e2e/templates/manage-templates.spec.ts | 205 ++++++++++++++++++ packages/lib/constants/teams.ts | 1 + .../field/get-fields-for-template.ts | 15 +- .../field/set-fields-for-template.ts | 15 +- .../recipient/get-recipients-for-template.ts | 15 +- .../recipient/set-recipients-for-template.ts | 15 +- .../template/create-document-from-template.ts | 19 +- .../server-only/template/create-template.ts | 18 +- .../server-only/template/delete-template.ts | 20 +- .../template/duplicate-template.ts | 30 ++- .../server-only/template/find-templates.ts | 56 +++++ .../template/get-template-by-id.ts | 24 +- .../lib/server-only/template/get-templates.ts | 35 --- packages/lib/utils/teams.ts | 4 + .../migration.sql | 5 + packages/prisma/schema.prisma | 5 +- packages/prisma/seed/templates.ts | 36 +++ packages/trpc/server/field-router/router.ts | 2 +- .../trpc/server/recipient-router/router.ts | 4 +- .../trpc/server/template-router/router.ts | 12 +- .../trpc/server/template-router/schema.ts | 4 +- 42 files changed, 831 insertions(+), 272 deletions(-) create mode 100644 apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx create mode 100644 apps/web/src/app/(dashboard)/templates/templates-page-view.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx create mode 100644 apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx create mode 100644 packages/app-tests/e2e/templates/manage-templates.spec.ts create mode 100644 packages/lib/server-only/template/find-templates.ts delete mode 100644 packages/lib/server-only/template/get-templates.ts create mode 100644 packages/prisma/migrations/20240206051948_add_teams_templates/migration.sql create mode 100644 packages/prisma/seed/templates.ts diff --git a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx index 3a46ed5e7..6759d91ac 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/document-page-view.tsx @@ -25,7 +25,7 @@ export type DocumentPageViewProps = { team?: Team; }; -export default async function DocumentPageView({ params, team }: DocumentPageViewProps) { +export const DocumentPageView = async ({ params, team }: DocumentPageViewProps) => { const { id } = params; const documentId = Number(id); @@ -128,4 +128,4 @@ export default async function DocumentPageView({ params, team }: DocumentPageVie )} ); -} +}; diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx index e7a34889e..5ad224737 100644 --- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx @@ -1,4 +1,4 @@ -import DocumentPageView from './document-page-view'; +import { DocumentPageView } from './document-page-view'; export type DocumentPageProps = { params: { diff --git a/apps/web/src/app/(dashboard)/documents/documents-page-view.tsx b/apps/web/src/app/(dashboard)/documents/documents-page-view.tsx index ead3e8f4f..9059b8e88 100644 --- a/apps/web/src/app/(dashboard)/documents/documents-page-view.tsx +++ b/apps/web/src/app/(dashboard)/documents/documents-page-view.tsx @@ -33,10 +33,7 @@ export type DocumentsPageViewProps = { team?: Team & { teamEmail?: TeamEmail | null }; }; -export default async function DocumentsPageView({ - searchParams = {}, - team, -}: DocumentsPageViewProps) { +export const DocumentsPageView = async ({ searchParams = {}, team }: DocumentsPageViewProps) => { const { user } = await getRequiredServerComponentSession(); const status = isExtendedDocumentStatus(searchParams.status) ? searchParams.status : 'ALL'; @@ -155,4 +152,4 @@ export default async function DocumentsPageView({ ); -} +}; diff --git a/apps/web/src/app/(dashboard)/documents/page.tsx b/apps/web/src/app/(dashboard)/documents/page.tsx index b67ed6f02..67f432a13 100644 --- a/apps/web/src/app/(dashboard)/documents/page.tsx +++ b/apps/web/src/app/(dashboard)/documents/page.tsx @@ -1,7 +1,7 @@ import type { Metadata } from 'next'; import type { DocumentsPageViewProps } from './documents-page-view'; -import DocumentsPageView from './documents-page-view'; +import { DocumentsPageView } from './documents-page-view'; export type DocumentsPageProps = { searchParams?: DocumentsPageViewProps['searchParams']; diff --git a/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx b/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx index bdc769e79..f8c7f9a43 100644 --- a/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx +++ b/apps/web/src/app/(dashboard)/templates/[id]/edit-template.tsx @@ -28,6 +28,7 @@ export type EditTemplateFormProps = { recipients: Recipient[]; fields: Field[]; documentData: DocumentData; + templateRootPath: string; }; type EditTemplateStep = 'signers' | 'fields'; @@ -40,6 +41,7 @@ export const EditTemplateForm = ({ fields, user: _user, documentData, + templateRootPath, }: EditTemplateFormProps) => { const { toast } = useToast(); const router = useRouter(); @@ -98,7 +100,7 @@ export const EditTemplateForm = ({ duration: 5000, }); - router.push('/templates'); + router.push(templateRootPath); } catch (err) { toast({ title: 'Error', diff --git a/apps/web/src/app/(dashboard)/templates/[id]/page.tsx b/apps/web/src/app/(dashboard)/templates/[id]/page.tsx index 6d234eff2..aa55d1943 100644 --- a/apps/web/src/app/(dashboard)/templates/[id]/page.tsx +++ b/apps/web/src/app/(dashboard)/templates/[id]/page.tsx @@ -1,81 +1,10 @@ import React from 'react'; -import Link from 'next/link'; -import { redirect } from 'next/navigation'; +import type { TemplatePageViewProps } from './template-page-view'; +import { TemplatePageView } from './template-page-view'; -import { ChevronLeft } from 'lucide-react'; +type TemplatePageProps = Pick; -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { getFieldsForTemplate } from '@documenso/lib/server-only/field/get-fields-for-template'; -import { getRecipientsForTemplate } from '@documenso/lib/server-only/recipient/get-recipients-for-template'; -import { getTemplateById } from '@documenso/lib/server-only/template/get-template-by-id'; - -import { TemplateType } from '~/components/formatter/template-type'; - -import { EditTemplateForm } from './edit-template'; - -export type TemplatePageProps = { - params: { - id: string; - }; -}; - -export default async function TemplatePage({ params }: TemplatePageProps) { - const { id } = params; - - const templateId = Number(id); - - if (!templateId || Number.isNaN(templateId)) { - redirect('/documents'); - } - - const { user } = await getRequiredServerComponentSession(); - - const template = await getTemplateById({ - id: templateId, - userId: user.id, - }).catch(() => null); - - if (!template || !template.templateDocumentData) { - redirect('/documents'); - } - - const { templateDocumentData } = template; - - const [templateRecipients, templateFields] = await Promise.all([ - getRecipientsForTemplate({ - templateId, - userId: user.id, - }), - getFieldsForTemplate({ - templateId, - userId: user.id, - }), - ]); - - return ( -
- - - Templates - - -

- {template.title} -

- -
- -
- - -
- ); +export default function TemplatePage({ params }: TemplatePageProps) { + return ; } diff --git a/apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx b/apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx new file mode 100644 index 000000000..899e600f1 --- /dev/null +++ b/apps/web/src/app/(dashboard)/templates/[id]/template-page-view.tsx @@ -0,0 +1,86 @@ +import React from 'react'; + +import Link from 'next/link'; +import { redirect } from 'next/navigation'; + +import { ChevronLeft } from 'lucide-react'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getFieldsForTemplate } from '@documenso/lib/server-only/field/get-fields-for-template'; +import { getRecipientsForTemplate } from '@documenso/lib/server-only/recipient/get-recipients-for-template'; +import { getTemplateById } from '@documenso/lib/server-only/template/get-template-by-id'; +import { formatTemplatesPath } from '@documenso/lib/utils/teams'; +import type { Team } from '@documenso/prisma/client'; + +import { TemplateType } from '~/components/formatter/template-type'; + +import { EditTemplateForm } from './edit-template'; + +export type TemplatePageViewProps = { + params: { + id: string; + }; + team?: Team; +}; + +export const TemplatePageView = async ({ params, team }: TemplatePageViewProps) => { + const { id } = params; + + const templateId = Number(id); + const templateRootPath = formatTemplatesPath(team?.url); + + if (!templateId || Number.isNaN(templateId)) { + redirect(templateRootPath); + } + + const { user } = await getRequiredServerComponentSession(); + + const template = await getTemplateById({ + id: templateId, + userId: user.id, + }).catch(() => null); + + if (!template || !template.templateDocumentData) { + redirect(templateRootPath); + } + + const { templateDocumentData } = template; + + const [templateRecipients, templateFields] = await Promise.all([ + getRecipientsForTemplate({ + templateId, + userId: user.id, + }), + getFieldsForTemplate({ + templateId, + userId: user.id, + }), + ]); + + return ( +
+ + + Templates + + +

+ {template.title} +

+ +
+ +
+ + +
+ ); +}; diff --git a/apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx b/apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx index 9f26d632c..eee32b920 100644 --- a/apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx +++ b/apps/web/src/app/(dashboard)/templates/data-table-action-dropdown.tsx @@ -21,9 +21,15 @@ import { DuplicateTemplateDialog } from './duplicate-template-dialog'; export type DataTableActionDropdownProps = { row: Template; + templateRootPath: string; + teamId?: number; }; -export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) => { +export const DataTableActionDropdown = ({ + row, + templateRootPath, + teamId, +}: DataTableActionDropdownProps) => { const { data: session } = useSession(); const [isDeleteDialogOpen, setDeleteDialogOpen] = useState(false); @@ -34,6 +40,7 @@ export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) = } const isOwner = row.userId === session.user.id; + const isTeamTemplate = row.teamId === teamId; return ( @@ -44,20 +51,25 @@ export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) = Action - - + + Edit - {/* onDuplicateButtonClick(row.id)}> */} - setDuplicateDialogOpen(true)}> + setDuplicateDialogOpen(true)} + > Duplicate - setDeleteDialogOpen(true)}> + setDeleteDialogOpen(true)} + > Delete @@ -65,6 +77,7 @@ export const DataTableActionDropdown = ({ row }: DataTableActionDropdownProps) = diff --git a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx index 0e8f822c2..309695c88 100644 --- a/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx +++ b/apps/web/src/app/(dashboard)/templates/data-table-templates.tsx @@ -28,6 +28,9 @@ type TemplatesDataTableProps = { perPage: number; page: number; totalPages: number; + documentRootPath: string; + templateRootPath: string; + teamId?: number; }; export const TemplatesDataTable = ({ @@ -35,6 +38,9 @@ export const TemplatesDataTable = ({ perPage, page, totalPages, + documentRootPath, + templateRootPath, + teamId, }: TemplatesDataTableProps) => { const [isPending, startTransition] = useTransition(); const updateSearchParams = useUpdateSearchParams(); @@ -70,7 +76,7 @@ export const TemplatesDataTable = ({ duration: 5000, }); - router.push(`/documents/${id}`); + router.push(`${documentRootPath}/${id}`); } catch (err) { toast({ title: 'Error', @@ -131,7 +137,12 @@ export const TemplatesDataTable = ({ {!isRowLoading && } Use Template - + + ); }, diff --git a/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx index 9075f4677..b31ad2048 100644 --- a/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/delete-template-dialog.tsx @@ -35,20 +35,15 @@ export const DeleteTemplateDialog = ({ id, open, onOpenChange }: DeleteTemplateD onOpenChange(false); }, - }); - - const onDeleteTemplate = async () => { - try { - await deleteTemplate({ id }); - } catch { + onError: () => { toast({ title: 'Something went wrong', description: 'This template could not be deleted at this time. Please try again.', variant: 'destructive', duration: 7500, }); - } - }; + }, + }); return ( !isLoading && onOpenChange(value)}> @@ -63,20 +58,18 @@ export const DeleteTemplateDialog = ({ id, open, onOpenChange }: DeleteTemplateD -
- + - -
+
diff --git a/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx index be743ff48..cdd3000c2 100644 --- a/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/duplicate-template-dialog.tsx @@ -14,12 +14,14 @@ import { useToast } from '@documenso/ui/primitives/use-toast'; type DuplicateTemplateDialogProps = { id: number; + teamId?: number; open: boolean; onOpenChange: (_open: boolean) => void; }; export const DuplicateTemplateDialog = ({ id, + teamId, open, onOpenChange, }: DuplicateTemplateDialogProps) => { @@ -40,22 +42,15 @@ export const DuplicateTemplateDialog = ({ onOpenChange(false); }, + onError: () => { + toast({ + title: 'Error', + description: 'An error occurred while duplicating template.', + variant: 'destructive', + }); + }, }); - const onDuplicate = async () => { - try { - await duplicateTemplate({ - templateId: id, - }); - } catch (err) { - toast({ - title: 'Error', - description: 'An error occurred while duplicating template.', - variant: 'destructive', - }); - } - }; - return ( !isLoading && onOpenChange(value)}> @@ -66,20 +61,27 @@ export const DuplicateTemplateDialog = ({ -
- + - -
+
diff --git a/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx b/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx index a4aa9bce2..37d60f946 100644 --- a/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx +++ b/apps/web/src/app/(dashboard)/templates/new-template-dialog.tsx @@ -43,8 +43,14 @@ const ZCreateTemplateFormSchema = z.object({ type TCreateTemplateFormSchema = z.infer; -export const NewTemplateDialog = () => { +type NewTemplateDialogProps = { + teamId?: number; + templateRootPath: string; +}; + +export const NewTemplateDialog = ({ teamId, templateRootPath }: NewTemplateDialogProps) => { const router = useRouter(); + const { data: session } = useSession(); const { toast } = useToast(); @@ -99,6 +105,7 @@ export const NewTemplateDialog = () => { }); const { id } = await createTemplate({ + teamId, title: values.name ? values.name : file.name, templateDocumentDataId, }); @@ -112,7 +119,7 @@ export const NewTemplateDialog = () => { setShowNewTemplateDialog(false); - void router.push(`/templates/${id}`); + router.push(`${templateRootPath}/${id}`); } catch { toast({ title: 'Something went wrong', diff --git a/apps/web/src/app/(dashboard)/templates/page.tsx b/apps/web/src/app/(dashboard)/templates/page.tsx index d3dacd501..7c7bd4e4f 100644 --- a/apps/web/src/app/(dashboard)/templates/page.tsx +++ b/apps/web/src/app/(dashboard)/templates/page.tsx @@ -2,57 +2,17 @@ import React from 'react'; import type { Metadata } from 'next'; -import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; -import { getTemplates } from '@documenso/lib/server-only/template/get-templates'; - -import { TemplatesDataTable } from './data-table-templates'; -import { EmptyTemplateState } from './empty-state'; -import { NewTemplateDialog } from './new-template-dialog'; +import { TemplatesPageView } from './templates-page-view'; +import type { TemplatesPageViewProps } from './templates-page-view'; type TemplatesPageProps = { - searchParams?: { - page?: number; - perPage?: number; - }; + searchParams?: TemplatesPageViewProps['searchParams']; }; export const metadata: Metadata = { title: 'Templates', }; -export default async function TemplatesPage({ searchParams = {} }: TemplatesPageProps) { - const { user } = await getRequiredServerComponentSession(); - const page = Number(searchParams.page) || 1; - const perPage = Number(searchParams.perPage) || 10; - - const { templates, totalPages } = await getTemplates({ - userId: user.id, - page: page, - perPage: perPage, - }); - - return ( -
-
-

Templates

- -
- -
-
- -
- {templates.length > 0 ? ( - - ) : ( - - )} -
-
- ); +export default function TemplatesPage({ searchParams = {} }: TemplatesPageProps) { + return ; } diff --git a/apps/web/src/app/(dashboard)/templates/templates-page-view.tsx b/apps/web/src/app/(dashboard)/templates/templates-page-view.tsx new file mode 100644 index 000000000..4736f4268 --- /dev/null +++ b/apps/web/src/app/(dashboard)/templates/templates-page-view.tsx @@ -0,0 +1,73 @@ +import React from 'react'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { findTemplates } from '@documenso/lib/server-only/template/find-templates'; +import { formatDocumentsPath, formatTemplatesPath } from '@documenso/lib/utils/teams'; +import type { Team } from '@documenso/prisma/client'; +import { Avatar, AvatarFallback } from '@documenso/ui/primitives/avatar'; + +import { TemplatesDataTable } from './data-table-templates'; +import { EmptyTemplateState } from './empty-state'; +import { NewTemplateDialog } from './new-template-dialog'; + +export type TemplatesPageViewProps = { + searchParams?: { + page?: number; + perPage?: number; + }; + team?: Team; +}; + +export const TemplatesPageView = async ({ searchParams = {}, team }: TemplatesPageViewProps) => { + const { user } = await getRequiredServerComponentSession(); + const page = Number(searchParams.page) || 1; + const perPage = Number(searchParams.perPage) || 10; + + const documentRootPath = formatDocumentsPath(team?.url); + const templateRootPath = formatTemplatesPath(team?.url); + + const { templates, totalPages } = await findTemplates({ + userId: user.id, + teamId: team?.id, + page: page, + perPage: perPage, + }); + + return ( +
+
+
+ {team && ( + + + {team.name.slice(0, 1)} + + + )} + +

Templates

+
+ +
+ +
+
+ +
+ {templates.length > 0 ? ( + + ) : ( + + )} +
+
+ ); +}; diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx index b7f610cff..26b1d7c91 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/[id]/page.tsx @@ -1,7 +1,7 @@ import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; -import DocumentPageComponent from '~/app/(dashboard)/documents/[id]/document-page-view'; +import { DocumentPageView } from '~/app/(dashboard)/documents/[id]/document-page-view'; export type DocumentPageProps = { params: { @@ -16,5 +16,5 @@ export default async function DocumentPage({ params }: DocumentPageProps) { const { user } = await getRequiredServerComponentSession(); const team = await getTeamByUrl({ userId: user.id, teamUrl }); - return ; + return ; } diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx index 952aeeeea..d3d5b5bee 100644 --- a/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx +++ b/apps/web/src/app/(teams)/t/[teamUrl]/documents/page.tsx @@ -2,7 +2,7 @@ import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get- import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; import type { DocumentsPageViewProps } from '~/app/(dashboard)/documents/documents-page-view'; -import DocumentsPageView from '~/app/(dashboard)/documents/documents-page-view'; +import { DocumentsPageView } from '~/app/(dashboard)/documents/documents-page-view'; export type TeamsDocumentPageProps = { params: { diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx new file mode 100644 index 000000000..3fe7cbf67 --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/templates/[id]/page.tsx @@ -0,0 +1,22 @@ +import React from 'react'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; + +import type { TemplatePageViewProps } from '~/app/(dashboard)/templates/[id]/template-page-view'; +import { TemplatePageView } from '~/app/(dashboard)/templates/[id]/template-page-view'; + +type TeamTemplatePageProps = { + params: TemplatePageViewProps['params'] & { + teamUrl: string; + }; +}; + +export default async function TeamTemplatePage({ params }: TeamTemplatePageProps) { + const { teamUrl } = params; + + const { user } = await getRequiredServerComponentSession(); + const team = await getTeamByUrl({ userId: user.id, teamUrl }); + + return ; +} diff --git a/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx b/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx new file mode 100644 index 000000000..6954d8e2d --- /dev/null +++ b/apps/web/src/app/(teams)/t/[teamUrl]/templates/page.tsx @@ -0,0 +1,26 @@ +import React from 'react'; + +import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session'; +import { getTeamByUrl } from '@documenso/lib/server-only/team/get-team'; + +import type { TemplatesPageViewProps } from '~/app/(dashboard)/templates/templates-page-view'; +import { TemplatesPageView } from '~/app/(dashboard)/templates/templates-page-view'; + +type TeamTemplatesPageProps = { + searchParams?: TemplatesPageViewProps['searchParams']; + params: { + teamUrl: string; + }; +}; + +export default async function TeamTemplatesPage({ + searchParams = {}, + params, +}: TeamTemplatesPageProps) { + const { teamUrl } = params; + + const { user } = await getRequiredServerComponentSession(); + const team = await getTeamByUrl({ userId: user.id, teamUrl }); + + return ; +} diff --git a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx index 2b11c4be2..9eef1f4bd 100644 --- a/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx +++ b/apps/web/src/components/(dashboard)/layout/desktop-nav.tsx @@ -52,24 +52,22 @@ export const DesktopNav = ({ className, ...props }: DesktopNavProps) => { {...props} >
- {navigationLinks - .filter(({ href }) => href !== '/templates' || rootHref === '') // Remove templates for team pages. - .map(({ href, label }) => ( - - {label} - - ))} + {navigationLinks.map(({ href, label }) => ( + + {label} + + ))}
diff --git a/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx index 35a05baf2..195716d64 100644 --- a/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx +++ b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx @@ -6,7 +6,7 @@ import { usePathname } from 'next/navigation'; import { CheckCircle2, ChevronsUpDown, Plus, Settings2 } from 'lucide-react'; import { signOut } from 'next-auth/react'; -import { TEAM_MEMBER_ROLE_MAP } from '@documenso/lib/constants/teams'; +import { TEAM_MEMBER_ROLE_MAP, TEAM_URL_REGEX } from '@documenso/lib/constants/teams'; import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin'; import type { GetTeamsResponse } from '@documenso/lib/server-only/team/get-teams'; import { extractInitials } from '@documenso/lib/utils/recipient-formatter'; @@ -71,6 +71,22 @@ export const MenuSwitcher = ({ user, teams: initialTeamsData }: MenuSwitcherProp return TEAM_MEMBER_ROLE_MAP[team.currentTeamMember.role]; }; + /** + * Formats the redirect URL so we can switch between documents and templates page + * seemlessly between teams and personal accounts. + */ + const formatRedirectUrlOnSwitch = (teamUrl?: string) => { + const baseUrl = teamUrl ? `/t/${teamUrl}/` : '/'; + + const currentPathname = (pathname ?? '/').replace(TEAM_URL_REGEX, ''); + + if (currentPathname === '/templates') { + return `${baseUrl}templates`; + } + + return baseUrl; + }; + return ( @@ -100,7 +116,7 @@ export const MenuSwitcher = ({ user, teams: initialTeamsData }: MenuSwitcherProp Personal - + ( - + text !== 'Templates' || href === '/templates'); // Filter out templates for teams. + ]; return ( diff --git a/packages/app-tests/e2e/templates/manage-templates.spec.ts b/packages/app-tests/e2e/templates/manage-templates.spec.ts new file mode 100644 index 000000000..53edc705d --- /dev/null +++ b/packages/app-tests/e2e/templates/manage-templates.spec.ts @@ -0,0 +1,205 @@ +import { expect, test } from '@playwright/test'; + +import { WEBAPP_BASE_URL } from '@documenso/lib/constants/app'; +import { seedTeam, unseedTeam } from '@documenso/prisma/seed/teams'; +import { seedTemplate } from '@documenso/prisma/seed/templates'; + +import { manualLogin } from '../fixtures/authentication'; + +test.describe.configure({ mode: 'parallel' }); + +test('[TEMPLATES]: view templates', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const owner = team.owner; + const teamMemberUser = team.members[1].user; + + // Should only be visible to the owner in personal templates. + await seedTemplate({ + title: 'Personal template', + userId: owner.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 1', + userId: owner.id, + teamId: team.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 2', + userId: teamMemberUser.id, + teamId: team.id, + }); + + await manualLogin({ + page, + email: owner.email, + redirectPath: '/templates', + }); + + // Owner should see both team templates. + await page.goto(`${WEBAPP_BASE_URL}/t/${team.url}/templates`); + await expect(page.getByRole('main')).toContainText('Showing 2 results'); + + // Only should only see their personal template. + await page.goto(`${WEBAPP_BASE_URL}/templates`); + await expect(page.getByRole('main')).toContainText('Showing 1 result'); + + await unseedTeam(team.url); +}); + +test('[TEMPLATES]: delete template', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const owner = team.owner; + const teamMemberUser = team.members[1].user; + + // Should only be visible to the owner in personal templates. + await seedTemplate({ + title: 'Personal template', + userId: owner.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 1', + userId: owner.id, + teamId: team.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 2', + userId: teamMemberUser.id, + teamId: team.id, + }); + + await manualLogin({ + page, + email: owner.email, + redirectPath: '/templates', + }); + + // Owner should be able to delete their personal template. + await page.getByRole('cell', { name: 'Use Template' }).getByRole('button').nth(1).click(); + await page.getByRole('menuitem', { name: 'Delete' }).click(); + await page.getByRole('button', { name: 'Delete' }).click(); + await expect(page.getByText('Template deleted').first()).toBeVisible(); + + // Team member should be able to delete all templates. + await page.goto(`${WEBAPP_BASE_URL}/t/${team.url}/templates`); + + for (const template of ['Team template 1', 'Team template 2']) { + await page + .getByRole('row', { name: template }) + .getByRole('cell', { name: 'Use Template' }) + .getByRole('button') + .nth(1) + .click(); + + await page.getByRole('menuitem', { name: 'Delete' }).click(); + await page.getByRole('button', { name: 'Delete' }).click(); + await expect(page.getByText('Template deleted').first()).toBeVisible(); + } + + await unseedTeam(team.url); +}); + +test('[TEMPLATES]: duplicate template', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const owner = team.owner; + const teamMemberUser = team.members[1].user; + + // Should only be visible to the owner in personal templates. + await seedTemplate({ + title: 'Personal template', + userId: owner.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 1', + userId: teamMemberUser.id, + teamId: team.id, + }); + + await manualLogin({ + page, + email: owner.email, + redirectPath: '/templates', + }); + + // Duplicate personal template. + await page.getByRole('cell', { name: 'Use Template' }).getByRole('button').nth(1).click(); + await page.getByRole('menuitem', { name: 'Duplicate' }).click(); + await page.getByRole('button', { name: 'Duplicate' }).click(); + await expect(page.getByText('Template duplicated').first()).toBeVisible(); + await expect(page.getByRole('main')).toContainText('Showing 2 results'); + + await page.goto(`${WEBAPP_BASE_URL}/t/${team.url}/templates`); + + // Duplicate team template. + await page.getByRole('cell', { name: 'Use Template' }).getByRole('button').nth(1).click(); + await page.getByRole('menuitem', { name: 'Duplicate' }).click(); + await page.getByRole('button', { name: 'Duplicate' }).click(); + await expect(page.getByText('Template duplicated').first()).toBeVisible(); + await expect(page.getByRole('main')).toContainText('Showing 2 results'); + + await unseedTeam(team.url); +}); + +test('[TEMPLATES]: use template', async ({ page }) => { + const team = await seedTeam({ + createTeamMembers: 1, + }); + + const owner = team.owner; + const teamMemberUser = team.members[1].user; + + // Should only be visible to the owner in personal templates. + await seedTemplate({ + title: 'Personal template', + userId: owner.id, + }); + + // Should be visible to team members. + await seedTemplate({ + title: 'Team template 1', + userId: teamMemberUser.id, + teamId: team.id, + }); + + await manualLogin({ + page, + email: owner.email, + redirectPath: '/templates', + }); + + // Use personal template. + await page.getByRole('button', { name: 'Use Template' }).click(); + await page.waitForURL(/documents/); + await page.getByRole('main').getByRole('link', { name: 'Documents' }).click(); + await page.waitForURL('/documents'); + await expect(page.getByRole('main')).toContainText('Showing 1 result'); + + await page.goto(`${WEBAPP_BASE_URL}/t/${team.url}/templates`); + + // Use team template. + await page.getByRole('button', { name: 'Use Template' }).click(); + await page.waitForURL(/\/t\/.+\/documents/); + await page.getByRole('main').getByRole('link', { name: 'Documents' }).click(); + await page.waitForURL(`/t/${team.url}/documents`); + await expect(page.getByRole('main')).toContainText('Showing 1 result'); + + await unseedTeam(team.url); +}); diff --git a/packages/lib/constants/teams.ts b/packages/lib/constants/teams.ts index 47705bb14..67f3ef16f 100644 --- a/packages/lib/constants/teams.ts +++ b/packages/lib/constants/teams.ts @@ -1,6 +1,7 @@ import { TeamMemberRole } from '@documenso/prisma/client'; export const TEAM_URL_ROOT_REGEX = new RegExp('^/t/[^/]+$'); +export const TEAM_URL_REGEX = new RegExp('^/t/[^/]+'); export const TEAM_MEMBER_ROLE_MAP: Record = { ADMIN: 'Admin', diff --git a/packages/lib/server-only/field/get-fields-for-template.ts b/packages/lib/server-only/field/get-fields-for-template.ts index c174d7eff..724ec75fb 100644 --- a/packages/lib/server-only/field/get-fields-for-template.ts +++ b/packages/lib/server-only/field/get-fields-for-template.ts @@ -10,7 +10,20 @@ export const getFieldsForTemplate = async ({ templateId, userId }: GetFieldsForT where: { templateId, Template: { - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }, orderBy: { diff --git a/packages/lib/server-only/field/set-fields-for-template.ts b/packages/lib/server-only/field/set-fields-for-template.ts index 9431666bf..2062e06bc 100644 --- a/packages/lib/server-only/field/set-fields-for-template.ts +++ b/packages/lib/server-only/field/set-fields-for-template.ts @@ -27,7 +27,20 @@ export const setFieldsForTemplate = async ({ const template = await prisma.template.findFirst({ where: { id: templateId, - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }); diff --git a/packages/lib/server-only/recipient/get-recipients-for-template.ts b/packages/lib/server-only/recipient/get-recipients-for-template.ts index ab6f860eb..4b393353d 100644 --- a/packages/lib/server-only/recipient/get-recipients-for-template.ts +++ b/packages/lib/server-only/recipient/get-recipients-for-template.ts @@ -13,7 +13,20 @@ export const getRecipientsForTemplate = async ({ where: { templateId, Template: { - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }, orderBy: { diff --git a/packages/lib/server-only/recipient/set-recipients-for-template.ts b/packages/lib/server-only/recipient/set-recipients-for-template.ts index c21c8cbf9..7c96bcf44 100644 --- a/packages/lib/server-only/recipient/set-recipients-for-template.ts +++ b/packages/lib/server-only/recipient/set-recipients-for-template.ts @@ -20,7 +20,20 @@ export const setRecipientsForTemplate = async ({ const template = await prisma.template.findFirst({ where: { id: templateId, - userId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], }, }); diff --git a/packages/lib/server-only/template/create-document-from-template.ts b/packages/lib/server-only/template/create-document-from-template.ts index 1c23d8f85..c520d4ce1 100644 --- a/packages/lib/server-only/template/create-document-from-template.ts +++ b/packages/lib/server-only/template/create-document-from-template.ts @@ -11,7 +11,23 @@ export const createDocumentFromTemplate = async ({ userId, }: CreateDocumentFromTemplateOptions) => { const template = await prisma.template.findUnique({ - where: { id: templateId, userId }, + where: { + id: templateId, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], + }, include: { Recipient: true, Field: true, @@ -34,6 +50,7 @@ export const createDocumentFromTemplate = async ({ const document = await prisma.document.create({ data: { userId, + teamId: template.teamId, title: template.title, documentDataId: documentData.id, Recipient: { diff --git a/packages/lib/server-only/template/create-template.ts b/packages/lib/server-only/template/create-template.ts index d00526a64..e51d69485 100644 --- a/packages/lib/server-only/template/create-template.ts +++ b/packages/lib/server-only/template/create-template.ts @@ -1,20 +1,36 @@ import { prisma } from '@documenso/prisma'; -import { TCreateTemplateMutationSchema } from '@documenso/trpc/server/template-router/schema'; +import type { TCreateTemplateMutationSchema } from '@documenso/trpc/server/template-router/schema'; export type CreateTemplateOptions = TCreateTemplateMutationSchema & { userId: number; + teamId?: number; }; export const createTemplate = async ({ title, userId, + teamId, templateDocumentDataId, }: CreateTemplateOptions) => { + if (teamId) { + await prisma.team.findFirstOrThrow({ + where: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + }); + } + return await prisma.template.create({ data: { title, userId, templateDocumentDataId, + teamId, }, }); }; diff --git a/packages/lib/server-only/template/delete-template.ts b/packages/lib/server-only/template/delete-template.ts index f693bcec0..c24cc1333 100644 --- a/packages/lib/server-only/template/delete-template.ts +++ b/packages/lib/server-only/template/delete-template.ts @@ -8,5 +8,23 @@ export type DeleteTemplateOptions = { }; export const deleteTemplate = async ({ id, userId }: DeleteTemplateOptions) => { - return await prisma.template.delete({ where: { id, userId } }); + return await prisma.template.delete({ + where: { + id, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], + }, + }); }; diff --git a/packages/lib/server-only/template/duplicate-template.ts b/packages/lib/server-only/template/duplicate-template.ts index 6078a1945..97b3f0a0b 100644 --- a/packages/lib/server-only/template/duplicate-template.ts +++ b/packages/lib/server-only/template/duplicate-template.ts @@ -1,14 +1,39 @@ import { nanoid } from '@documenso/lib/universal/id'; import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; import type { TDuplicateTemplateMutationSchema } from '@documenso/trpc/server/template-router/schema'; export type DuplicateTemplateOptions = TDuplicateTemplateMutationSchema & { userId: number; }; -export const duplicateTemplate = async ({ templateId, userId }: DuplicateTemplateOptions) => { +export const duplicateTemplate = async ({ + templateId, + userId, + teamId, +}: DuplicateTemplateOptions) => { + let templateWhereFilter: Prisma.TemplateWhereUniqueInput = { + id: templateId, + userId, + teamId: null, + }; + + if (teamId !== undefined) { + templateWhereFilter = { + id: templateId, + teamId, + team: { + members: { + some: { + userId, + }, + }, + }, + }; + } + const template = await prisma.template.findUnique({ - where: { id: templateId, userId }, + where: templateWhereFilter, include: { Recipient: true, Field: true, @@ -31,6 +56,7 @@ export const duplicateTemplate = async ({ templateId, userId }: DuplicateTemplat const duplicatedTemplate = await prisma.template.create({ data: { userId, + teamId, title: template.title + ' (copy)', templateDocumentDataId: documentData.id, Recipient: { diff --git a/packages/lib/server-only/template/find-templates.ts b/packages/lib/server-only/template/find-templates.ts new file mode 100644 index 000000000..d453d28a0 --- /dev/null +++ b/packages/lib/server-only/template/find-templates.ts @@ -0,0 +1,56 @@ +import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; + +export type FindTemplatesOptions = { + userId: number; + teamId?: number; + page: number; + perPage: number; +}; + +export const findTemplates = async ({ + userId, + teamId, + page = 1, + perPage = 10, +}: FindTemplatesOptions) => { + let whereFilter: Prisma.TemplateWhereInput = { + userId, + teamId: null, + }; + + if (teamId !== undefined) { + whereFilter = { + team: { + id: teamId, + members: { + some: { + userId, + }, + }, + }, + }; + } + + const [templates, count] = await Promise.all([ + prisma.template.findMany({ + where: whereFilter, + include: { + templateDocumentData: true, + Field: true, + }, + skip: Math.max(page - 1, 0) * perPage, + orderBy: { + createdAt: 'desc', + }, + }), + prisma.template.count({ + where: whereFilter, + }), + ]); + + return { + templates, + totalPages: Math.ceil(count / perPage), + }; +}; diff --git a/packages/lib/server-only/template/get-template-by-id.ts b/packages/lib/server-only/template/get-template-by-id.ts index 56f959a9b..c4295c3c3 100644 --- a/packages/lib/server-only/template/get-template-by-id.ts +++ b/packages/lib/server-only/template/get-template-by-id.ts @@ -1,4 +1,5 @@ import { prisma } from '@documenso/prisma'; +import type { Prisma } from '@documenso/prisma/client'; export interface GetTemplateByIdOptions { id: number; @@ -6,11 +7,26 @@ export interface GetTemplateByIdOptions { } export const getTemplateById = async ({ id, userId }: GetTemplateByIdOptions) => { + const whereFilter: Prisma.TemplateWhereInput = { + id, + OR: [ + { + userId, + }, + { + team: { + members: { + some: { + userId, + }, + }, + }, + }, + ], + }; + return await prisma.template.findFirstOrThrow({ - where: { - id, - userId, - }, + where: whereFilter, include: { templateDocumentData: true, }, diff --git a/packages/lib/server-only/template/get-templates.ts b/packages/lib/server-only/template/get-templates.ts deleted file mode 100644 index 5f802d278..000000000 --- a/packages/lib/server-only/template/get-templates.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { prisma } from '@documenso/prisma'; - -export type GetTemplatesOptions = { - userId: number; - page: number; - perPage: number; -}; - -export const getTemplates = async ({ userId, page = 1, perPage = 10 }: GetTemplatesOptions) => { - const [templates, count] = await Promise.all([ - prisma.template.findMany({ - where: { - userId, - }, - include: { - templateDocumentData: true, - Field: true, - }, - skip: Math.max(page - 1, 0) * perPage, - orderBy: { - createdAt: 'desc', - }, - }), - prisma.template.count({ - where: { - userId, - }, - }), - ]); - - return { - templates, - totalPages: Math.ceil(count / perPage), - }; -}; diff --git a/packages/lib/utils/teams.ts b/packages/lib/utils/teams.ts index eb9be2c2b..c6dfd27fd 100644 --- a/packages/lib/utils/teams.ts +++ b/packages/lib/utils/teams.ts @@ -12,6 +12,10 @@ export const formatDocumentsPath = (teamUrl?: string) => { return teamUrl ? `/t/${teamUrl}/documents` : '/documents'; }; +export const formatTemplatesPath = (teamUrl?: string) => { + return teamUrl ? `/t/${teamUrl}/templates` : '/templates'; +}; + /** * Determines whether a team member can execute a given action. * diff --git a/packages/prisma/migrations/20240206051948_add_teams_templates/migration.sql b/packages/prisma/migrations/20240206051948_add_teams_templates/migration.sql new file mode 100644 index 000000000..3a79168bf --- /dev/null +++ b/packages/prisma/migrations/20240206051948_add_teams_templates/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Template" ADD COLUMN "teamId" INTEGER; + +-- AddForeignKey +ALTER TABLE "Template" ADD CONSTRAINT "Template_teamId_fkey" FOREIGN KEY ("teamId") REFERENCES "Team"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 79dcdf6aa..fc128efc1 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -334,7 +334,8 @@ model Team { owner User @relation(fields: [ownerUserId], references: [id]) subscription Subscription? - document Document[] + document Document[] + templates Template[] } model TeamPending { @@ -415,10 +416,12 @@ model Template { type TemplateType @default(PRIVATE) title String userId Int + teamId Int? templateDocumentDataId String createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt + team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade) templateDocumentData DocumentData @relation(fields: [templateDocumentDataId], references: [id], onDelete: Cascade) User User @relation(fields: [userId], references: [id], onDelete: Cascade) Recipient Recipient[] diff --git a/packages/prisma/seed/templates.ts b/packages/prisma/seed/templates.ts new file mode 100644 index 000000000..7f1b2f8e9 --- /dev/null +++ b/packages/prisma/seed/templates.ts @@ -0,0 +1,36 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +import { prisma } from '..'; +import { DocumentDataType } from '../client'; + +const examplePdf = fs + .readFileSync(path.join(__dirname, '../../../assets/example.pdf')) + .toString('base64'); + +type SeedTemplateOptions = { + title?: string; + userId: number; + teamId?: number; +}; + +export const seedTemplate = async (options: SeedTemplateOptions) => { + const { title = 'Untitled', userId, teamId } = options; + + const documentData = await prisma.documentData.create({ + data: { + type: DocumentDataType.BYTES_64, + data: examplePdf, + initialData: examplePdf, + }, + }); + + return await prisma.template.create({ + data: { + title, + templateDocumentDataId: documentData.id, + userId: userId, + teamId, + }, + }); +}; diff --git a/packages/trpc/server/field-router/router.ts b/packages/trpc/server/field-router/router.ts index 07cdcd347..5ae3cbe4b 100644 --- a/packages/trpc/server/field-router/router.ts +++ b/packages/trpc/server/field-router/router.ts @@ -39,7 +39,7 @@ export const fieldRouter = router({ throw new TRPCError({ code: 'BAD_REQUEST', - message: 'We were unable to sign this field. Please try again later.', + message: 'We were unable to set this field. Please try again later.', }); } }), diff --git a/packages/trpc/server/recipient-router/router.ts b/packages/trpc/server/recipient-router/router.ts index 1ada3d0d3..9553a8aae 100644 --- a/packages/trpc/server/recipient-router/router.ts +++ b/packages/trpc/server/recipient-router/router.ts @@ -33,7 +33,7 @@ export const recipientRouter = router({ throw new TRPCError({ code: 'BAD_REQUEST', - message: 'We were unable to sign this field. Please try again later.', + message: 'We were unable to set this field. Please try again later.', }); } }), @@ -58,7 +58,7 @@ export const recipientRouter = router({ throw new TRPCError({ code: 'BAD_REQUEST', - message: 'We were unable to sign this field. Please try again later.', + message: 'We were unable to set this field. Please try again later.', }); } }), diff --git a/packages/trpc/server/template-router/router.ts b/packages/trpc/server/template-router/router.ts index 28e919e92..7417e7d00 100644 --- a/packages/trpc/server/template-router/router.ts +++ b/packages/trpc/server/template-router/router.ts @@ -19,11 +19,12 @@ export const templateRouter = router({ .input(ZCreateTemplateMutationSchema) .mutation(async ({ input, ctx }) => { try { - const { title, templateDocumentDataId } = input; + const { teamId, title, templateDocumentDataId } = input; return await createTemplate({ - title, userId: ctx.user.id, + teamId, + title, templateDocumentDataId, }); } catch (err) { @@ -64,11 +65,12 @@ export const templateRouter = router({ .input(ZDuplicateTemplateMutationSchema) .mutation(async ({ input, ctx }) => { try { - const { templateId } = input; + const { teamId, templateId } = input; return await duplicateTemplate({ - templateId, userId: ctx.user.id, + teamId, + templateId, }); } catch (err) { console.error(err); @@ -88,7 +90,7 @@ export const templateRouter = router({ const userId = ctx.user.id; - return await deleteTemplate({ id, userId }); + return await deleteTemplate({ userId, id }); } catch (err) { console.error(err); diff --git a/packages/trpc/server/template-router/schema.ts b/packages/trpc/server/template-router/schema.ts index bc7161f74..3d87d4b4f 100644 --- a/packages/trpc/server/template-router/schema.ts +++ b/packages/trpc/server/template-router/schema.ts @@ -1,7 +1,8 @@ import { z } from 'zod'; export const ZCreateTemplateMutationSchema = z.object({ - title: z.string().min(1), + title: z.string().min(1).trim(), + teamId: z.number().optional(), templateDocumentDataId: z.string().min(1), }); @@ -11,6 +12,7 @@ export const ZCreateDocumentFromTemplateMutationSchema = z.object({ export const ZDuplicateTemplateMutationSchema = z.object({ templateId: z.number(), + teamId: z.number().optional(), }); export const ZDeleteTemplateMutationSchema = z.object({