Skip to content

Commit 2b8b762

Browse files
Merge pull request #1225 from OpenSignLabs/raktima-patch-2
feat: introduce embedding feature for template
2 parents 04c228c + a9c08c8 commit 2b8b762

File tree

16 files changed

+984
-315
lines changed

16 files changed

+984
-315
lines changed

apps/OpenSign/package-lock.json

Lines changed: 270 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/OpenSign/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"react-scrollbars-custom": "^4.1.1",
4646
"react-select": "^5.8.0",
4747
"react-signature-canvas": "^1.0.6",
48+
"react-syntax-highlighter": "^15.5.0",
4849
"react-tooltip": "^5.28.0",
4950
"react-web-share": "^2.0.2",
5051
"reactour": "^1.19.4",

apps/OpenSign/public/locales/en/translation.json

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@
131131
"Share": "Share",
132132
"View": "View",
133133
"option": "Option",
134-
"Embed": "Embed"
134+
"Embed": "Embed",
135+
"Copy TemplateId":"Copy TemplateId"
135136
},
136137
"report-heading": {
137138
"Sr.No": "Sr.No",
@@ -264,7 +265,8 @@
264265
"make-template-private-alert": "Are you sure you want to make this template private? This will remove it from your public profile.",
265266
"public-role": "Public role",
266267
"public-url": "Public URL",
267-
"public-url-copy-mssg": " Here’s your public URL: Copy it or share it with the signer, and you will be able to see all your publicly set templates.",
268+
"public-url-copy": "Here’s your public URL: ",
269+
"public-url-copy-mssg":"Copy it or share it with the signer, and you will be able to see all your publicly set templates.",
268270
"add-public-url-alert": "Please add your public URL, and you will be able to make a public template.",
269271
"share-with-alert": "You cannot share a template if any roles already have contacts assigned. Please remove all contact assignments from the roles before sharing the template.",
270272
"share-with": "Share with",
@@ -632,6 +634,19 @@
632634
"reason":"Reason",
633635
"decline-by":"Declined/revoked by",
634636
"document-declined": "Document declined",
637+
"public-template-mssg-1":"To integrate OpenSign into your React or Next.js project, simply run the following command:",
638+
"public-template-mssg-2" :"Ensure you have npm or yarn set up in your project. If you’re using Yarn, you can replace npm install with yarn add opensign-react.",
639+
"public-template-mssg-3" :"Need more details or examples?",
640+
"public-template-mssg-4": "Visit the",
641+
"public-template-mssg-5": " npm for the latest updates, detailed documentation, and version history.",
642+
"public-template-mssg-6" :"You need to set this template as public before you can utilize this code snippet.",
643+
"copy-code":"COPY",
644+
"copied-code":"COPIED",
645+
"Installation":"Installation",
646+
"Usage" :"Usage",
647+
"insufficient-credits":"Insufficient Signing Credits",
648+
"insufficient-credits-mssg":"The owner of this document currently lacks the necessary OpenSign credits for you to sign. Please reach out to the owner if you require further details.",
649+
"angular-npm-mssg-1": "To integrate OpenSign into your Angular project, simply run the following command:",
635650
"quota-mail-info-head":"Monthly request signatures email limit",
636651
"quota-mail-info": "You can send upto 15 signature request emails every month. Upgrade now to send unlimited signing requests directly.",
637652
"quota-mail": "You've reached your limit of 15 signature request emails for this month. Upgrade now to continue sending emails directly.",

apps/OpenSign/public/locales/fr/translation.json

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@
151151
"Share": "Partager",
152152
"View": "Voir",
153153
"option": "Option",
154-
"Embed": "Intégrer"
154+
"Embed": "Intégrer",
155+
"Copy TemplateId": "Copier l'ID du modèle"
155156
},
156157
"report-help": {
157158
"Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
@@ -263,7 +264,8 @@
263264
"make-template-private-alert": "Êtes-vous sûr de vouloir rendre ce modèle privé ? Cela le supprimera de votre profil public.",
264265
"public-role": "Rôle public",
265266
"public-url": "URL publique",
266-
"public-url-copy-mssg": "Voici votre URL publique : copiez-la ou partagez-le avec le signataire et vous pouvoir voir tous vos paramètres publics modèles.",
267+
"public-url-copy": "Voici votre URL publique : ",
268+
"public-url-copy-mssg": "copiez-la ou partagez-le avec le signataire et vous pouvoir voir tous vos paramètres publics modèles.",
267269
"add-public-url-alert": "Veuillez ajouter votre URL publique et vous pourra rendre public modèle.",
268270
"share-with-alert": "Vous ne pouvez pas partager un modèle si des contacts sont déjà attribués à des rôles. Veuillez supprimer toutes les attributions de contacts des rôles avant de partager le modèle.",
269271
"share-with": "Partager avec",
@@ -631,6 +633,19 @@
631633
"reason" :"Raison",
632634
"decline-by" :"Refusé/révoqué par",
633635
"document-declined":"document refusé",
636+
"public-template-mssg-1" :"Pour intégrer OpenSign dans votre projet React ou Next.js, exécutez simplement la commande suivante :",
637+
"public-template-mssg-2" :"Assurez-vous que npm ou Yarn est configuré dans votre projet. Si vous utilisez Yarn, vous pouvez remplacer npm install par Yarn Add opensign-react.",
638+
"public-template-mssg-3" :"Besoin de plus de détails ou d'exemples ?",
639+
"public-template-mssg-4": "Visitez le",
640+
"public-template-mssg-5": "npm pour les dernières mises à jour, une documentation détaillée et l'historique des versions.",
641+
"public-template-mssg-6":"Vous devez définir ce modèle comme public avant de pouvoir utiliser cet extrait de code.",
642+
"copy-code":"COPIE",
643+
"copied-code":"COPIÉ",
644+
"Installation":"Installation",
645+
"Usage" :"Usage",
646+
"insufficient-credits":"Crédits de signature insuffisants",
647+
"insufficient-credits-mssg" :"Le propriétaire de ce document ne dispose actuellement pas des crédits OpenSign nécessaires pour que vous puissiez le signer. Veuillez contacter le propriétaire si vous avez besoin de plus de détails.",
648+
"angular-npm-mssg-1" :"Pour intégrer OpenSign dans votre projet Angular, exécutez simplement la commande suivante :",
634649
"quota-mail-info-head":"Limite mensuelle d'e-mails de signatures de demandes",
635650
"quota-mail-info": "Vous pouvez envoyer jusqu'à 15 e-mails de demande de signature chaque mois. Mettez à niveau maintenant pour envoyer directement des demandes de signature illimitées.",
636651
"quota-mail": "Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.",
Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
import React, { useState } from "react";
2+
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
3+
import { tomorrow } from "react-syntax-highlighter/dist/esm/styles/prism";
4+
import { copytoData } from "../../constant/Utils";
5+
import { useTranslation } from "react-i18next";
6+
7+
function EmbedTab(props) {
8+
const { t } = useTranslation();
9+
const tabName = [
10+
{ title: "React/Next.js", icon: "fa-brands fa-react", color: "#61dafb" },
11+
{ title: "JavaScript", icon: "fa-brands fa-js", color: "#ffd43b" },
12+
{ title: "Angular", icon: "fa-brands fa-angular", color: "#ff5733" }
13+
];
14+
const [activeTab, setActiveTab] = useState(0);
15+
// State to track if the code has been copied
16+
const [isCopied, setIsCopied] = useState(false);
17+
const reactCode = [
18+
{
19+
id: 0,
20+
title: "Installation",
21+
codeString: `
22+
npm install opensign-react`
23+
},
24+
{
25+
id: 1,
26+
title: "Usage",
27+
codeString: `
28+
import React from "react";
29+
import Opensign from "opensign-react";
30+
31+
export function App() {
32+
return (
33+
<div className="app">
34+
<Opensign
35+
onLoad={() => console.log("success")}
36+
onLoadError={(error) => console.log(error)}
37+
templateId= {"${props.templateId}"}
38+
/>
39+
</div>
40+
);
41+
}
42+
43+
44+
`
45+
}
46+
];
47+
48+
const angularCode = [
49+
{
50+
id: 0,
51+
title: "Installation",
52+
codeString: `
53+
npm install opensign-angular-lib`
54+
},
55+
{
56+
id: 1,
57+
title: "Usage",
58+
codeString: `
59+
import { Component } from '@angular/core';
60+
import {OpensignComponent} from "opensign-angular-lib"
61+
62+
@Component({
63+
selector:'app-root',
64+
standalone: true,
65+
imports: [OpensignComponent],
66+
template: '<opensign templateId={"${props.templateId}"}
67+
(onLoad)="handleLoad()"
68+
(onLoadError)="handleError($event)"
69+
></opensign>',
70+
})
71+
export class AppComponent{
72+
handleLoad() {
73+
console.log("success");
74+
}
75+
handleError(error: string) {
76+
console.log(error);
77+
}
78+
79+
}
80+
81+
82+
`
83+
}
84+
];
85+
const jsCodeString = `
86+
<script
87+
src= "https://app.opensignlabs.com/static/js/public-template.bundle.js"
88+
id="opensign-script"
89+
templateId=${props.templateId}
90+
></script>
91+
`;
92+
93+
const handleCopy = (code, ind) => {
94+
copytoData(code);
95+
setIsCopied({ ...isCopied, [ind]: true });
96+
setTimeout(() => setIsCopied(false), 3000);
97+
};
98+
99+
return (
100+
<div className="mt-4 border-t-[1px]">
101+
<div className="flex justify-center items-center mt-2">
102+
<div role="tablist" className="op-tabs op-tabs-bordered">
103+
{tabName.map((tabData, ind) => (
104+
<div
105+
onClick={() => setActiveTab(ind)}
106+
key={ind}
107+
role="tab"
108+
className={`${
109+
activeTab === ind ? "op-tab-active" : ""
110+
} op-tab flex items-center`}
111+
>
112+
<i
113+
className={`${tabData.icon}`}
114+
style={{ color: tabData.color }}
115+
></i>
116+
<span className="ml-1 text-[10px] font-medium md:font-normal md:text-[15px]">
117+
{tabData.title}
118+
</span>
119+
</div>
120+
))}
121+
</div>
122+
</div>
123+
<div>
124+
{activeTab === 0 ? (
125+
<div className="mt-4">
126+
{reactCode.map((data, ind) => {
127+
return (
128+
<div key={ind}>
129+
<p className="font-medium text-[18px]">
130+
{t(`${data.title}`)}
131+
</p>
132+
<p className="text-[13px] mt-2">
133+
{t("public-template-mssg-1")}
134+
</p>
135+
<div className="relative p-1">
136+
<div
137+
onClick={() => handleCopy(data.codeString, ind)}
138+
className="absolute top-[20px] right-[20px] cursor-pointer"
139+
>
140+
<i className="fa-light fa-copy text-white mr-[2px]" />
141+
<span className=" text-white">
142+
{isCopied[ind] ? t("copied-code") : t("copy-code")}
143+
</span>
144+
</div>
145+
<SyntaxHighlighter
146+
customStyle={{
147+
borderRadius: "15px"
148+
}}
149+
language="javascript"
150+
style={tomorrow}
151+
>
152+
{data.codeString}
153+
</SyntaxHighlighter>
154+
</div>
155+
</div>
156+
);
157+
})}
158+
159+
<p className="font-medium text-[15px]">
160+
{t("public-template-mssg-3")}
161+
</p>
162+
<p className="my-[6px]">
163+
{" "}
164+
{t("public-template-mssg-4")}
165+
<a
166+
href="https://www.npmjs.com/package/opensign-react"
167+
target="_blank"
168+
rel="noreferrer"
169+
className="cursor-pointer text-blue-700 "
170+
>
171+
{" "}
172+
OpenSign React package{" "}
173+
</a>
174+
{t("public-template-mssg-5")}
175+
</p>
176+
</div>
177+
) : activeTab === 1 ? (
178+
<div className="mt-4">
179+
<div>
180+
{/* <p className="font-medium text-[18px]">{t(`${data.title}`)}</p> */}
181+
182+
<div className="relative p-1">
183+
<div
184+
onClick={() => handleCopy(jsCodeString, 0)}
185+
className="absolute top-[20px] right-[20px] cursor-pointer"
186+
>
187+
<i className="fa-light fa-copy text-white mr-[2px]" />
188+
<span className=" text-white">
189+
{isCopied[0] ? t("copied-code") : t("copy-code")}
190+
</span>
191+
</div>
192+
<SyntaxHighlighter
193+
customStyle={{
194+
borderRadius: "15px"
195+
}}
196+
language="javascript"
197+
style={tomorrow}
198+
>
199+
{jsCodeString}
200+
</SyntaxHighlighter>
201+
</div>
202+
</div>
203+
</div>
204+
) : (
205+
activeTab === 2 && (
206+
<div className="mt-4">
207+
{angularCode.map((data, ind) => {
208+
return (
209+
<div key={ind}>
210+
<p className="font-medium text-[18px]">
211+
{t(`${data.title}`)}
212+
</p>
213+
214+
<p className="text-[13px] mt-2">
215+
{t("angular-npm-mssg-1")}
216+
</p>
217+
218+
<div className="relative p-1">
219+
<div
220+
onClick={() => handleCopy(data.codeString, ind)}
221+
className="absolute top-[20px] right-[20px] cursor-pointer"
222+
>
223+
<i className="fa-light fa-copy text-white mr-[2px]" />
224+
<span className=" text-white">
225+
{isCopied[ind] ? t("copied-code") : t("copy-code")}
226+
</span>
227+
</div>
228+
<SyntaxHighlighter
229+
customStyle={{
230+
borderRadius: "15px"
231+
}}
232+
language="javascript"
233+
style={tomorrow}
234+
>
235+
{data.codeString}
236+
</SyntaxHighlighter>
237+
</div>
238+
</div>
239+
);
240+
})}
241+
242+
<p className="font-medium text-[15px]">
243+
{t("public-template-mssg-3")}
244+
</p>
245+
<p className="my-[6px]">
246+
{" "}
247+
{t("public-template-mssg-4")}
248+
<a
249+
href="https://www.npmjs.com/package/opensign-angular-lib"
250+
target="_blank"
251+
rel="noreferrer"
252+
className="cursor-pointer text-blue-700 "
253+
>
254+
{" "}
255+
OpenSign Angular package{" "}
256+
</a>
257+
{t("public-template-mssg-5")}
258+
</p>
259+
</div>
260+
)
261+
)}
262+
</div>
263+
</div>
264+
);
265+
}
266+
267+
export default EmbedTab;

apps/OpenSign/src/constant/Utils.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,15 @@ export const openInNewTab = (url, target) => {
3333
export async function fetchSubscription(
3434
extUserId,
3535
contactObjId,
36-
isGuestSign = false
36+
isGuestSign = false,
37+
isPublic = false
3738
) {
3839
try {
3940
const Extand_Class = localStorage.getItem("Extand_Class");
4041
const extClass = Extand_Class && JSON.parse(Extand_Class);
4142
// console.log("extClass ", extClass);
4243
let extUser;
43-
if (extClass && extClass.length > 0) {
44+
if (extClass && extClass.length > 0 && !isPublic) {
4445
extUser = extClass[0].objectId;
4546
} else {
4647
extUser = extUserId;
@@ -54,7 +55,7 @@ export async function fetchSubscription(
5455
};
5556
const params = isGuestSign
5657
? { contactId: contactObjId }
57-
: { extUserId: extUser };
58+
: { extUserId: extUser, ispublic: isPublic };
5859
const tenatRes = await axios.post(url, params, { headers: headers });
5960
let plan, status, billingDate, adminId;
6061
if (isGuestSign) {

apps/OpenSign/src/json/ReportJson.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,13 @@ export default function reportJson(id) {
370370
btnIcon: "fa-light fa-code",
371371
action: "Embed"
372372
},
373+
{
374+
btnId: "2434",
375+
btnLabel: "Copy TemplateId",
376+
hoverLabel: "Copy TemplateId",
377+
btnIcon: "fa-light fa-copy",
378+
action: "CopyTemplateId"
379+
},
373380
{
374381
btnId: "1834",
375382
btnLabel: "Delete",

0 commit comments

Comments
 (0)