fix: update tour messages of show public profile setup

This commit is contained in:
RaktimaNXG
2024-08-30 17:44:03 +05:30
parent 6457cfc958
commit 4b74b08825
9 changed files with 360 additions and 233 deletions
@@ -4,7 +4,7 @@
"language": "Language",
"name": "Name",
"phone": "Phone",
"phone-optional":"Phone(optional)",
"phone-optional": "optional",
"email": "Email",
"company": "Company",
"job-title": "Job title",
@@ -128,7 +128,7 @@
"Share": "Share",
"View": "View",
"option": "Option",
"Embed":"Embed"
"Embed": "Embed"
},
"report-heading": {
"Sr.No": "Sr.No",
@@ -372,7 +372,7 @@
"All pages": "All pages",
"All pages but last": "All pages but last",
"All pages but first": "All pages but first",
"Beside to widget":"Beside to widget"
"Beside to widget": "Beside to widget"
},
"options": "Options",
"minimun-check": "Minimun check",
@@ -588,7 +588,10 @@
"Out for signatures": "Clicking on this card will take you to a list of documents awaiting signature.",
"Recent signature requests": "This is a list of documents that are waiting for your signature.",
"Recently sent for signatures": "This is a list of documents you've sent to other parties for signature.",
"Drafts": "This are documents you have started but have not finalized for sending."
"Drafts": "This are documents you have started but have not finalized for sending.",
"username":"Enter your username to generate your public profile. After it's created, you can share and copy the profile URL or visit it to view your public template at `https://opensign.me/your-username`",
"tagline": "Add your tagline here! To see your tagline, visit the public URL by replacing 'your-username' with your actual username: `https://opensign.me/your-username`",
"public-template": "Here's an example of how to make any template public and accessible via a URL. For instance, visiting `https://opensign.me/your-username` will allow you to view your public template and make it available for public signing."
},
"enter-email-plaholder": "Add an email address and hit enter",
"success-email-alert": "Email sent successfully!",
@@ -608,17 +611,17 @@
"user-name-exist": "user name already exist",
"format": "format",
"select-date-format": "Select a date format",
"buyapiaddon":"Buy APIs Credits",
"quantityofapis" :"Quantity of APIs",
"additionalapis":"Please purchase add-on APIs",
"buyapiaddon": "Buy APIs Credits",
"quantityofapis": "Quantity of APIs",
"additionalapis": "Please purchase add-on APIs",
"remainingapis": "Remaining APIs Credits:",
"additional-quicksend": "Please purchase add-on quick send",
"quantityofquicksend": "Quantity of Quick send",
"quotaerrquicksend": "Quota Reached, You don't have enough credits.",
"buycredits": "Buy credits",
"rotate-right":"Rotate right",
"rotate-left":"Rotate left",
"rotate-alert-mssg":"All widgets on this page will be lost. Are you sure you want to proceed?",
"templateid":"Template-Id",
"bulksendsubcriptionalert":"Please upgrade to Professional or Team plan to use quicksend."
"rotate-right": "Rotate right",
"rotate-left": "Rotate left",
"rotate-alert-mssg": "All widgets on this page will be lost. Are you sure you want to proceed?",
"templateid": "Template-Id",
"bulksendsubcriptionalert": "Please upgrade to Professional or Team plan to use quicksend."
}
@@ -1,11 +1,10 @@
{
"create-account": "Créer un compte",
"login": "Se Connecter",
"language": "Langue",
"name": "Nom et Prénom",
"phone": "Téléphone",
"phone-optional":"Téléphone (facultatif)",
"phone-optional": "(facultatif)",
"email": "E-mail",
"company": "Organisation",
"job-title": "Votre Fonction",
@@ -148,7 +147,7 @@
"Share": "Partager",
"View": "Voir",
"option": "Option",
"Embed":"Intégrer"
"Embed": "Intégrer"
},
"report-help": {
"Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
@@ -311,7 +310,7 @@
"contact-details": "Coordonnées",
"verify-email": "Veuillez vérifier votre email!",
"send-otp": "envoyer un code à usage unique",
"otp-placeholder":"Entrez le code de vérification reçu par e-mail",
"otp-placeholder": "Entrez le code de vérification reçu par e-mail",
"loading-doc": "Chargement du document..",
"widgets-name": {
"signature": "signature",
@@ -588,7 +587,10 @@
"Out for signatures": "En cliquant sur cette carte, vous accéderez à une liste de documents en attente de signature.",
"Recent signature requests": "Voici une liste de documents qui attendent votre signature.",
"Recently sent for signatures": "Il s'agit d'une liste de documents que vous avez envoyés à d'autres parties pour signature.",
"Drafts": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi."
"Drafts": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
"username": "Entrez votre nom d'utilisateur pour générer votre profil public. Une fois créé, vous pouvez partager et copier l'URL du profil ou le visiter pour afficher votre modèle public sur `https://opensign.me/your-username` ",
"tagline": "Ajoutez votre slogan ici ! Pour voir votre slogan, visitez l'URL publique en remplaçant votre nom d'utilisateur par votre nom d'utilisateur réel : https://opensign.me/your-username.",
"public-template": "Voici un exemple de la façon de rendre n'importe quel modèle public et accessible via une URL. Par exemple, visiter `https://opensign.me/your-username` vous permettra de visualiser votre modèle public et de le rendre disponible pour la signature publique. "
},
"enter-email-plaholder": "Ajoutez une adresse email et appuyez sur Entrée",
"success-email-alert": "E-mail envoyé avec succès!",
@@ -608,17 +610,17 @@
"Add-seats": "Ajouter des sièges",
"format": "format",
"select-date-format": "Sélectionnez un format de date",
"buyapiaddon":"Acheter des API Crédits",
"quantityofapis":"Quantité d'API",
"additionalapis":"Veuillez acheter des API complémentaires",
"remainingapis":"API restantes Crédits:",
"additional-quicksend":"Veuillez acheter le module complémentaire quick send",
"buyapiaddon": "Acheter des API Crédits",
"quantityofapis": "Quantité d'API",
"additionalapis": "Veuillez acheter des API complémentaires",
"remainingapis": "API restantes Crédits:",
"additional-quicksend": "Veuillez acheter le module complémentaire quick send",
"quantityofquicksend": "Quantité de Quick send",
"quotaerrquicksend": "Quota atteint, vous n'avez pas assez de crédits.",
"buycredits": "Acheter des crédits",
"rotate-right" :"Faire pivoter à droite",
"rotate-left" :"Faire pivoter à gauche",
"rotate-alert-mssg" :"Tous les widgets de cette page seront perdus. Êtes-vous sûr de vouloir continuer ?",
"templateid":"ID de modèle",
"bulksendsubcriptionalert":"Veuillez passer au forfait Professionnel ou Équipe pour utiliser Quicksend."
"rotate-right": "Faire pivoter à droite",
"rotate-left": "Faire pivoter à gauche",
"rotate-alert-mssg": "Tous les widgets de cette page seront perdus. Êtes-vous sûr de vouloir continuer ?",
"templateid": "ID de modèle",
"bulksendsubcriptionalert": "Veuillez passer au forfait Professionnel ou Équipe pour utiliser Quicksend."
}
@@ -28,8 +28,8 @@ function SelectLanguage(props) {
value={lang}
onChange={handleChangeLang}
className={`${
!props.isProfile && " md:w-[15%] w-[50%]"
} op-select op-select-bordered bg-white op-select-sm`}
!props.isProfile ? " md:w-[15%] w-[50%]" : "w-[180px]"
} op-select op-select-bordered bg-white op-select-sm `}
>
<option disabled selected>
select
+100 -117
View File
@@ -1706,130 +1706,113 @@ function PdfRequestFiles(props) {
<div className="h-full p-[20px]">
{isOtp ? (
<form onSubmit={VerifyOTP}>
<div className="flex flex-col gap-2">
<span>{t("get-otp-alert")}</span>
<label className="op-input op-input-bordered flex items-center gap-2 ">
<input
type="number"
name="otp"
className="grow"
placeholder={t("otp-placeholder")}
onInvalid={(e) =>
e.target.setCustomValidity(t("input-required"))
}
onInput={(e) => e.target.setCustomValidity("")}
required
value={otp}
onChange={(e) => setOtp(e.target.value)}
disabled={loading}
/>
<div className="mb-[0.75rem]">
<label className="block text-xs font-semibold mb-2">
{t("get-otp-alert")}
<span className="text-[13px] text-[red]"> *</span>
</label>
<input
type="number"
name="otp"
placeholder={t("otp-placeholder")}
onInvalid={(e) =>
e.target.setCustomValidity(t("input-required"))
}
onInput={(e) => e.target.setCustomValidity("")}
required
value={otp}
onChange={(e) => setOtp(e.target.value)}
disabled={loading}
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
/>
</div>
<div className="op-modal-action">
<div className="flex gap-2">
<button
className="op-btn op-btn-ghost"
onClick={() => handleCloseOtp()}
>
{t("cancel")}
</button>
<button
className="op-btn op-btn-primary"
disabled={loading}
>
{loading ? t("loading") : t("verify")}
</button>
</div>
<div className="mt-6 flex justify-start gap-2">
<button
className="op-btn op-btn-primary"
disabled={loading}
>
{loading ? t("loading") : t("verify")}
</button>
<button
className="op-btn op-btn-ghost"
onClick={() => handleCloseOtp()}
>
{t("cancel")}
</button>
</div>
</form>
) : (
<form onSubmit={handlePublicUser}>
<div className="flex flex-col gap-2">
<label className="op-input op-input-bordered flex items-center gap-2 ">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
className="w-4 h-4 opacity-70"
>
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM12.735 14c.618 0 1.093-.561.872-1.139a6.002 6.002 0 0 0-11.215 0c-.22.578.254 1.139.872 1.139h9.47Z" />
</svg>
<input
type="text"
className="grow"
name="name"
value={contact.name}
onChange={handleInputChange}
placeholder={t("name")}
onInvalid={(e) =>
e.target.setCustomValidity(t("input-required"))
}
onInput={(e) => e.target.setCustomValidity("")}
required
disabled={loading}
/>
</label>
<label className="op-input op-input-bordered flex items-center gap-2 ">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
className="w-4 h-4 opacity-70"
>
<path d="M2.5 3A1.5 1.5 0 0 0 1 4.5v.793c.026.009.051.02.076.032L7.674 8.51c.206.1.446.1.652 0l6.598-3.185A.755.755 0 0 1 15 5.293V4.5A1.5 1.5 0 0 0 13.5 3h-11Z" />
<path d="M15 6.954 8.978 9.86a2.25 2.25 0 0 1-1.956 0L1 6.954V11.5A1.5 1.5 0 0 0 2.5 13h11a1.5 1.5 0 0 0 1.5-1.5V6.954Z" />
</svg>
<input
type="email"
className="grow"
name="email"
value={contact.email}
onChange={handleInputChange}
placeholder={t("email")}
onInvalid={(e) =>
e.target.setCustomValidity(t("input-required"))
}
onInput={(e) => e.target.setCustomValidity("")}
required
disabled={loading}
/>
</label>
<label className="op-input op-input-bordered flex items-center gap-2 ">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
className="w-4 h-4 opacity-70"
>
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6ZM12.735 14c.618 0 1.093-.561.872-1.139a6.002 6.002 0 0 0-11.215 0c-.22.578.254 1.139.872 1.139h9.47Z" />
</svg>
<input
value={contact.phone}
onChange={handleInputChange}
type="text"
name="phone"
className="grow"
placeholder={t("phone")}
disabled={loading}
/>
<form
className="text-base-content p-2 mx-auto"
onSubmit={handlePublicUser}
>
<div className="mb-[0.75rem]">
<label className="block text-xs font-semibold mb-[5px]">
{t("name")}
<span className="text-[13px] text-[red]"> *</span>
</label>
<input
type="text"
id="name"
name="name"
value={contact.name}
onChange={handleInputChange}
onInvalid={(e) =>
e.target.setCustomValidity(t("input-required"))
}
onInput={(e) => e.target.setCustomValidity("")}
required
disabled={loading}
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
/>
</div>
<div className="op-modal-action">
<div className="flex gap-2">
<button
className="op-btn op-btn-ghost"
onClick={() => handleCloseOtp()}
>
{t("close")}
</button>
<button
className="op-btn op-btn-primary"
disabled={loading}
>
{loading ? t("loading") : t("submit")}
</button>
</div>
<div className="mb-[0.75rem]">
<label className="block text-xs font-semibold mb-[5px]">
{t("email")}
<span className="text-[13px] text-[red]"> *</span>
</label>
<input
type="email"
name="email"
value={contact.email}
onChange={handleInputChange}
onInvalid={(e) =>
e.target.setCustomValidity(t("input-required"))
}
onInput={(e) => e.target.setCustomValidity("")}
required
disabled={loading}
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
/>
</div>
<div className="mb-[0.75rem]">
<label className="block text-xs font-semibold mb-[5px]">
{t("phone")}
</label>
<input
value={contact.phone}
onChange={handleInputChange}
type="text"
name="phone"
placeholder={t("phone-optional")}
disabled={loading}
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs"
/>
</div>
<div className="mt-6 flex justify-start gap-2">
<button
className="op-btn op-btn-primary"
disabled={loading}
>
{loading ? t("loading") : t("submit")}
</button>
<button
className="op-btn op-btn-ghost"
onClick={() => handleCloseOtp()}
>
{t("close")}
</button>
</div>
</form>
)}
+140 -44
View File
@@ -62,7 +62,10 @@ function UserProfile() {
extendUser && extendUser?.[0]?.Tagline
);
const [isPlan, setIsPlan] = useState({ plan: "", isValid: false });
const [profileTour, setProfileTour] = useState(true);
const [tourStatus, setTourStatus] = useState([]);
const [isProfileTour, setIsProfileTour] = useState(false);
const [isDontShow, setIsDontShow] = useState(false);
const [isPublicInfo, setIsPublicInfo] = useState({});
const getPublicUrl = isStaging
? `https://staging.opensign.me/${extendUser?.[0]?.UserName}`
: `https://opensign.me/${extendUser?.[0]?.UserName}`;
@@ -75,6 +78,19 @@ function UserProfile() {
setIsLoader(true);
const extClass = localStorage.getItem("Extand_Class");
const jsonSender = JSON.parse(extClass);
const tourstatuss = jsonSender[0]?.TourStatus && jsonSender[0].TourStatus;
if (tourstatuss && tourstatuss.length > 0) {
setTourStatus(tourstatuss);
const checkTourRecipients = tourstatuss.filter(
(data) => data.profileTour
);
if (checkTourRecipients && checkTourRecipients.length > 0) {
setIsProfileTour(checkTourRecipients[0]?.profileTour);
}
} else {
setIsProfileTour(false);
}
const HeaderDocId = jsonSender[0]?.HeaderDocId;
if (isEnableSubscription) {
const subscribe = await checkIsSubscribed();
@@ -339,10 +355,8 @@ function UserProfile() {
selector: '[data-tut="username"]',
content: () => (
<TourContentWithBtn
message="Enter your username to generate your public profile. Once added,
you can visit `https://opensign.me/your-username` to view your public template."
// {t("tour-mssg.username")}
isChecked={true}
message={t("tour-mssg.username")}
isChecked={handleDontShow}
image={userName}
/>
),
@@ -353,10 +367,8 @@ function UserProfile() {
selector: '[data-tut="tagline"]',
content: () => (
<TourContentWithBtn
message="Add your tagline here! You can view your tagline by
visiting `https://opensign.me/your-username` replacing your-username with your actual username."
// {t("tour-mssg.tagline")}
isChecked={true}
message={t("tour-mssg.tagline")}
isChecked={handleDontShow}
image={userName}
/>
),
@@ -367,10 +379,8 @@ function UserProfile() {
selector: '[data-tut="publicTemplate"]',
content: () => (
<TourContentWithBtn
message="Here's an example of how to make any template public and accessible via a URL.
For instance, visiting `https://opensign.me/your-username` will allow you to view your public template and make it available for public signing."
// {t("tour-mssg.tagline")}
isChecked={true}
message={t("tour-mssg.public-template")}
isChecked={handleDontShow}
video={publicRole}
/>
),
@@ -380,7 +390,64 @@ function UserProfile() {
];
//function for update TourStatus
const closeTour = async () => {
setProfileTour(false);
setIsProfileTour(true);
if (isDontShow) {
let updatedTourStatus = [];
if (tourStatus.length > 0) {
updatedTourStatus = [...tourStatus];
const profileIndex = tourStatus.findIndex(
(obj) => obj["profileTour"] === false || obj["profileTour"] === true
);
if (profileIndex !== -1) {
updatedTourStatus[profileIndex] = { profileTour: true };
} else {
updatedTourStatus.push({ profileTour: true });
}
} else {
updatedTourStatus = [{ profileTour: true }];
}
await axios
.put(
`${localStorage.getItem("baseUrl")}classes/contracts_Users/${
extendUser?.[0]?.objectId
}`,
{
TourStatus: updatedTourStatus
},
{
headers: {
"Content-Type": "application/json",
"X-Parse-Application-Id": localStorage.getItem("parseAppId"),
sessionToken: localStorage.getItem("accesstoken")
}
}
)
.then(() => {
// const json = Listdata.data;
})
.catch((err) => {
console.log("axois err ", err);
alert(t("something-went-wrong-mssg"));
});
}
};
const handleDontShow = (isChecked) => {
setIsDontShow(isChecked);
};
const handleTooltipClick = (type) => {
if (type === "public") {
setIsPublicInfo({
status: true,
message: t("tour-mssg.username"),
image: userName
});
} else if (type === "tagline") {
setIsPublicInfo({
status: true,
message: t("tour-mssg.tagline"),
image: userName
});
}
};
return (
<React.Fragment>
@@ -399,7 +466,7 @@ function UserProfile() {
<Tour
onRequestClose={closeTour}
steps={tourConfig}
isOpen={profileTour}
isOpen={!isProfileTour}
rounded={5}
closeWithMask={false}
/>
@@ -460,7 +527,7 @@ function UserProfile() {
<input
type="text"
value={name}
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
className="op-input op-input-bordered op-input-sm w-[180px] focus:outline-none hover:border-base-content text-sm"
onChange={(e) => SetName(e.target.value)}
/>
) : (
@@ -476,7 +543,7 @@ function UserProfile() {
{editmode ? (
<input
type="text"
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
className="op-input op-input-bordered op-input-sm w-[180px] focus:outline-none hover:border-base-content text-sm"
onChange={(e) => SetPhone(e.target.value)}
value={Phone}
/>
@@ -498,7 +565,7 @@ function UserProfile() {
<input
type="text"
value={company}
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
className="op-input op-input-bordered op-input-sm w-[180px] focus:outline-none hover:border-base-content text-sm"
onChange={(e) => setCompany(e.target.value)}
/>
) : (
@@ -515,7 +582,7 @@ function UserProfile() {
<input
type="text"
value={jobTitle}
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
className="op-input op-input-bordered op-input-sm w-[180px] focus:outline-none hover:border-base-content text-sm"
onChange={(e) => setJobTitle(e.target.value)}
/>
) : (
@@ -543,41 +610,43 @@ function UserProfile() {
</li>
{isEnableSubscription && (
<>
<li className="flex md:flex-row flex-col md:justify-between md:items-center border-t-[1px] border-gray-300 py-2 break-all">
<li className="flex flex-row justify-between md:items-center border-t-[1px] border-gray-300 py-2 break-all">
<span className="font-semibold flex gap-1">
{t("public-profile")} :{" "}
<Tooltip
maxWidth="max-w-[250px]"
message={t("public-profile-help")}
handleTooltipClick={handleTooltipClick}
type="public"
/>
</span>
<div
data-tut="username"
className="flex md:flex-row flex-col md:items-center"
className="flex flex-row items-center gap-1"
>
{editmode || !extendUser?.[0]?.UserName ? (
<input
maxLength={40}
style={{
border:
!isSubscribe &&
publicUserName?.length > 0 &&
publicUserName?.length < 9 &&
"solid red"
}}
onChange={handleOnchangeUserName}
value={publicUserName}
disabled={!editmode}
placeholder="enter user name"
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
/>
<>
<input
maxLength={40}
style={{
border:
!isSubscribe &&
publicUserName?.length > 0 &&
publicUserName?.length < 9 &&
"solid red"
}}
onChange={handleOnchangeUserName}
value={publicUserName}
disabled={!editmode}
placeholder="enter user name"
className="op-input op-input-bordered op-input-sm w-[180px] focus:outline-none hover:border-base-content text-sm"
/>
</>
) : (
<div className="flex flex-row gap-1 items-center justify-between md:justify-start">
<span
rel="noreferrer"
target="_blank"
onClick={() => openInNewTab(getPublicUrl)}
className="cursor-pointer underline hover:text-blue-800 w-[200px] md:w-[150px] whitespace-nowrap overflow-hidden text-ellipsis"
className="cursor-pointer underline hover:text-blue-800 w-[110px] md:w-[150px] whitespace-nowrap overflow-hidden text-ellipsis"
>
{isStaging
? `staging.opensign.me/${extendUser?.[0]?.UserName}`
@@ -602,22 +671,26 @@ function UserProfile() {
)}
</div>
</li>
<li className="flex md:flex-row flex-col md:justify-between md:items-center border-t-[1px] border-gray-300 py-2 break-all">
<li className="flex flex-row justify-between items-center border-t-[1px] border-gray-300 py-2 break-all">
<span className="font-semibold flex gap-1">
{t("tagline")} :{" "}
<Tooltip
maxWidth="max-w-[250px]"
message={t("tagline-help")}
handleTooltipClick={handleTooltipClick}
type="tagline"
/>
</span>
<div data-tut="tagline" className=" md:items-center">
<div
data-tut="tagline"
className="flex flex-row md:items-center gap-1"
>
{editmode || !extendUser?.[0]?.Tagline ? (
<input
maxLength={40}
onChange={handleOnchangeTagLine}
value={tagLine}
disabled={!editmode}
placeholder="enter tagline"
className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content text-sm"
className="op-input op-input-bordered op-input-sm w-[180px] focus:outline-none hover:border-base-content text-sm"
/>
) : (
<span>{extendUser?.[0]?.Tagline}</span>
@@ -745,6 +818,29 @@ function UserProfile() {
)}
</ModalUi>
)}
<ModalUi
isOpen={isPublicInfo.status}
title={t("validation-alert")}
handleClose={() => setIsPublicInfo({})}
>
<div className="p-[20px] h-full">
<p>{isPublicInfo.message}</p>
<div className="my-2">
<img src={isPublicInfo.image} />
</div>
<div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div>
<button
onClick={() => setIsPublicInfo({})}
type="button"
className="op-btn op-btn-ghost shadow-md"
>
{t("close")}
</button>
</div>
</ModalUi>
{isUpgrade && (
<div className="op-modal op-modal-open">
<div className="max-h-90 bg-base-100 w-[95%] md:max-w-[500px] rounded-box relative">
+14 -3
View File
@@ -1,9 +1,20 @@
import React from "react";
import { Tooltip as ReactTooltip } from "react-tooltip";
import { openInNewTab } from "../constant/Utils";
const Tooltip = ({ id, message, url, iconColor, maxWidth }) =>
url ? (
<button onClick={() => openInNewTab(url)} className={"text-center"}>
const Tooltip = ({
id,
message,
url,
iconColor,
maxWidth,
handleTooltipClick,
type
}) =>
url || type ? (
<button
onClick={() => (type ? handleTooltipClick(type) : openInNewTab(url))}
className={"text-center cursor-pointer"}
>
<sup>
<i
className="fa-light fa-question rounded-full border-[1px] py-[1.5px] px-[4px] text-[13px]"
@@ -19,14 +19,14 @@ export default function TourContentWithBtn({
<div>
<p>{message}</p>
{image && (
<div className="flex items-center justify-center my-[10px]">
<img width={800} height={100} src={image} />
<div className="flex items-center justify-center my-[10px] border-[1px] border-gray-400 rounded-sm">
<img src={image} />
</div>
)}
{video && (
<div className="flex items-center justify-center">
<video width="320" height="240" autoPlay loop muted playsInline>
<source src={video} type="video/mp4" />
<div className="flex items-center justify-center my-[10px] border-[1px] border-gray-400 rounded-sm">
<video autoPlay loop muted playsInline>
<source className="w-[100%]" src={video} type="video/mp4" />
</video>
</div>
)}
@@ -4,6 +4,7 @@
"language": "Language",
"name": "Name",
"phone": "Phone",
"phone-optional": "optional",
"email": "Email",
"company": "Company",
"job-title": "Job title",
@@ -126,7 +127,8 @@
"Share with team": "Share with team",
"Share": "Share",
"View": "View",
"option": "Option"
"option": "Option",
"Embed": "Embed"
},
"report-heading": {
"Sr.No": "Sr.No",
@@ -309,7 +311,7 @@
"contact-details": "Contact Details",
"verify-email": "Please verify your email !",
"send-otp": " Send OTP",
"otp-placeholder": "Enter OTP received over email",
"otp-placeholder": "Enter verification code received over email",
"loading-doc": "Loading Document..",
"widgets-name": {
"signature": "signature",
@@ -369,7 +371,8 @@
"copy-type": {
"All pages": "All pages",
"All pages but last": "All pages but last",
"All pages but first": "All pages but first"
"All pages but first": "All pages but first",
"Beside to widget": "Beside to widget"
},
"options": "Options",
"minimun-check": "Minimun check",
@@ -446,7 +449,7 @@
"decline-alert-3": "You can not sign this document as it has been declined/revoked.",
"sign here": "Sign here",
"guest-email-alert": "verification code is sent to your email",
"get-otp-alert": "you will get a OTP via Email",
"get-otp-alert": "you will get a verification code via Email",
"user-already-exist": "User already exist.",
"server-error": "Internal server error !",
"fill-required-details!": "Please fill required details!",
@@ -585,7 +588,10 @@
"Out for signatures": "Clicking on this card will take you to a list of documents awaiting signature.",
"Recent signature requests": "This is a list of documents that are waiting for your signature.",
"Recently sent for signatures": "This is a list of documents you've sent to other parties for signature.",
"Drafts": "This are documents you have started but have not finalized for sending."
"Drafts": "This are documents you have started but have not finalized for sending.",
"username": "Enter your username to generate your public profile. Once added, you can visit `https://opensign.me/your-username` to view your public template.",
"tagline": "Add your tagline here! You can view your tagline by visiting `https://opensign.me/your-username` replacing your-username with your actual username.",
"public-template": "Here's an example of how to make any template public and accessible via a URL. For instance, visiting `https://opensign.me/your-username` will allow you to view your public template and make it available for public signing."
},
"enter-email-plaholder": "Add an email address and hit enter",
"success-email-alert": "Email sent successfully!",
@@ -605,7 +611,17 @@
"user-name-exist": "user name already exist",
"format": "format",
"select-date-format": "Select a date format",
"buyapiaddon": "Buy APIs Credits",
"quantityofapis": "Quantity of APIs",
"additionalapis": "Please purchase add-on APIs",
"remainingapis": "Remaining APIs Credits:",
"additional-quicksend": "Please purchase add-on quick send",
"quantityofquicksend": "Quantity of Quick send",
"quotaerrquicksend": "Quota Reached, You don't have enough credits.",
"buycredits": "Buy credits",
"rotate-right": "Rotate right",
"rotate-left": "Rotate left",
"rotate-alert-mssg": "All widgets on this page will be lost. Are you sure you want to proceed?"
"rotate-alert-mssg": "All widgets on this page will be lost. Are you sure you want to proceed?",
"templateid": "Template-Id",
"bulksendsubcriptionalert": "Please upgrade to Professional or Team plan to use quicksend."
}
@@ -4,6 +4,7 @@
"language": "Langue",
"name": "Nom et Prénom",
"phone": "Téléphone",
"phone-optional": "(facultatif)",
"email": "E-mail",
"company": "Organisation",
"job-title": "Votre Fonction",
@@ -145,7 +146,8 @@
"Share with team": "Partager avec l'équipe",
"Share": "Partager",
"View": "Voir",
"option": "Option"
"option": "Option",
"Embed": "Intégrer"
},
"report-help": {
"Draft Documents": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
@@ -198,7 +200,7 @@
"parent-folder": "Dossier Parent",
"create": "Créer",
"signers": "Signataires",
"signers-help": "Commencez à saisir le nom d'un contact pour voir les signataires suggérés par vos contacts enregistrés ou en ajouter de nouveaux. Organisez l'ordre de signature en ajoutant des signataires dans l'ordre souhaité. Utilisez le bouton « + » pour inclure les signataires et le « x » pour les supprimer. Chaque signataire recevra un e-mail invité à signer le document dans l'ordre indiqué.",
"signers-help": "Commencez à saisir le nom d'un contact pour voir les signataires suggérés par vos contacts enregistrés ou en ajouter de nouveaux. Organisez l'ordre de signature en ajoutant des signataires dans l'ordre souhaité. Utilisez le bouton « + » pour inclure les signataires et le « x » pour les supprimer. Chaque signataire recevra un e-mail invité à signer le document dans l'ordre indiqué.",
"add-signer": "Ajouter un signataire",
"contact-not-found": "Contact introuvable",
"add-yourself": "Ajoutez-vous",
@@ -253,11 +255,11 @@
"view": "voir",
"make-template-public": "Rendre le modèle public",
"make-template-private": "Rendre le modèle privé",
"make-template-public-alert": "Êtes-vous sûr de vouloir rendre ce modèle public ?",
"make-template-public-alert": "Êtes-vous sûr de vouloir rendre ce modèle public ?",
"make-template-private-alert": "Êtes-vous sûr de vouloir rendre ce modèle privé ? Cela le supprimera de votre profil public.",
"public-role": "Rôle public",
"public-url": "URL publique",
"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.",
"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.",
"add-public-url-alert": "Veuillez ajouter votre URL publique et vous pourra rendre public modèle.",
"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.",
"share-with": "Partager avec",
@@ -275,14 +277,14 @@
"copy-link": "Copier le lien",
"copy": "Copier",
"revoke-document": "Révoquer le document",
"revoke-document-alert": "Êtes-vous sûr de vouloir révoquer ce document ?",
"revoke-document-alert": "Êtes-vous sûr de vouloir révoquer ce document ?",
"resend-mail": "Renvoyer le courrier",
"resend-mail-help": "Vous pouvez utiliser les variables suivantes qui seront remplacées par leurs valeurs réelles : - {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email} }, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.",
"resend-mail-help": "Vous pouvez utiliser les variables suivantes qui seront remplacées par leurs valeurs réelles : - {{document_title}}, {{sender_name}}, {{sender_mail}}, {{sender_phone}}, {{receiver_name}}, {{receiver_email} }, {{receiver_phone}}, {{expiry_date}}, {{company_name}}, {{signing_url}}.",
"subject": "Sujet",
"body": "Corps",
"add-contact": "Ajouter le contact",
"add-signer-alert": "Le contact existe déjà !",
"record-delete-alert": "Enregistrement supprimé avec succès !",
"record-delete-alert": "Enregistrement supprimé avec succès !",
"record-revoke-alert": " Enregistrement révoqué avec succès ! ",
"mail-sent-alert": "Courriel envoyé avec succès.",
"document-sent-alert": "Document envoyé avec succès !",
@@ -308,7 +310,7 @@
"contact-details": "Coordonnées",
"verify-email": "Veuillez vérifier votre email!",
"send-otp": "envoyer un code à usage unique",
"otp-placeholder": "Saisissez l'OTP reçu par e-mail",
"otp-placeholder": "Entrez le code de vérification reçu par e-mail",
"loading-doc": "Chargement du document..",
"widgets-name": {
"signature": "signature",
@@ -338,7 +340,7 @@
"finish": "terminé",
"mail": "Mail",
"sign-now": "Signez maintenant",
"successfully-signed": "Signé avec succès !",
"successfully-signed": "Signé avec succès !",
"email-mssg": "Les destinataires ajoutés ici recevront une copie du document signé.",
"email-error-1": "veuillez fournir une adresse e-mail correcte",
"email-error-2": "Vous ne pouvez envoyer qu'à dix destinataires à la fois.",
@@ -359,7 +361,7 @@
"signature-tab": "Signature",
"your-signature": "Votre signature",
"copy-to-all-pages": "Copier sur toutes les pages",
"contact-delete-alert": "Êtes-vous sûr de vouloir supprimer ce contact ?",
"contact-delete-alert": "Êtes-vous sûr de vouloir supprimer ce contact ?",
"reset-password": "Le lien de réinitialisation du mot de passe a été envoyé à votre identifiant de messagerie",
"reset-password-alert-2": "Veuillez configurer l'adaptateur de messagerie",
"reset-password-alert-3": "Réinitialisez votre mot de passe",
@@ -368,7 +370,8 @@
"copy-type": {
"All pages": "Toutes les pages",
"All pages but last": "Toutes les pages sauf la dernière",
"All pages but first": "Toutes les pages sauf la première"
"All pages but first": "Toutes les pages sauf la première",
"Beside to widget": "À côté du widget"
},
"options": "Possibilités",
"minimun-check": "Vérification minimale",
@@ -394,7 +397,7 @@
"create-document": "Créer un document",
"template-created-alert": "Voulez-vous créer un document en utilisant le modèle que vous vient de créer ?",
"signers-alert": "alerte des signataires",
"template-creation-alert-1": "Veuillez sélectionner le signataire pour ajouter un espace réservé !",
"template-creation-alert-1": "Veuillez sélectionner le signataire pour ajouter un espace réservé !",
"ok": "D'accord",
"radio-group": "Groupe de radio",
"dropdown-options": "Options déroulantes",
@@ -410,9 +413,9 @@
"hint": "Indice",
"color": "couleur",
"role-help": {
"p1": "Que sont les rôles modèles ?",
"p1": "Que sont les rôles modèles ?",
"p2": "Commencez par spécifier chaque rôle nécessaire à la finalisation du document. Pensez aux parties impliquées dans le processus de signature et à leurs responsabilités. Les rôles courants incluent les RH pour les documents internes, le Client pour les accords ou le Fournisseur pour les accords commerciaux.",
"p3": "Pourquoi pré-attacher les utilisateurs à certains rôles ?",
"p3": "Pourquoi pré-attacher les utilisateurs à certains rôles ?",
"p4": "Pour les rôles qui impliquent systématiquement la même personne (par exemple, la signature du PDG sur les lettres d'offre des employés), vous pouvez pré-attacher un utilisateur à un rôle dans le modèle. Cette étape est facultative mais recommandée pour des raisons d'efficacité et de cohérence entre les documents.",
"p5": "Quand dois-je spécifier l'utilisateur attaché à chaque rôle ?",
"p6": "Lorsque vous créez un document à partir de votre modèle, vous serez invité à attacher des utilisateurs à chaque rôle défini. Si un rôle est déjà associé à un utilisateur, celui-ci sera pré-rempli, mais vous pourrez le modifier si nécessaire avant d'envoyer le document."
@@ -425,8 +428,8 @@
"placeholder-alert-3": "Etes-vous sûr de vouloir envoyer ce document pour signature ? ",
"placeholder-alert-4": "Vous avez envoyé avec succès des mails à tous les",
"placeholder-alert-5": "Voulez-vous signer des documents maintenant ?",
"placeholder-alert-6": "Veuillez configurer l'adaptateur de messagerie pour envoyer du courrier !",
"placeholder-alert-7": "Veuillez sélectionner le signataire pour ajouter un espace réservé !",
"placeholder-alert-6": "Veuillez configurer l'adaptateur de messagerie pour envoyer du courrier !",
"placeholder-alert-7": "Veuillez sélectionner le signataire pour ajouter un espace réservé !",
"email-subject": "Sujet du courriel",
"email-body": "corps de l'e-mail",
"email-placeholder": "Ajouter le corps de l'e-mail",
@@ -445,14 +448,14 @@
"decline-alert-3": "Vous ne pouvez pas signer ce document car il a été refusé/révoqué.",
"sign here": "Signer ici",
"guest-email-alert": "le code de vérification a été envoyé sur votre e-mail",
"get-otp-alert": "vous recevrez un mot de passe à usage unique par e-mail",
"get-otp-alert": "vous recevrez un code de vérification par e-mail",
"user-already-exist": "L'utilisateur existe déjà.",
"server-error": "Erreur interne du serveur !",
"fill-required-details!": "Veuillez remplir les informations requises !",
"fill-required-details!": "Veuillez remplir les informations requises !",
"sign-up-form": "Formulaire d'inscription",
"sign-up": "S'inscrire",
"folder-already-exist!": "le dossier existe déjà !",
"please-select-position!": "Veuillez sélectionner un poste !",
"please-select-position!": "Veuillez sélectionner un poste !",
"default-sign-alert": "Êtes-vous sûr de vouloir vous connecter automatiquement à tous les emplacements demandés ? ",
"Your-Signature": "Votre signature",
"auto-sign-all": "Tout signer automatiquement",
@@ -460,10 +463,10 @@
"pdf-download": "Téléchargement PDF",
"generate-certificate-alert": " Votre certificat d'achèvement est en cours de génération. Veuillez patienter quelques instants. Si le téléchargement ne démarre pas sous peu, cliquez à nouveau sur le bouton. ",
"folder-already-exist": "Le dossier existe déjà !",
"folder-created-successfully": "Dossier créé avec succès !",
"folder-created-successfully": "Dossier créé avec succès !",
"fill-folder-name": "Veuillez indiquer le nom du dossier",
"already-exists-this-username": "Un utilisateur existe déjà avec ce nom d'utilisateur !",
"verification-code-sent": "Un e-mail de vérification a été envoyé à votre adresse e-mail !",
"already-exists-this-username": "Un utilisateur existe déjà avec ce nom d'utilisateur !",
"verification-code-sent": "Un e-mail de vérification a été envoyé à votre adresse e-mail !",
"registered-user-successfully": "Utilisateur enregistré avec succès.",
"role-not-found": "Rôle introuvable.",
"do-not-access": "Vous n'y avez pas accès, veuillez contacter l'administrateur.",
@@ -512,14 +515,14 @@
"choose-password": "Choisissez un mot de passe",
"enter-password": "Entrer le mot de passe",
"sure": "bien sûr",
"subscribed-alert": "Vous êtes déjà abonné au forfait !",
"subscribed-alert": "Vous êtes déjà abonné au forfait !",
"monthly": "Mensuel",
"yearly-upto": "Annuel (jusqu'à 66 % de réduction)",
"yearly-upto": "Annuel (jusqu'à 66 % de réduction)",
"billed-yearly": "Facturé annuellement",
"billed-monthly": "Facturé mensuellement",
"plansubscription-1": "Hébergez-le vous-même gratuitement",
"visit-github": "Visitez Github",
"user-already-exist-name": "Un utilisateur existe déjà avec ce nom d'utilisateur !",
"user-already-exist-name": "Un utilisateur existe déjà avec ce nom d'utilisateur !",
"do-not-access-contact-admin": "Vous n'y avez pas accès, veuillez contacter l'administrateur.",
"filed-required-correctly": "Veuillez remplir correctement les informations requises.",
"admin-created": "Administrateur créé",
@@ -547,9 +550,9 @@
"discord": "Discorde"
},
"tour-mssg": {
"home-layout-1": "Vous vous êtes connecté avec succès ! Jetons un coup d'oeil.",
"home-layout-1": "Vous vous êtes connecté avec succès ! Jetons un coup d'oeil.",
"home-layout-2": "Pour télécharger des documents à auto-signature ou pour demander la signature d'autres personnes, sélectionnez simplement les boutons correspondants.",
"home-layout-3": "Vous êtes prêt à commencer à utiliser OpenSign ! Si vous avez besoin d'aide, n'hésitez pas à nous contacter.",
"home-layout-3": "Vous êtes prêt à commencer à utiliser OpenSign ! Si vous avez besoin d'aide, n'hésitez pas à nous contacter.",
"generate-token": "Mettez à niveau maintenant pour générer un jeton API",
"opensign-drive-1": "Cliquez sur les liens du fil d'Ariane pour naviguer facilement dans la hiérarchie des dossiers et afficher les documents dans chaque dossier.",
"opensign-drive-2": "Cliquez sur le bouton Ajouter pour créer un nouveau dossier ou document.",
@@ -584,7 +587,10 @@
"Out for signatures": "En cliquant sur cette carte, vous accéderez à une liste de documents en attente de signature.",
"Recent signature requests": "Voici une liste de documents qui attendent votre signature.",
"Recently sent for signatures": "Il s'agit d'une liste de documents que vous avez envoyés à d'autres parties pour signature.",
"Drafts": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi."
"Drafts": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.",
"username": "Entrez votre nom d'utilisateur pour générer votre profil public. Une fois ajouté,vous pouvez visiter https://opensign.me/your-username pour voir votre modèle public.",
"tagline": "Ajoutez votre slogan ici ! Vous pouvez voir votre slogan en visitant `https://opensign.me/your-username` en remplaçant votre nom d'utilisateur par votre nom d'utilisateur réel.",
"public-template": "Voici un exemple de la façon de rendre n'importe quel modèle public et accessible via une URL. Par exemple, visiter `https://opensign.me/your-username` vous permettra de visualiser votre modèle public et de le rendre disponible pour la signature publique. "
},
"enter-email-plaholder": "Ajoutez une adresse email et appuyez sur Entrée",
"success-email-alert": "E-mail envoyé avec succès!",
@@ -604,7 +610,17 @@
"Add-seats": "Ajouter des sièges",
"format": "format",
"select-date-format": "Sélectionnez un format de date",
"buyapiaddon": "Acheter des API Crédits",
"quantityofapis": "Quantité d'API",
"additionalapis": "Veuillez acheter des API complémentaires",
"remainingapis": "API restantes Crédits:",
"additional-quicksend": "Veuillez acheter le module complémentaire quick send",
"quantityofquicksend": "Quantité de Quick send",
"quotaerrquicksend": "Quota atteint, vous n'avez pas assez de crédits.",
"buycredits": "Acheter des crédits",
"rotate-right": "Faire pivoter à droite",
"rotate-left": "Faire pivoter à gauche",
"rotate-alert-mssg" :"Tous les widgets de cette page seront perdus. Êtes-vous sûr de vouloir continuer ?"
"rotate-alert-mssg": "Tous les widgets de cette page seront perdus. Êtes-vous sûr de vouloir continuer ?",
"templateid": "ID de modèle",
"bulksendsubcriptionalert": "Veuillez passer au forfait Professionnel ou Équipe pour utiliser Quicksend."
}