CINXE.COM

FMJD - Feature Voting & Roadmap

<!doctype html> <html lang="en"> <head> <script> const PATH_PREFIX_PRODUCT = '/@FMJD'; </script> <!-- Favicons --> <link rel="shortcut icon" href="/favicon.png" /> <link rel="icon" type="image/png" href="/favicon.png" sizes="32x32" /> <!-- 32x32 --> <link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png" /> <!-- 180x180 --> <meta name="msapplication-TileImage" content="/assets/mstile-144x144.png" /> <!-- 144x144 --> <meta name="msapplication-TileColor" content="#ffffff"> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <!-- Twitter --> <meta name="twitter:card" content="summary"> <meta name="twitter:site" content="https://productific.com/@FMJD"> <meta name="twitter:creator" content="Productific"> <meta name="twitter:title" content="FMJD"> <meta name="twitter:description" content="FMJD - Feature Voting &amp; Roadmap"> <!-- --> <meta name="twitter:image" content="https://productific.com/text-to-image/product/5db9e000d188900024554740"> <!-- Facebook --> <meta property="og:url" content="https://productific.com/@FMJD"> <meta property="og:title" content="FMJD"> <meta property="og:description" content="FMJD - Feature Voting &amp; Roadmap"> <meta property="og:type" content="website"> <meta property="og:image" content="https://productific.com/text-to-image/product/5db9e000d188900024554740"> <meta property="og:image:url" content="https://productific.com/text-to-image/product/5db9e000d188900024554740"> <meta property="og:image:secure_url" content="https://productific.com/text-to-image/product/5db9e000d188900024554740"> <meta property="og:image:type" content="image/png"> <!-- <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="628"> --> <!-- <link rel="canonical" href="https://productific.com/@FMJD" /> --> <link rel="canonical" href="https://productific.com/@FMJD" /> <script src="https://apis.google.com/js/platform.js?onload=onLoadCallback" async defer></script> <script> window.onLoadCallback = function() { console.log("Checking Google login..."); gapi.load('auth2', function() { auth2 = gapi.auth2.init(); if (auth2.isSignedIn.get()) { myGoogleProfile = auth2.currentUser.get().getBasicProfile(); //getMyFeedbackUpdateButtons(); console.log('Google sign-in is active'); //console.log(myGoogleProfile.getName() + ' ID: ' + myGoogleProfile.getId()); isLoggedInGoogle = true; } else { console.log('Google sign-in not yet active'); } }) } </script> <meta name="google-signin-client_id" content="1025861764666-eoq68dbl3j34qo38d7tto29sojlv0m6p.apps.googleusercontent.com"> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-755JGR0Q5E"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-755JGR0Q5E', { send_page_view: true }); </script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-PW9P5ZQ');</script> <!-- End Google Tag Manager --> <!-- Bootstrap, jQuery etc. - first the CSS then JS: jQuery first, then Popper.js, then Bootstrap JS --> <!-- 4.0.0 <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> --> <!-- 4.1.3 --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"> <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> <!-- 5.1.3 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script> --> <!-- <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,500,700,900" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,400i,500,700&display=swap" rel="stylesheet"> --> <link rel="stylesheet" href="/cdn/Montserrat.css"> <meta name="theme-color" content=""><!-- Chrome, Firefox OS and Opera --> <meta name="msapplication-navbutton-color" content=""><!-- Windows Phone --> <meta name="apple-mobile-web-app-status-bar-style" content=""><!-- iOS Safari --> <!-- Productific CSS --> <!-- Productific Branding --> <link rel="stylesheet" href="/pmaas.css"> <title>FMJD - Feature Voting &amp; Roadmap</title> <meta name="description" content="Request new features, up-vote the features you want most and send your feedback. See what's new in FMJD and what's up next."> <!-- AdSense --> <script data-ad-client="ca-pub-4810642315818787" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- --> <!-- <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script> (adsbygoogle = window.adsbygoogle || []).push({ google_ad_client: "ca-pub-4810642315818787", enable_page_level_ads: true }); </script> --> </head> <body> <div id="ownerUser" style="border-radius: 10px; display: none;"> <div class="col mx-auto text-center"> <span class="fa fa-user-circle fa-7x p-2 mx-auto text-center " style="color:grey;" aria-hidden="true" aria-describedby="Owner"></span> </div> </div> <div class="ptfc-feedback-bg-primary pl-1 pr-1 "> <!-- <h4 id="pmaas-product-name" class="pt-3 pb-3 my-0 pl-3 text-left color-white max-width " style=" "> FMJD </h4> --> <h1 id="pmaas-product-name" class="pt-3 pb-3 my-0 pl-3 text-left color-white max-width ptfc-header " style=" "> <span class="pl-1">FMJD</span> </h1> <div id="additionalTitle" style="display: none;"> Feature Voting &amp; Roadmap </div> <!-- <div class="color-white my-0 small text-center nobr" style="font-size:70%;"> <i class="fas fa-bolt"></i> by <a class="color-white white-link" data-toggle="tooltip" href="https://productific.com/features?ref=poweredby" target="productific" title="Build things users love">Productific</a> </div> --> </div> <!-- <nav class="navbar fixed-top navbar-light bg-white pmaas-shadow-navbar " > --> <nav class="navbar fixed-top navbar-light ptfc-feedback-bg-primary pmaas-shadow-navbar pmaas-navbar-sticky pl-1 pr-1"> <div class="container max-width flex-nowrap pl-3 "> <ul class="nav pmaas-nav-pills " id="myTab" role="tablist"> <!-- large nav --> <li class="nav-item d-none d-lg-inline"> <a class="nav-link pl-1" id="about-tab" data-toggle="tab" href="#about" role="tab" aria-controls="about" aria-selected="false" style="">About</a> </li> <li class="nav-item d-none d-lg-inline"> <a class="nav-link pl-1 active" id="voting-tab" data-toggle="tab" href="#voting" role="tab" aria-controls="voting" aria-selected="true" style="">Voting</a> </li> <li class="nav-item d-none d-lg-inline"> <a class="nav-link pl-1" id="planned-tab" data-toggle="tab" href="#planned" role="tab" aria-controls="planned" aria-selected="false" style="">Outlook</a> </li> <!-- small nav --> <li class="nav-item dropdown d-lg-none ml-0 pl-0 "> <div class="dropdown-toggle nav-link active ml-1 pl-0 " style="min-width:8rem; cursor:pointer;" id="ptfc-dropdown-status" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" style=""> Voting </div> <div class="dropdown-menu ptfc-bg-primary" aria-labelledby="ptfc-dropdown-status" id="ptfc-nav-dropdown-menu"> <a class="dropdown-item color-white" id="about-tab" data-toggle="tab" href="#about" role="tab" aria-controls="about" aria-selected="false" style="">About</a> <a class="dropdown-item color-white" id="voting-tab" data-toggle="tab" href="#voting" role="tab" aria-controls="voting" aria-selected="true" style="">Voting</a> <a class="dropdown-item color-white" id="planned-tab" data-toggle="tab" href="#planned" role="tab" aria-controls="planned" aria-selected="false" style="">Outlook</a> </div> </li> <!-- --> </ul> <span class="nav-item ml-0 my-0 "> <div class="color-white my-0 small text-center nobr " style="font-size:70%;"> <div id="additionalText" style="display: none;">User feedback powered</div> <span id="pmaas-poweredby" style="display:none;" class="ml-2"> <span class="d-none d-sm-inline" style=""> <i class="fas fa-bolt " style=""></i> by <a class="color-white white-link link-white link-underline-only" data-toggle="tooltip" href="https://productific.com/features?ref=poweredby" target="productific" title="Product feedback tool" style="">Productific</a> </span> <span class="d-sm-none"> <a class="color-white white-link link-white link-underline-only" data-toggle="tooltip" href="https://productific.com/features?ref=poweredby" target="productific" title="Product feedback tool"><i class="fas fa-bolt " style=""></i></a> </span> </span> <!-- inside div nobr --> <a href="#" id="pmaas-feedback-user-icon-login" style="display:none;" class="ml-2 align-middle btn btn btn-round btn-white " title="Manage my user feedback on Productific" > <span class="d-none d-md-none d-lg-inline "><span class="fas fa-sign-in-alt fa-1x pmaas-pulse mr-2" aria-hidden="true" aria-describedby="Login"></span>My feedback</span> <span class="d-none d-md-inline d-lg-none"><span class="fas fa-sign-in-alt fa-1x pmaas-pulse mr-2" aria-hidden="true" aria-describedby="Login"></span>Sign in</span> <span class="d-md-none"><span class="fas fa-sign-in-alt fa-1x pmaas-pulse" aria-hidden="true" aria-describedby="Login"></span></span> </a> <script> const TITLE_POPOVER_FEEDBACK = "My feedback"; const TITLE_POPOVER_SIGNIN = "Sign in"; $(document).ready(function() { updateFeedbackLoginButton(); }); </script> <div id="pmaas-feedback-user" style="border-radius: 10px; display: none;"> <div class="mt-3 text-center"> Manage my user feedback on Productific: </div> <div class="col mx-auto text-center mt-2 mb-3"> <a href="/@FMJD/my-feedback" class="btn btn-sm btn-round-sm btn-outline-secondary" >My feedback</a> </div> <div class="mt-3 text-center"> Browser notifications: </div> <div class="col mx-auto text-center mt-2 mb-3"> <button class="btn btn-sm btn-round-sm btn-outline-secondary" data-toggle="tooltip" title="Notification settings" id="pmaas-button-notifications" onclick="showModalProductNotifications();"> <span class="">Configure</span> </button> </div> <!-- <div class="mt-3"> Log out of Productific (you can log in again, any time): </div> <div class="col mx-auto text-center mb-3"> <a href="/feedback/logout?redirect=/@FMJD" class="btn btn-sm btn-round-sm btn-outline-danger" >Log out</a> </div> --> </div> <div id="pmaas-feedback-user-login" style="display: none;"> <div class="mt-3 text-center"> Sign in for a better feedback experience: </div> <script type="text/javascript" src="/app-js/ptfc_public.js"></script> <script> var publishGUID = 'FMJD'; if (publishGUID) { console.log('sign-in-cookie: setting cookie twitter-oauth-state to "' + publishGUID + '"'); setCookie('twitter-oauth-state', publishGUID); } else { console.log('sign-in-cookie: deleting cookie twitter-oauth-state'); deleteCookie('twitter-oauth-state'); } </script> <table class="w-100"> <tr><td> <div class="col mx-auto text-center mt-2 mb-2"> <a href="/@FMJD/auth/google" rel="nofollow" class="btn btn-sm btn-round-sm btn-feedback px-3 d-flex align-items-center" > <i class="fab fa-google mr-2"></i><span class="flex-grow-1">Sign in with Google</span></a> </div> </td></tr> <!-- --> </table> <div class="mt-3 text-center"> Manage my guest feedback: </div> <div class="col mx-auto text-center mt-2 mb-3"> <a href="/@FMJD/my-feedback" class="btn btn-sm btn-round-sm btn-outline-secondary d-flex" > <span class="flex-grow-1">My feedback</span></a> </div> <div class="mt-3 text-center"> Browser notifications: </div> <div class="col mx-auto text-center mt-2 mb-3"> <a class="btn btn-sm btn-round-sm btn-outline-secondary d-flex" data-toggle="tooltip" title="Notification settings" id="pmaas-button-notifications" onclick="$('#pmaas-feedback-user-icon-login').popover('hide');showModalProductNotifications();"> <span class="flex-grow-1">Configure</span> </a> </div> </div> </div> </span> </div> </nav> <nav class="navbar fixed-bottom navbar-light max-width"> <div class="ml-auto mb-3"> <!-- <button class="btn btn-round-lg btn-feedback ml-2" data-toggle="tooltip" title="Notification settings" id="pmaas-button-notifications" onclick="showModalProductNotifications();"> <span class="d-none d-md-inline"><i class="fas fa-bell mr-2"></i>Notifications</span> <span class="d-md-none"><i class="fas fa-bell"></i></span> </button> --> <button class="btn btn-round btn-feedback ml-1" data-toggle="tooltip" title="Notify me on news about FMJD" id="pmaas-button-subscribeProduct" onclick="showModalSubscribe('5db9e000d188900024554740', null, 'subscribeProduct');"> <span class="d-none d-md-inline"><i class="fas fa-bell mr-2"></i>Notify me</span> <span class="d-md-none"><i class="fas fa-bell mr-2"></i>News</span> </button> </div> <div class=" mb-3"> <nobr> <button class="btn btn-round btn-feedback ml-2" data-toggle="tooltip" title="Suggest new item" onclick="showRequestModal('Feature Request', 'Feature Request', false);"> <span class="d-none d-md-inline "><i class="fas fa-plus mr-2"></i>Feature Request</span> <span class="d-md-none"><i class="fas fa-plus mr-2"></i>New</span> </button> </nobr> </div> </nav> <div class="container-fluid mt-4 "> <div class="fill-width mb-4 d-xl-none " > <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- Block 2 horizontal responsive --> <ins class="adsbygoogle" style="display:block;min-width:320px;max-width:900px;height:100px" data-ad-client="ca-pub-4810642315818787" data-ad-slot="5447282191" data-ad-format="horizontal" data-full-width-responsive="true"></ins> <script> //(adsbygoogle = window.adsbygoogle || []).push({}); $(document).ready(function(){(adsbygoogle = window.adsbygoogle || []).push({})}) </script> </div> </div> <!-- #google_responsive_slot_preview --> <div class="d-none d-xl-block" style="position:absolute; top:150px; left:5px; "> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4810642315818787" crossorigin="anonymous"></script> <!-- vertical block left --> <ins class="adsbygoogle " style="display:block; min-width:200px;max-width:400px; min-height:600px;max-height:800px;" data-ad-client="ca-pub-4810642315818787" data-ad-slot="7942728763" data-ad-format="vertical" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="d-none d-xl-block" style="position:absolute; top:150px; right:5px; "> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- vertical block right --> <ins class="adsbygoogle " style="display:block; min-width:230px;max-width:400px; min-height:600px;max-height:800px;" data-ad-client="ca-pub-4810642315818787" data-ad-slot="1566364047" data-ad-format="vertical" data-full-width-responsive="true"></ins> <script> //(adsbygoogle = window.adsbygoogle || []).push({}); $(document).ready(function(){(adsbygoogle = window.adsbygoogle || []).push({})}) </script> </div> <div class="tab-content " id="myTabContent"> <div class="tab-pane fade " id="about" role="tabpanel" aria-labelledby="about-tab"> <div class="container-fluid max-width mt-md-1 "> <div class="row w-100 pl-1"> <div id="pmaas-product-id" class="col mx-auto overflow-hidden " style=""> <!-- <h4 id="pmaas-product-name" class=" mt-3 font-weight-light text-center" style="">FMJD</h4> --> <div id="pmaas-product-markup" class="mt-2 pl-1" style=""> World Draughts Federation </div> <br> <div class="text-left my-2 pl-1 nobr"> <!-- <span class="mb-2">Contact:<br></span> --> <div class="mt-3"> <a class="darklink " data-toggle="tooltip" title="FMJD" href="https://fmjd.org" target="website" rel="nofollow">https://fmjd.org</a> </div> </div> </div> </div> </div> </div><!-- tab-pane --> <script> var featuresForFeedback=[]; </script> <div class="tab-pane fade show active" id="voting" role="tabpanel" aria-labelledby="voting-tab"> <div class="container-fluid max-width mt-md-1" id="prioritize_feature_requests"> <div class="row w-100 pl-1"> <div class="col mx-auto overflow-hidden " style=""> <!-- <p class="mb-3 font-weight-light" style="">Voting: do you want this in FMJD?</p> --> <div class="d-flex justify-content-start mb-4 mt-2 pmaas-feature "> <div class="mt-1 mb-auto" > <div class="px-1 py-0 m-0 mr-3" align="center" > <div class="btn-group-vertical"> <button class="btn btn-sm btn-round-sm btn-feedback pmaas-button-vote65dc5f78e1ed63586b578ab7" data-toggle="tooltip" title="Vote" id="pmaas-button-vote65dc5f78e1ed63586b578ab7" onclick="sendFeedback(pmaasProductId, '65dc5f78e1ed63586b578ab7', 'vote');"> <span class="px-3"><i class="fas fa-chevron-up"></i></span> </button> <button class="btn btn-sm btn-round-sm btn-feedback disabled"> <span class="font-weight-light " id="pmaas-counter-allfeedback65dc5f78e1ed63586b578ab7">11</span> </button> </div> </div> </div> <div class="mt-2 my-auto " > <div class="darklink "> <a class="font-weight-bold" id="pmaas-features-name" style=" " hrefTODO="/@FMJD/V9sI" href="javascript:showModalItem('65dc5f78e1ed63586b578ab7');" > End of game open </a> </div> <!-- hrefTODO="/@FMJD/V9sI" --> <div id="" class="d-none d-md-inline-block darklink mr-auto" style=""> <a class="" id="" href="javascript:showModalItem('65dc5f78e1ed63586b578ab7');"> For all </a> <a class="text-white" id="" href="/@FMJD/V9sI"> ⋅ </a> </div> <span id="ptfc-type" style="display:none;"></span> <div class=" "> <span class="badge badge-light badge-pill text-muted font-weight-normal m-0 p-2 ptfc-search-tag mt-1" >User request</span> <!-- <button class="btn btn-sm btn-round-sm btn-outline-secondary mr-2" data-toggle="tooltip" title="" id="" onclick="">User request</button> --> <small><span class="text-muted d-none d-md-inline "> &nbsp; Latest feedback 24 days ago </span></small> </div> <!-- <a class="badge badge-light badge-pill text-muted font-weight-normal m-0 p-2 ptfc-search-tag darklink" id="" href="/@FMJD/V9sI" data-toggle="tooltip" title="View"><i class="fa fa-share"></i></a> --> <!-- <button class="btn btn-sm btn-round-sm btn-outline-primary mr-1" data-toggle="tooltip" title="Notify me on news" id="pmaas-button-subscribe65dc5f78e1ed63586b578ab7" onclick="sendFeedback(pmaasProductId, '65dc5f78e1ed63586b578ab7', 'subscribe');" ><i class="fas fa-bell"></i></button> <a class="btn btn-sm btn-round-sm btn-outline-primary mr-1" data-toggle="tooltip" title="View" id="pmaas-button-subscribe65dc5f78e1ed63586b578ab7" href="/@FMJD/V9sI" ><i class="fa fa-share"></i></a> --> </div> <div class="ml-auto mt-2 my-auto"> <!-- dummy to fill up space --> </div> <div class="ml-auto" style="display:none;"> <!-- style="display:none;" --> <div class="" align="right" > </div> </div> </div> <script> featuresForFeedback.push('65dc5f78e1ed63586b578ab7'); </script> </div> </div> </div> </div><!-- tab-pane --> <script> var featuresBuilding=[]; </script> <div class="tab-pane fade " id="planned" role="tabpanel" aria-labelledby="planned-tab"> <div class="container-fluid max-width mt-md-1" id="roadmap2"> <div class="row w-100 pl-1 "> <div class="col " style=""> <!-- <p class="mb-3 font-weight-light" style="">Planned</p> --> <div class="mb-lg-3"></div> </div> </div> <div class="row w-100 pmaas-vdivider3 "> <!-- <div class="col-12 mx-auto m-2 m-md-1 p-md-1 overflow-hidden" style=""> --> <div class="col-12 " style=""> <div class="d-flex justify-content-between mb-4 mt-2 pmaas-feature"> <div class="mt-1 mb-auto" style="display:visible;"> <!-- style="display:none;" --> <div class="px-1 py-0 m-0 mr-3" align="center" > <div class="btn-group-vertical"> <button class="btn btn-sm btn-round-sm btn-feedback pmaas-button-vote65dc5f78e1ed63586b578ab7" data-toggle="tooltip" title="Vote" id="pmaas-button-vote65dc5f78e1ed63586b578ab7" onclick="sendFeedback(pmaasProductId, '65dc5f78e1ed63586b578ab7', 'vote');"> <span class="px-3"><i class="fas fa-chevron-up"></i></span> </button> <button class="btn btn-sm btn-round-sm btn-feedback disabled"> <span class="font-weight-light " id="pmaas-counter-allfeedback65dc5f78e1ed63586b578ab7">11</span> </button> </div> </div> </div> <div class="mt-2 my-auto" > <div class="darklink"> <a class="font-weight-bold" id="pmaas-features-name" style=" " hrefTODO="/@FMJD/V9sI" href="javascript:showModalItem('65dc5f78e1ed63586b578ab7');" > End of game open </a> </div> <!-- --> <div id="" class="d-none d-md-inline-block darklink mr-auto" style=""> <a class="" id="" href="javascript:showModalItem('65dc5f78e1ed63586b578ab7');"> For all </a> <a class="text-white" id="" href="/@FMJD/V9sI"> ⋅ </a> </div> <!-- <button class="btn btn-sm btn-round-sm btn-outline-primary" data-toggle="tooltip" title="Notify me on news" id="pmaas-button-subscribe65dc5f78e1ed63586b578ab7" onclick="sendFeedback(pmaasProductId, '65dc5f78e1ed63586b578ab7', 'subscribe');"><i class="fas fa-bell mr-1"></i>Notify me</button> --> <span id="ptfc-type" style="display:none;"></span> <!-- <span class="ml-2"</span> --> <span class="badge badge-light badge-pill text-muted font-weight-normal m-0 p-2 ptfc-search-tag mt-1" >User request</span> <small><span class="text-muted d-none d-md-inline "> <!-- &nbsp; Latest feedback 24 days ago --> </span></small> </div> <div class="ml-auto mt-2 my-auto"> <!-- dummy to fill up space --> </div> <div class="ml-auto" style="display:none;"> <!-- style="display:none;" --> <div class="" align="right" > </div> </div> </div> <script> featuresBuilding.push('65dc5f78e1ed63586b578ab7'); </script> <!-- match this version --> <!-- feature loop --> </div> <!-- version loop --> </div><!-- ow --> </div> <!-- container --> </div><!-- tab-pane --> </div><!-- tab-content --> <br><br><br><br> <div class="modal fade" id="pmaas-modal-googleSignIn" tabindex="-1" role="dialog"> <div class="modal-dialog modal-dialog-centered " role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Please sign in to provide feedback</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close" onclick="traceCancelEvent();"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <p> For feedback or notifications we would like to ask you to sign-in. This helps us providing a high-quality feedback experience. </p> <p> By signing in you agree that we may use the name and e-mail address provided by your sign-in to get in touch with you, for example: <ul> <li>When you subscribe to news about this product or idea.</li> <li>When you submit a feature request.</li> </ul> <!-- You can revoke this consent at any time via <a href="/my-feedback">https://productific.com/my-feedback</a>. --> </p> <div class="g-signin2" data-onsuccess="onSignIn"></div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="traceCancelEvent();">Close</button> </div> </div> </div> </div> <script> function traceCancelEvent() { console.error('canceled'); function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-123071411-1'); gtag('event', 'cancel_feedback_login', { 'event_category' : 'cancel', 'event_label' : 'cancel', method : 'web' }); } </script> <div class="modal fade" id="pmaas-modal-request" tabindex="-1" role="dialog"> <div class="modal-dialog modal-dialog-centered modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="pmaas-modal-request-title-request">Submit a request</h5> <h5 class="modal-title" id="pmaas-modal-request-title-issue">Report an issue</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <form> <div class="form-group"> <p>What would make FMJD better for you?</p> <input type="text" class="form-control btn-round" id="pmaas-request-title" required placeholder="Title" aria-label="Title"/> <label for="pmaas-request" class="col-form-label ">Describe your idea here:</label> <textarea class="form-control btn-round mb-3" id="pmaas-request" rows="3"></textarea> <label for="pmaas-myName" class="pmaas-myName">Name</label> <input type="text" class="form-control pmaas-myName" id="pmaas-myName" aria-describedby="nameHelp" placeholder="My name" > <label for="pmaas-myEmail" class="mt-3 pmaas-myEmail">Email address</label> <input type="email" class="form-control pmaas-myEmail" id="pmaas-myEmail" aria-describedby="emailHelp" placeholder="name@googlemail.com"> <small id="emailHelp" class="form-text text-muted pmaas-myEmail"> We'll use your email only for notifications about this item. </small> </div> </form> </div> <div class="modal-footer"> <button type="button" id="pmaas-modal-button-save" class="btn btn-round btn-feedback" onclick="javascript:saveRequestAndCloseModal();">Send</button> </div> </div> </div> </div> <!-- toast --> <div class='toast btn-round-lg' style='display:none'>Productific</div> <!-- error --> <div class="modal fade" id="pmaas-modal-error" tabindex="-1" role="dialog"> <div class="modal-dialog modal-dialog-centered modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Whoomps, that didn't work</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <form> <div class="form-group"> <p id="pmaas-modal-error-message"></p> </div> </form> </div> <div class="modal-footer"> <button type="button" id="pmaas-modal-button-close" class="btn btn-round btn-secondary" onclick="closeErrorModal();">Close</button> </div> </div> </div> </div> <!-- error spoof protection limit--> <div class="modal fade" id="pmaas-modal-error-spoofprotection" tabindex="-1" role="dialog"> <div class="modal-dialog modal-dialog-centered modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Guest limit reached</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <form> <div class="form-group "> <p id="pmaas-modal-error-message-guest-limit" class="mb-4"> Your feedback is not submitted.<br> <br> You reached the daily feedback limit for guest users on this device. To provide more feedback today please sign in. Additional options are available when signing in, including feedback overview and notifications. </p> <p id="pmaas-modal-error-message-guest-limit2" class="mb-4"> Your feedback is not submitted.<br> <br> You reached the daily feedback limit for this product. Additional feedback is possible in 24 hours. </p> </div> <script type="text/javascript" src="/app-js/ptfc_public.js"></script> <script> var publishGUID = 'FMJD'; if (publishGUID) { console.log('sign-in-cookie: setting cookie twitter-oauth-state to "' + publishGUID + '"'); setCookie('twitter-oauth-state', publishGUID); } else { console.log('sign-in-cookie: deleting cookie twitter-oauth-state'); deleteCookie('twitter-oauth-state'); } </script> <center> <table class=""> <tr><td> <div class="col mx-auto text-center mt-2 mb-3"> <a href="/@FMJD/auth/google" rel="nofollow" class="btn btn-round btn-feedback px-3 d-flex align-items-center" > <i class="fab fa-google mr-2"></i><span class="flex-grow-1">Sign in with Google</span></a> </div> </td></tr> <!-- --> </table> </center> </form> </div> <div class="modal-footer"> <button type="button" id="pmaas-modal-button-close" class="btn btn-round btn-outline-secondary" onclick="closeSpoofProtectionModal();">Close</button> </div> </div> </div> </div> <script> function closeErrorModal(){ $('#pmaas-modal-error').modal('hide'); } function closeSpoofProtectionModal(){ $('#pmaas-modal-error-spoofprotection').modal('hide'); } </script> <!-- Productific JS --> <script type="text/javascript" src="/pmaas.js"></script> <script type="text/javascript" src="/app-js/ptfc_public.js"></script> <script src="/app-js/pmaas_feedback.js"></script> <!-- Fontawesome --> <!-- <script defer src="https://use.fontawesome.com/releases/v5.0.8/js/all.js"></script> --> <script defer src="https://use.fontawesome.com/releases/v5.15.2/js/all.js"></script> <!-- Google APIs --> <script src="https://apis.google.com/js/platform.js" async defer></script> <!-- https://momentjs.com --> <script type="text/javascript" src="/lib/moment.min.js"></script> <!-- item modal ************************************************** --> <div class="modal fade" id="pmaas-modal-item" tabindex="-1" role="dialog" style="calc(height: 100vh - 20px); overflow-y: none;"> <div class="modal-dialog modal-dialog-centered modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="pmaas-modal-item-title">Item title</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body " > <!-- <span id="ptfc-busy-indicator" class="fa fa-3x fa-spinner ptfc-color-primary loading_saving mx-auto my-4 flex-fill" aria-hidden="true" style="opacity: 0.5;" style="visibility: visible;"></span> --> <div style="height: calc(100vh - 230px); overflow-y: auto;" class="pmaas-scrollbar-blue"> <div id="pmaas-modal-item-tags"> tags </div> <div id="pmaas-modal-item-markup" class="pr-2"> Item markup </div> <div id="pmaas-comment-not-approved" style="display: none;" > <div class="d-flex"> <div class=""> <span class="fas fa-user-circle fa-2x ptfc-color-primary align-middle" aria-hidden="true" aria-describedby="Guest"></span> </div> <div class="flex-grow-1 mb-2"> <span class="ml-2 align-middle ptfc-color-darkgray" > This comment is under review by the product owner and visible to you, only. </span> <!-- <i class="far fa-1x fa-comment ml-2 mr-auto align-middle ptfc-color-darkgray"></i> --> <br> <p id="pmaas-comment-not-approved-text" class="mt-1 mb-1 ml-2 "> comment text comment </p> <button class="btn btn-round btn-feedback ml-2 mr-2 mt-0 mb-2 " title="Change comment" id="pmaas-button-comment-edit" onclick="showModalComment();"> <span class=""><i class="far fa-comment mr-2 d-none d-md-inline"></i>Edit</span> </button> </div> </div> </div> <div id="pmaas-modal-item-comments" class="mt-3"> comments </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn btn-round btn-outline-secondary d-none d-lg-inline" data-dismiss="modal">Close</button> <a type="button" class="btn btn btn-round btn-outline-secondary mr-auto" id="pmaas-modal-item-button-view" target="_blank" href=""> <span class="d-none d-lg-inline"><i class="fa fa-share mr-2"></i>View</span> <span class="d-lg-none"><i class="fa fa-share"></i></span> </a> <button class="btn btn-round btn-feedback ml-1" data-toggle="tooltip" title="Vote" id="pmaas-button-vote" onclick="sendFeedback('5db9e000d188900024554740', currentItemId, 'vote');"> <span class="d-none d-lg-inline"><i class="fas fa-chevron-up mr-2"></i>Vote</span> <span class="d-lg-none"><i class="fas fa-chevron-up"></i></span> </button> <button class="btn btn-round btn-feedback ml-1" data-toggle="tooltip" title="Notify me on news" id="pmaas-button-subscribe" onclick="showModalSubscribe('5db9e000d188900024554740', currentItemId, 'subscribe');"> <span class="d-none d-lg-inline"><i class="fas fa-bell mr-2"></i>Notify me</span> <span class="d-lg-none"><i class="fas fa-bell"></i></span> </button> </div> </div> </div> </div> <script > var currentItemId; function showModalItem(itemId) { //logFunc('showModalItem() ' + itemId); if (!itemId) { showErrorModal('empty item'); return; } $('#pmaas-modal-item-title').text(''); $('#pmaas-modal-item-tags').html(''); $('#pmaas-modal-item-markup').html(''); $('#pmaas-comment-not-approved').hide(); //$('#pmaas-comment-not-approved-text').html(''); $('#pmaas-modal-item-comments').html(''); $('#pmaas-button-vote').removeClass('active'); $('#pmaas-button-subscribe').removeClass('active'); $('#pmaas-button-comment').removeClass('active'); $('#pmaas-modal-item').modal('show'); lockModal('#ptfc-modal-item'); $.ajax({ type: 'GET', url: PATH_FEEDBACKWS_PUBLIC+'/getFeatureById', contentType: 'application/json', data: { featureId: itemId, feedbackUserId: feedbackUserId }, //data: JSON.stringify({email: searchForEmail, productId: mvcGetCurrentProduct()._id, role: role}), //JSON.stringify({email: searchForEmail}), success: function(responseData) { unlockModal('#ptfc-modal-item'); console.log(PATH_FEEDBACKWS_PUBLIC+'/getFeatureById done, result: ' + Math.round(JSON.stringify(responseData).length*2/1024) + 'kb' ); var feature = responseData; currentItemId = feature._id; // item feedback buttons updateVotingButtons([currentItemId]); //$('#pmaas-button-'+type).hasClass('active') $('#pmaas-modal-item-title').text(feature.name); $('#pmaas-modal-item-markup').html(feature.markup); var tagsHtml = ''; if (feature.type) { var typeDisplay = feature.type; /* if (typeDisplay == 'typeCustom1') typeDisplay == feature.product.itemTypeCustom1; if (typeDisplay == 'typeCustom2') typeDisplay == feature.product.itemTypeCustom2; */ tagsHtml += '<h4>'+'<span class="badge badge-light badge-pill tag-badge text-muted ml-0 mr-2 p-2 font-weight-light pmaasDarkGrey text-left" >' + escapeHTML(typeDisplay) + '</span>'+'</h4>'; } if (feature.tags && feature.tags.length>0) { tagsHtml += '<h4>'; for (t=0; t<feature.tags.length; t++) { // <span class="badge badge-light badge-pill tag-badge text-muted m-0 p-2 font-weight-light pmaasDarkGrey text-left" > tag </span> tagsHtml += '<span class="badge badge-light badge-pill tag-badge text-muted ml-0 mr-2 p-2 font-weight-light pmaasDarkGrey text-left" >' + escapeHTML(feature.tags[t]) + '</span>'; } tagsHtml += '</h4>'; } if ((feature.tags && feature.tags.length>0) || feature.type) { $('#pmaas-modal-item-tags').html(tagsHtml); $('#pmaas-modal-item-tags').show(); } else { $('#pmaas-modal-item-tags').html(''); $('#pmaas-modal-item-tags').hide(); } console.log('modal found comments: ' + (feature.comments?feature.comments.length:0) + ', comments for review: ' + (feature.commentsForReview?feature.commentsForReview.length:0) ); var commentsHtml = commentsToHtml(feature.comments); $('#pmaas-modal-item-comments').html(commentsHtml); if (commentsHtml.length>0) $('#pmaas-modal-item-comments').show(); else $('#pmaas-modal-item-comments').hide(); //var nil = commentsToHtml(feature.commentsForReview); if (feature.commentsForReview && feature.commentsForReview.length>0) { console.log('show comment under review: ' + feature.commentsForReview[0].text); $('#pmaas-comment-not-approved').show(); $('#pmaas-comment-not-approved-text').text(feature.commentsForReview[0].text); $('#pmaas-comment').val(feature.commentsForReview[0].text); // pre-fill comment modal $commentFeedbackId = feature.commentsForReview[0]._id; } else { $('#pmaas-comment-not-approved').hide(); } var itemUrl = '/@' + feature.productPublishGUID + '/' + feature.publishGUID; if (feature.vanityurl && feature.vanityurl.length>0) itemUrl = '/@' + feature.productPublishGUID + '/' + feature.vanityurl + '-' + feature.publishGUID; $('#pmaas-modal-item-button-view').attr('href', itemUrl); }, error: function(request, status, error) { unlockModal('#ptfc-modal-item'); $('#pmaas-modal-item-title').text('Error'); $('#pmaas-modal-item-markup').html(); //showErrorModal(request.responseText); console.error(error); toast("Error: " + error); traceError('cannot search user: '+error); } }); } function hideModalItem() { //logFunc('hideModalItem()'); $('#ptfc-modal-item').modal('hide'); } function commentsToHtml(comments) { if (!comments) return ''; var html = ''; for (var c=0; c<comments.length; c++) { var comment = comments[c]; if (!comment.approved || comment.approved == false) { console.error('modal found unapproved comment: ' + comment.text + ' user ' + comment.feedbackUserId + ' current user is ' + feedbackUserId); } else { //console.error('comment:' + JSON.stringify(comment)); html += feedbackUserToHtml(comment.feedbackUser, comment.name); html += '<span class="ml-0 align-middle ptfc-color-darkgray">' + moment(comment.createdAt).locale(navigator.language).fromNow() +'</span>'; html += '<i class="far fa-1x fa-comment ml-2 align-middle ptfc-color-darkgray"></i><br>'; html += '<div class="row ml-4 mr-2 mb-2 px-2 " id="" >'; html += '<p class="ml-2">'; html += comment.text; html += '</p>'; html += '</div>'; } } return html; } function feedbackUserToHtml(feedbackUser, backupName) { var userHtml = ''; if (feedbackUser && feedbackUser.profile) { if (feedbackUser.profile.photos && feedbackUser.profile.photos.length>0) { userHtml += '<img class="rounded-circle img-fluid p-0 mx-auto text-center " width="30px" height="30px"' + 'src="' + feedbackUser.profile.photos[0].value + '" alt="' + (feedbackUser.profile.displayName?feedbackUser.profile.displayName:'') + '"></img>'; } else { userHtml += '<span class="fas fa-user-circle fa-2x align-middle ptfc-color-primary " aria-hidden="true"></span>'; } if (feedbackUser.profile.displayName) { userHtml += '<span class="ml-2 align-middle ptfc-color-darkgray">' + feedbackUser.profile.displayName + ', </span>'; } } else { userHtml += '<span class="fas fa-user-circle fa-2x align-middle ptfc-color-primary " aria-hidden="true"></span>'; userHtml += '<span class="ml-2 align-middle ptfc-color-darkgray">Guest, </span>'; } return userHtml; } </script> <!-- comment modal --> <div class="modal fade" id="pmaas-modal-comment" tabindex="-1" role="dialog"> <div class="modal-dialog modal-dialog-centered modal-md" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Comment</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <form> <div class="form-group"> <label for="pmaas-comment" class="col-form-label">Post a comment, visible to everyone</label> <textarea class="form-control" id="pmaas-comment" rows="8" placeholder="my comment..."></textarea> </div> </form> </div> <div class="modal-footer"> <button type="button" id="pmaas-modal-button-save" class="btn btn-round btn-feedback" onclick="javascript:saveCommentAndCloseModal();"><i class="far fa-comment mr-2"></i>Send</button> </div> </div> </div> </div> <script> var $commentFeedbackId = null; function showModalComment() { checkFeedbackLoginForType('comment', function(){ //if (!isLoggedInGoogle) { // if (checkCookiesEnabled()) $('#pmaas-modal-googleSignIn').modal('show'); //} else { $('#pmaas-modal-comment').modal('show'); //} }); } function saveCommentAndCloseModal() { var $comment = $('#pmaas-comment').val(); var type = 'comment'; var $modalButtonSave = $('#pmaas-modal-button-save'); var feedback = {}; feedback.productId = pmaasProductId; // current productId if ($commentFeedbackId) feedback.feedbackId = $commentFeedbackId; feedback.featureId = currentItemId; //feedback.googleId = myGoogleProfile.getId(); // TODO remove this when Google ID is verified via backend feedback.tempId = getCookie('tempId'); feedback.email = getCookie("feedback-myEmail");//myGoogleProfile.getEmail(); //feedback.givenName = myGoogleProfile.getGivenName(); feedback.name = getCookie("feedback-myName");//myGoogleProfile.getName(); //feedback.imageURL = myGoogleProfile.getImageUrl() feedback.type = type; feedback.text = $comment; var $webserviceUrl, $type; if ($('#pmaas-comment').hasClass('pmaas-comment-exists')) { $type = 'PUT'; $webserviceUrl = '/updateFeedback'; } else { $type = 'POST'; $webserviceUrl = '/createFeedback'; } $.ajax({ type: $type, url: PATH_FEEDBACKWS_PRODUCT+$webserviceUrl, contentType: 'application/json', data: JSON.stringify(feedback), success: function(data) { console.log(data); toast("Saved"); $('#pmaas-button-'+type).removeClass('disabled'); $('#pmaas-button-'+type).addClass('active'); $('#pmaas-modal-comment').modal('hide'); $modalButtonSave.text('Done'); // show comment for approval $('#pmaas-comment-not-approved').show(); $('#pmaas-comment-button').hide(); $('#pmaas-comment-not-approved-text').text(feedback.text); $('#pmaas-comment').addClass('pmaas-comment-exists'); $('#pmaas-comment').val(feedback.text); if ($type == 'POST') { $commentFeedbackId = data.success._id; console.log('new comment id: ' + $commentFeedbackId); } else {//update //$commentFeedbackId = feedback._id; console.log('updated comment id: ' + $commentFeedbackId); } }, error: function(request, status, error) { console.log(error); toast("Error: " + error); showFeedbackErrorModal(error); $('#pmaas-button-'+type).removeClass('disabled'); $modalButtonSave.text('Done'); } }); $('#pmaas-button-'+type).addClass('disabled'); $modalButtonSave.text('Saving...'); } </script> <!-- push ************************************************** --> <div class="modal fade" id="pmaas-modal-browsernotifications" tabindex="-1" role="dialog"> <div class="modal-dialog modal-dialog-centered modal-md" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Get Notifications for New Features</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <p> Get a browser notification when new features become available.<br> <br> Example: </p> <div class="card bg-light mx-5 mb-4" style=""> <div class="card-body"> <h5 class="card-title">Super App</h5> <p class="card-text">Image Upload is now available in Super App.</p> <button type="button" class="btn btn-round btn-feedback" disabled>View</button> </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn btn-round btn-outline-secondary" data-dismiss="modal" onclick="traceNoSubcribeEvent();">No, thanks</button> <button type="button" id="pmaas-modal-button-browsernotifications" class="btn btn-round btn-feedback" onclick="subscribeUserToPushForProduct('5c267a03b85e0001ca8d34c9');">Yes, please notify me</button> </div> </div> </div> </div> <div id="ptfc-push-overlay" class="container ptfc-overlay-popover pmaas-shadow-popup" style="display:none; max-width:500px;"><!-- min-width:300px; max-width:600px; --> <div class="text-center mt-md-3 mt-2 mx-md-3 mx-2"> <p> Would you like to see notifications about <span id="ptfc-push-product-name">product</span>? </p> </div> <div class="text-center mt-1"> <button class="btn btn-round btn-feedback mb-md-3 mb-2 mx-md-3 mx-2" style="border: 0px;" title="No thanks" id="ptfc-button-no-push" onclick="setCookie('no-push-popover-today', new Date().getTime()); $('#ptfc-push-overlay').hide();">No thanks</button> <button class="btn btn-round btn-feedback mb-md-3 mb-2 mx-md-3 mx-2" title="Yes please" id="ptfc-button-no-push" onclick="subscribeUserToPushForProduct(pmaasProductId, pmaasProductName);$('#ptfc-push-overlay').hide();">Yes please</button> </div> </div> <!-- product notifications ************************************************** --> <div class="modal fade" id="pmaas-modal-productnotifications" tabindex="-1" role="dialog"> <div class="modal-dialog modal-dialog-centered modal-md" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Notifications for FMJD</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body pb-1"> <!-- <p> Receive push notifications for FMJD in your browser:<br> </p> --> <table class="mt-4 mb-0 mx-auto"> <tr id="ptfc-deregister" class="ptfc-deregister" > <td > <label for="" class="col-form-label pmaas-vcenter-hack mr-2"> <span id='ptfc-available' >Browser notifications</span> <span id='ptfc-not-available' style="display:none;"> Push notifications are not available in this browser. </span> </label> </td> <td > <label class="switch pmaas-vcenter-hack" id="ptfc-available-switch"> <input id="ptfc-checkbox-push" type="checkbox" class="form-control" checked data-product-id="5db9e000d188900024554740" onchange="switchChangedNotification(this);"> <span class="slider round"></span> </label> </td> </tr> </table> <!-- <p class="mt-5"> Receive notifications for FMJD via email:<br> </p> <div class="mx-auto text-center mb-4"> <button type="button" id="pmaas-modal-button-product-subscribe" class="btn btn-round btn-feedback " onclick="showModalSubscribe('5db9e000d188900024554740', xxxx TODO, 'subscribe');">Please notify me via email</button> </div> --> </div> <div class="modal-footer"> <button type="button" class="btn btn btn-round btn-outline-secondary" data-dismiss="modal">Close</button> </div> </div> </div> </div> <script > function showModalProductNotifications() { $('#pmaas-modal-productnotifications').modal('show'); } function showPopOverProductNotifications() { var cookieValue = getCookie(cookiePushPrefix + pmaasProductId); if (cookieValue && (''+cookieValue).length>0) { console.log('already subscribed to ' + pmaasProductId);// + ', the details are: ' + cookieValue); } else { var isSafari = window.safari !== undefined; if (!isSafari) { var noPushTodayCookie = getCookie('no-push-popover-today'); if (!noPushTodayCookie || ((new Date().getTime() - noPushTodayCookie) > (30*24*60*60*1000)) ) { // show popover only once a month $('#ptfc-push-product-name').html(pmaasProductName); $('#ptfc-push-overlay').show(); if (noPushTodayCookie) console.log('declined push a while ago, asking again'); } if (noPushTodayCookie) console.log('declined push ' + ((new Date().getTime() - noPushTodayCookie)/(24*60*60*1000)) + 'days ago, not asking again'); //document.getElementById("ptfc-push-overlay").style.display = "block"; } } }; </script> <!-- subscribe ************************************************** --> <div class="modal fade" id="pmaas-modal-subscribe" tabindex="-1" role="dialog"> <div class="modal-dialog modal-dialog-centered modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Notify me on news about this</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <form> <div class="form-group"> <label for="pmaas-myName" class="pmaas-myName">Name</label> <input type="text" class="form-control pmaas-myName" id="pmaas-myName" aria-describedby="nameHelp" placeholder="My name" > <label for="pmaas-myEmail" class="mt-3 pmaas-myEmail">Email address</label> <input type="email" class="form-control pmaas-myEmail" id="pmaas-myEmail" aria-describedby="emailHelp" placeholder="name@googlemail.com"> <small id="emailHelp" class="form-text text-muted pmaas-myEmail"> We'll use your email only for notifications about this item. </small> </div> </form> </div> <div class="modal-footer"> <button type="button" id="pmaas-modal-button-save-subscribe" class="btn btn-round btn-feedback" onclick="javascript:saveSubscribeAndCloseModal();"><i class="fas fa-bell mr-2"></i>Notify me</button> </div> </div> </div> </div> <script > var subscribeModalProductId; var subscribeModalFeatureId; function showModalSubscribe(productId, featureId, feedbackType) { checkFeedbackLoginForType(feedbackType, function(){ showModalSubscribe_loginChecked(productId, featureId, feedbackType); }); } function showModalSubscribe_loginChecked(productId, featureId, feedbackType) { console.log('showModalSubscribe() ' + productId + ' ' + featureId); var type = 'subscribe'; if (feedbackUserId && feedbackUserId.length>0) { // id-ed users directly subscribe w/o pop-up form var onSuccess = function() { //$('#pmaas-button-'+type).addClass('active'); //$('#pmaas-button-'+type+featureId).addClass('active'); $('#pmaas-button-'+type).removeClass('disabled'); $('#pmaas-button-'+type+featureId).removeClass('disabled'); } var onError = function() { $('#pmaas-button-'+type).removeClass('disabled'); $('#pmaas-button-'+type+featureId).removeClass('disabled'); } if ( $('#pmaas-button-'+type).hasClass('active') || $('#pmaas-button-'+type+featureId).hasClass('active') ) { revertFeedback(productId, featureId, type, false, onSuccess, onError); } else { $('#pmaas-button-'+type).addClass('disabled'); $('#pmaas-button-'+type+featureId).addClass('disabled'); sendFeedback(productId, featureId, type, false, onSuccess, onError); } } else { subscribeModalProductId = productId; subscribeModalFeatureId = featureId; var $modalButtonSave = $('#pmaas-modal-button-save-subscribe'); var onSuccess = function() { $('#pmaas-modal-'+type).modal('hide'); $modalButtonSave.text('Done'); } var onError = function() { $('#pmaas-button-'+type).removeClass('disabled'); $modalButtonSave.text('Done'); } // show my data $('.pmaas-myName').val(getCookie("feedback-myName")); $('.pmaas-myEmail').val(getCookie("feedback-myEmail")); if ( $('#pmaas-button-'+type).hasClass('active') || $('#pmaas-button-'+type+featureId).hasClass('active') ) { revertFeedback(productId, featureId, type, true, onSuccess, onError); } else { hideAllTooltips(); $('#pmaas-modal-subscribe').modal('show'); } } } function saveSubscribeAndCloseModal() { console.error('saveSubscribeAndCloseModal() ' + subscribeModalProductId + ' ' + subscribeModalFeatureId); var type = 'subscribe'; var $modalButtonSave = $('#pmaas-modal-button-save-subscribe'); var onSuccess = function() { $('#pmaas-modal-'+type).modal('hide'); $modalButtonSave.text('Done'); } var onError = function() { $('#pmaas-button-'+type).removeClass('disabled'); $modalButtonSave.text('Done'); } var $name = $('#pmaas-myName').val(); var $email = $('#pmaas-myEmail').val(); if (!$email || $email.length<5 || !validateEmail($email)) { console.error('this does not look like a valid email address: ' + $email); return; } setCookie("feedback-myName", $name); setCookie("feedback-myEmail", $email); sendFeedback(subscribeModalProductId, subscribeModalFeatureId, type, true, onSuccess, onError); $('#pmaas-button-'+type).addClass('disabled'); $modalButtonSave.text('Saving...'); } </script> <!-- log in ************************************************** --> <div class="modal fade" id="pmaas-modal-pleaselogin" tabindex="-1" role="dialog" > <div class="modal-dialog modal-dialog-centered " role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title"><i class="fas fa-user-check mr-2"></i> Sign in</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close" onclick="traceCancelEvent();"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <p id="pmaas-modal-pleaselogin-textOptional" class="mx-3 my-3"> Please let us know who you are. This helps us providing a better feedback experience. </p> <p id="pmaas-modal-pleaselogin-textMustLogin" class="mx-3 my-3"> For this feedback please let us know who you are. </p> <div class="col mx-auto mt-2 mb-3 text-center "> <center> <table class=""> <tr><td> <div class="col mx-auto text-center mt-2 mb-3"> <a href="/@FMJD/auth/google" rel="nofollow" class="btn btn-round btn-feedback px-3 d-flex align-items-center" > <i class="fab fa-google mr-2"></i><span class="flex-grow-1">Sign in with Google</span></a> </div> </td></tr> <!-- --> </table> </center> </div> <p class="mx-3 mb-3 text-muted" style="font-size: 80%"> <small> By signing in you agree to the Productific <a href="/data-privacy.html" target="_privacy">privacy policy</a>. </small> </p> </div> <!-- --> <div id="pmaas-modal-pleaselogin-continueAsGuest" class="modal-footer"> <button type="button" class="btn btn btn-round btn-feedback" data-dismiss="modal" onclick="traceCancelEvent();">Continue as guest</button> </div> </div> </div> </div> <script> var hashParams = getParamsFromLocationHash(); var usingGuestWithInfo = false; function hideAllTooltips() { $('[data-toggle="tooltip"]').tooltip('hide'); } var productRequiresLoginForFeedback = false; function checkFeedbackLoginForType(type, onSuccess) { var feedbackUserMustBeLoggedIn = productRequiresLoginForFeedback; if (type === 'subscribe' || type === 'subscribeProduct' || type === 'comment' || type === 'request') { feedbackUserMustBeLoggedIn = true; var gestWithInfoEnabled = false; if (gestWithInfoEnabled == true) feedbackUserMustBeLoggedIn = false; } if (feedbackUserMustBeLoggedIn) { if (feedbackUserId) { onSuccess(); } else { hideAllTooltips(); showLoginModal(true); //true: loginRequired } } else { onSuccess(); } } function showLoginModal(loginRequired) { if (loginRequired) { $('#pmaas-modal-pleaselogin-continueAsGuest').hide(); $('#pmaas-modal-pleaselogin-textOptional').hide(); $('#pmaas-modal-pleaselogin-textMustLogin').show(); $('#pmaas-modal-pleaselogin').modal('show'); } else { $('#pmaas-modal-pleaselogin-continueAsGuest').show(); $('#pmaas-modal-pleaselogin-textOptional').show(); $('#pmaas-modal-pleaselogin-textMustLogin').hide(); $('#pmaas-modal-pleaselogin').modal('show'); } } function traceNoSubcribeEvent() { function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-123071411-1'); gtag('event', 'declide_push_notifications', { 'event_category' : 'push', 'event_label' : 'push', method : 'web' }); } function traceCancelEvent() { function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-123071411-1'); gtag('event', 'cancel_feedback_login', { 'event_category' : 'cancel', 'event_label' : 'cancel', method : 'web' }); } </script> <script type="text/javascript" src="/app-js/search.js"></script> <script async data-campaign-key="yfRLNrzx9p" type="text/javascript" src="https://partner.productific.com/referral.cloud.js"></script> </body> <script > var pmaasProductId = '5db9e000d188900024554740'; var pmaasProductName = 'FMJD'; var feedbackUserId = ''; var isLoggedInGoogle = false; var myGoogleProfile; $(document).ready(function() { trackViewProduct(pmaasProductId); $(document).ready(function() { checkExistingPushSubscription(pmaasProductId); }); for (i=0; i<featuresForFeedback.length; i++) { //getFeedbackUpdateVoteCounter(featuresForFeedback[i]); //getMyFeedbackUpdateButtonsAnonymous(featuresForFeedback[i]); } for (i=0; i<featuresBuilding.length; i++) { //getFeedbackUpdateVoteCounter(featuresBuilding[i]); //getMyFeedbackUpdateButtonsAnonymous(featuresBuilding[i]); } var featuresWithStats = featuresForFeedback.concat(featuresBuilding); getFeedbackUpdateVoteCounterMany(featuresWithStats); updateVotingButtons(featuresWithStats); }); // show the right tab if (window.location.hash) { //console.log('window.location.hash '+ window.location.hash); if (window.location.hash === '#about') { $('#about-tab').tab('show'); $('#about-tab').addClass('active'); updateDropdown('About'); } else if (window.location.hash === '#voting') { $('#voting-tab').tab('show'); $('#voting-tab').addClass('active'); updateDropdown('Voting'); } else if (window.location.hash === '#planned') { $('#planned-tab').tab('show'); $('#planned-tab').addClass('active'); updateDropdown('Outlook'); } else if (window.location.hash === '#changelog') { $('#changelog-tab').tab('show'); $('#changelog-tab').addClass('active'); updateDropdown('Available'); } else if (window.location.hash === '#docs') { $('#docs-tab').tab('show'); $('#docs-tab').addClass('active'); updateDropdown('Docs'); } else if (window.location.hash === '#request') { showDefaultTab(); // show feature request modal console.log('new feature request'); showRequestModal('Feature Request', 'Feature Request', false); } } else { showDefaultTab(); } function showDefaultTab() { // for empty hash show a tab if (featuresForFeedback && featuresForFeedback.length>0) { $('#voting-tab').tab('show'); $('#voting-tab').addClass('active'); updateDropdown('Voting'); } else if (featuresBuilding && featuresBuilding.length>0) { $('#planned-tab').tab('show'); $('#planned-tab').addClass('active'); updateDropdown('Outlook'); } else { $('#about-tab').tab('show'); $('#about-tab').addClass('active'); updateDropdown('About'); } } $('#myTab a').on('click', function (e) { //e.preventDefault() //$(this).tab('show') console.log('click() ' + $(this).attr('id') + ' for ' + $(this).html()); var html = $(this).html(); var id = $(this).attr('id'); var hash = id.replace('-tab', ''); window.location.hash = hash; updateDropdown(html); }); /* $('.navbar').affix({ offset:{ top: $('header').height() /* apply .affix at bottom of header } }) */ function updateDropdown(label) { $('#ptfc-dropdown-status').html(label); // show dropdown in case of all-empty listing if ($('#ptfc-nav-dropdown-menu .dropdown-item').length == 0) { console.error('nothing to show in nav dropdown, removing'); $('#ptfc-dropdown-status').remove();//hide(); } } function trackViewProduct(id) { if (window.location.href.toString().endsWith('preview') || window.location.href.toString().indexOf('preview#') != -1) { console.log('This is a preview, not tracking a view'); } else { var data = {}; data.id = id; $.ajax({ type: 'PUT', url: PATH_FEEDBACKWS_PUBLIC+'/trackViewProduct', contentType: 'application/json', data: JSON.stringify(data), success: function(data) { console.log('Tracked view'); }, error: function(request, status, error) { console.error('trackViewProduct: ' + error); } }); } } checkPushSubscription(pmaasProductId, pmaasProductName); function showRequestModal(requestText, requestType, isIssue) { if (!requestType || requestType.length==0) console.error('requestType is empty'); checkFeedbackLoginForType('request', function() { //if (!isLoggedInGoogle) { // hideAllTooltips(); // if (checkCookiesEnabled()) $('#pmaas-modal-googleSignIn').modal('show'); //} else { hideAllTooltips(); if (isIssue && isIssue == true) { $('#pmaas-modal-request-title-issue').show(); $('#pmaas-modal-request-title-request').hide(); } else { $('#pmaas-modal-request-title-issue').hide(); $('#pmaas-modal-request-title-request').show(); } $('#pmaas-modal-request-type').val(requestType); $('#pmaas-modal-request-typeText').text(requestText); $('#pmaas-modal-request').modal('show'); //$('.pmaas-myName').prop( "disabled", true); //$('.pmaas-myEmail').prop( "disabled", true); if (feedbackUserId) { $('.pmaas-myName').hide(); $('.pmaas-myEmail').hide(); } else { $('.pmaas-myName').show(); $('.pmaas-myEmail').show(); var myName = getCookie('feedback-myName'); var myEmail = getCookie('feedback-myEmail'); var disableInputs = getCookie("feedback-disableIDfields"); if (disableInputs && disableInputs==='on') { console.log('disabeling input fields for name & email'); $('#pmaas-myName').prop('disabled', true); $('#pmaas-myEmail').prop('disabled', true); } else { $('#pmaas-myName').prop('disabled', false); $('#pmaas-myEmail').prop('disabled', false); } $('#pmaas-myName').val( myName ); $('#pmaas-myEmail').val( myEmail ); } //} }); } function showRequestModalAnonymousOld() { hideAllTooltips(); $('#pmaas-modal-request').modal('show'); // show my data //$('.pmaas-myName').prop( "disabled", false); //$('.pmaas-myEmail').prop( "disabled", false); if (feedbackUserId) { $('.pmaas-myName').hide(); $('.pmaas-myEmail').hide(); } else { $('.pmaas-myName').show(); $('.pmaas-myEmail').show(); $('#pmaas-myName').val(myGoogleProfile.getName()); $('#pmaas-myEmail').val(myGoogleProfile.getEmail()); } } function saveRequestAndCloseModal() { console.error('saveRequestAndCloseModal()'); console.error('typeText: ' + $('#pmaas-modal-request-typeText').text() ); console.error('type: ' + $('#pmaas-modal-request-type').val() ); var $request = $('#pmaas-request').val().trim(); if (!$request || $request.length==0) { toast("Please describe your request"); return; } var $title = $('#pmaas-request-title').val().trim(); if (!$title || $title.length==0) { toast("Please provide a title"); return; } var type = 'request'; var $modalButtonSave = $('#pmaas-modal-button-save'); var feedback = {}; //if ($commentFeedbackId) // feedback.feedbackId = $commentFeedbackId; feedback.productId = pmaasProductId; /* if (myGoogleProfile) { feedback.googleId = myGoogleProfile.getId(); // TODO remove this when Google ID is verified via backend feedback.email = myGoogleProfile.getEmail(); feedback.givenName = myGoogleProfile.getGivenName(); feedback.name = myGoogleProfile.getName(); feedback.imageURL = myGoogleProfile.getImageUrl() } else { */ feedback.tempId = getCookie('tempId'); var $name = $('#pmaas-myName').val(); var $email = $('#pmaas-myEmail').val(); setCookie("feedback-myName", $name); setCookie("feedback-myEmail", $email); feedback.name = $name; feedback.email = $email; /*}*/ feedback.type = type; feedback.itemType = $('#pmaas-modal-request-type').val(); feedback.text = $request; feedback.title = $title; $.ajax({ type: 'POST', url: PATH_FEEDBACKWS_PRODUCT+'/createFeedback', contentType: 'application/json', data: JSON.stringify(feedback), success: function(data) { console.log(data); toast("Submitted: " + $title); $('#pmaas-button-'+type).removeClass('disabled'); $('#pmaas-button-'+type).addClass('active'); $('#pmaas-request-title').val(''); $('#pmaas-request').val(''); $('#pmaas-modal-request').modal('hide'); $modalButtonSave.text('Done'); }, error: function(request, status, error) { console.log(error); toast("Error: " + error); showFeedbackErrorModal(error); $('#pmaas-button-'+type).removeClass('disabled'); $modalButtonSave.text('Done'); } }); $('#pmaas-button-'+type).addClass('disabled'); $modalButtonSave.text('Sending...'); } function onSignIn(googleUser) { console.log('Google sign-in is active'); myGoogleProfile = googleUser.getBasicProfile(); //console.log('ID: ' + myGoogleProfile.getId()); // Do not send to your backend! Use an ID token instead. //console.log('Name: ' + myGoogleProfile.getName()); //console.log('Image URL: ' + myGoogleProfile.getImageUrl()); //console.log('Email: ' + myGoogleProfile.getEmail()); // This is null if the 'email' scope is not present. isLoggedInGoogle = true; $('#pmaas-modal-googleSignIn').modal('hide'); //for (i=0; i<featuresForFeedback.length; i++) // getMyFeedbackUpdateButtons(featuresForFeedback); //for (i=0; i<featuresBuilding.length; i++) // getMyFeedbackUpdateButtons(featuresBuilding); } function googleSignOut() { console.log('Google onSignOut()'); var auth2 = gapi.auth2.getAuthInstance(); auth2.signOut().then(function() { console.log('User signed out.'); isLoggedInGoogle = false; }); } function checkCookiesEnabled() { var cookieEnabled = navigator.cookieEnabled; if (!cookieEnabled){ document.cookie = "testcookie"; cookieEnabled = document.cookie.indexOf("testcookie")!=-1; } return cookieEnabled || showCookieFail(); } function showCookieFail() { alert('Please enable cookies to use Productific'); } </script> </html>

Pages: 1 2 3 4 5 6 7 8 9 10