Form Login V3.2 Encrypt content dan Hidden Content
what's New ?
- Profile appears only when logged in. [ New v3.1 ]
- Speed up login / register notifications. [ New v3.1 ]
- bug fixed [Content delay displayed] when logging in. [ New v3.1 ]
- Added hidden and show password. [ New v3.1 ]
- Remove button [button delete] in dasboard [ New v3.1 ]
- ExpRole Membership [New v3.2]
- Encrypt Content [ New v3.2 ]
- New Dasboard admin [ search user, search role, pagination dynamic, Generate date, Exprole Membership ] [ New v3.2 ]
- New 2 Role [ Staff, Μodder ] [ New v3.2 ]
- New Style form v2 [ New v3.2 (ongoing) ]
Dalam Update kali ini kebanyakan fokus perbaikan pada js dengan memasang fitur encrypt kontent dan Menambahkan banyak fitur juga pada dasboard admin
List Video Tutorial
Download Video Tutorial Buat Akun firebase
Download VideoStatus Versi: v3.2
Kusarankan setelah kalian edit jsnya, maka encrypt semua kode jsnya.
letakan js link firebase dan config ini di bawah <head>
ganti config firebase dengan punya kamu sendiri
<script src='https://www.gstatic.com/firebasejs/8.6.8/firebase-app.js'/>
<script src='https://www.gstatic.com/firebasejs/8.6.8/firebase-auth.js'/>
<script src='https://www.gstatic.com/firebasejs/8.6.8/firebase-firestore.js'/>
<script>/*<![CDATA[*/
const configformlogin={
apiKey: "AIzaSyCDUKoueS66e77qvqGbrc1Clb0eFJWi2JU",
authDomain: "formlogin-6e176.firebaseapp.com",
projectId: "formlogin-6e176",
storageBucket: "formlogin-6e176.appspot.com",
messagingSenderId: "197923569691",
appId: "1:197923569691:web:db39447bcd0f6d7bd6f8be"
};
/*]]>*/
</script>
step 2: css.
letakan ditempatnya yaitu didalam <b:skin> </b:skin>
.btn-close-profile,.cls{transition:.3s;outline:0}#register-favorite,.group label{color:var(--colom-input)}
.ProfileX h2,.form,.notifchapter,
div#Lognotif-pass,div#Lognotif-register,div#Lognotif-login{text-align:center}
:root{
--bg-form:#fff;
--color-text-form:#222;
--color-text-profile:#222;
--bg-btn-cls:#0074B1;
--c-btn-cls:#FFF;
--bg-colom-input:#f1f1f1;
--colom-input:#555;
--color-svg-input:#bbb;
--bar-bottom-color:#00BA47;
--br-bottom:#f1f1f1;
--bg-btn-fl:#00BA47;
--hover-bg-btn-fl:#1e90ff;
--c-btn-fl:#fff;
--size-font-input:14px;
--color-message-a:#00d449;
--sideBd-color:#ccc;
/*color Notif Lock Chapter*/
--text-notif:#f1f1f1;
--bgcolor-notif:#1e2129;
--color-textrole:#ffba0a;
/*Link Opsi Login / Register Header*/
--bgcolor-opsiprofile:#1e2129;
--textcolor-opsiprofile:#f1f1f1;
}
#fixedform{position:fixed;top:0;right:0;left:0;display:grid;place-items:center;z-index:9999;overflow:auto;max-height:100%;max-width:1080px}
.ProfileX,span.data-user{position:relative;padding:10px}
.ProfileX{display:flex;flex-direction:column;margin:20px;background:var(--bg-form);color:var(--color-text-profile);border-radius:15px;border:none}
#logoprofile svg{width:75px;height:75px}
#logoprofile{float:left;margin:auto auto 5px 15px;width:80px;height:80px;border-radius:50%}
.profile-content{display:flex;flex-direction:column;margin:15px;gap:15px}
span.data-user{border-radius:15px;border:2px solid #f1f1f1;margin:5px}
span.data-user span:first-child{position:absolute;top:-25px}
button#change-username-button{position:absolute;right:-15px;top:-15px}
.btn-close-profile{position:absolute;top:15px;right:15px;background-color:#0000;border:none;height:auto;border-radius:15px;margin:auto;padding:1px 3px}
.btn-opsi-delete,.btn-opsi-logout,
#Lognotif-login,#Lognotif-pass,#Lognotif-register{background:#fff;width:250px;height:auto;position:fixed;left:50%;transform:translateX(-50%);z-index:999}
.btn-opsi-profile{display:inline-flex;justify-content:space-between}
.btn-opsi-delete,.btn-opsi-logout{top:40%;border:2px solid #f1f1f1;border-radius:25px;padding:30px;gap:5px;flex-wrap:wrap}#box-btn-opsi-delete span,#btnlogout span{text-align:center;font-size:15px;margin:15px auto}.cls{background-color:var(--bg-btn-cls);border:none;height:auto;border-radius:15px;color:var(--c-btn-cls);margin:auto;padding:5px 10px;font-size:12px}.cls:hover{background-color:#00b4ff;cursor:pointer}.login-page{width:100%;padding:0;margin:auto}.boxbutton{display:inline-flex;flex-direction:row-reverse;justify-content:center;width:100%;gap:15px;padding:5px}
div#Lognotif-login,div#Lognotif-pass,div#Lognotif-register{padding:5px;border-radius:25px;top:50%;font-size:15px}
div#Lognotif-login .btn-fl,div#Lognotif-pass .btn-fl,div#Lognotif-register .btn-fl{outline:0;background:var(--bg-btn-fl);border-radius:25px;border:none;width:80px;padding:8px 0;color:var(--c-btn-fl);font-size:13px;cursor:pointer}
p.noted,p.noted-message{font-size:13px}
#login-form h3,#register-form h3{color:#222;margin-bottom:55px;margin-top:-15px}.icon-lock-pass{position:absolute;right:10px;top:8px}.form,.group{position:relative}.icon-lock-pass .showPas{width:24px;height:24px;fill:#bbb}.hidden,.hidden1,.form .register-fr,.form .reset-fr,.icon1.hidden,.icon2.hidden,.options li:first-child{display:none}.border-wrp{margin:10px auto;color:#b6b6b6;width:100%;font-size:14px;display:flex;justify-content:center}.border-bts{border-color:var(--sideBd-color);width:100px;border-top-style:solid;border-top-width:1px}.spanor{margin:-10px 10px 0;text-transform:uppercase;font-style:italic}
.form{z-index:1;
background:var(--bg-form);
color:var(--color-text-form);
max-width:300px;
margin:auto;
padding:35px;
box-shadow:rgba(0,0,0,.2) 0 2px 10px;
letter-spacing:1px;
border-radius:15px}
.form .message{margin:5px 0 0;color:#bbb;font-size:.85em}.form .message a{color:var(--color-message-a);text-decoration:none}.group{margin-bottom:35px}#register-favorite,.group input{font-size:var(--size-font-input);padding:13px 20px;border-radius:35px;background-color:var(--bg-colom-input);width:100%;border:none}#select-submenu .s-hidden{visibility:hidden;padding-right:10px}#select-submenu .select{cursor:pointer;display:inline-flex;position:relative;font-size:var(--size-font-input);margin-top:-12px;width:100%}#select-submenu .styledSelect{position:absolute;right:0;left:0;padding:8px;background-color:var(--bg-colom-input);border-radius:35px}#select-submenu .styledSelect:after{content:"";width:0;height:0;border:5px solid transparent;border-color:#000 transparent transparent;position:absolute;top:16px;right:25px}#select-submenu .styledSelect:before{content:url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="" d="M3.497 8.065L4.784 19h14.443l1.286-10.935l-4.01 2.673l-4.498-6.297l-4.498 6.297l-4.01-2.673ZM2.806 5.2L7.005 8l4.186-5.86a1 1 0 0 1 1.628-.001L17.005 8l4.2-2.799a1 1 0 0 1 1.547.95L21.11 20.116a1 1 0 0 1-.993.883H3.894a1 1 0 0 1-.993-.883L1.258 6.149A1 1 0 0 1 2.806 5.2Zm9.2 9.8a2 2 0 1 1-.001-4a2 2 0 0 1 0 4Z"/></svg>');position:absolute;top:6px;left:15px}#select-submenu .styledSelect.active,#select-submenu .styledSelect:active{background-color:#f1f1f1}.options{display:none;position:absolute;top:80%;right:0;left:0;z-index:999;margin:0;padding:15px;list-style:none;background-color:#fff;border-radius:25px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);-moz-box-shadow:0 1px 2px rgba(0,0,0,.2);box-shadow:0 1px 2px rgba(0,0,0,.2)}.btn-closeform,.form .btn-fl{outline:0;border-radius:15px;cursor:pointer}.options li{margin:5px 0;padding:3px 10px;border-radius:25px;background:#f1f1f1}.options li:hover{background-color:var(--bg-btn-fl);color:#fff}.group input:focus{outline:0}.group label{display:flex;font-size:var(--size-font-input);position:absolute;pointer-events:none;left:15px;top:10px;transition:.2s;-moz-transition:.2s;-webkit-transition:.2s;align-content:center}.group label svg{margin:auto 5px auto auto}.group input:focus~label,.group input:valid~label{left:0;top:-25px;font-size:14px}.bar{position:relative;display:block;width:100%}.bar:after,.bar:before{content:"";height:2px;width:0;bottom:-1px;position:absolute;background:var(--bar-bottom-color);transition:.2s;-moz-transition:.2s;-webkit-transition:.2s}.bar:before{left:45%}.bar:after{right:45%}.group input:focus~.bar:after,.group input:focus~.bar:before{width:50%}.btn-closeform{position:absolute;top:15px;right:20px;background:#0000;border:none;padding:0;font-size:14px}.btn-closeform svg{width:30px;height:30px}.form .btn-fl{background:var(--bg-btn-fl);border:none;width:150px;padding:8px 0;color:var(--c-btn-fl);font-size:15px;box-shadow:rgba(0,0,0,.16) 0 2px 5px,rgba(0,0,0,.12) 0 2px 10px}.form button:active,.form button:focus,.form button:hover{background:var(--hover-bg-btn-fl);box-shadow:rgba(0,0,0,.1) 0 1px 3px,rgba(0,0,0,.1) 0 1px 5px}
.notifchapter{padding:10px;margin:auto 10px;background:var(--bgcolor-notif);color:var(--text-notif);z-index:99;border-radius:15px}
.notifchrole{display:flex;flex-direction:column}.rolenotif{margin-top:20px;font-size:16px;font-weight:700}.rolenotif p{color:var(--color-textrole)}.dropdown-opsi{position:relative;display:inline-block;float:right;margin-right:5px}.dropdown-btn-opsi{content:"";border:none}.dropdown-btn-opsi:after{content:url('data:image/svg+xml,%3Csvg xmlns="http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg" width="16" height="16" viewBox="0 0 16 16"%3E%3Cg fill="white"%3E%3Cpath d="M11 6a3 3 0 1 1-6 0a3 3 0 0 1 6 0z"%2F%3E%3Cpath fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E');}
.dropdown-content-opsi{display:none;position:absolute;right:0;margin-top:12px;direction:rtl;background-color:var(--bgcolor-opsiprofile);min-width:150px;border-radius:15px;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:9991}
.dropdown-item-opsi{padding:12px 16px;text-decoration:none;display:flex;gap:5px;color:var(--textcolor-opsiprofile);border:none;background:#0000;}
.dropdown-item-opsi:hover{background:#222;color:#fff;border-radius:15px}.show-opsi{display:block}
/*css Button menu Profile zv5*/
.menu-login {
display: flex;
place-content: center;
align-items: center;
color: white;
background-color: rgba(0,0,0,.4);
padding: 4px 10px;
border-radius: 5px;
}
@media (max-width: 900px) {
.menu-login {
width: 35px;
height: 35px;
overflow: hidden;}
}
.menu-login:hover {filter: hue-rotate(100deg);}
step 3:Button Profile.
cari BlogSearch1 > lalu cari <b:include name='darkMode'/> setelah ditemukan letakan kode button profile ini dibawahnya <b:include name='darkMode'/>
<!--Menu Login/Register--> <div class='dropdown-opsi'>
<button class='dropdown-btn-opsi menu-login'>
<span class='sm:dn'>Login</span></button>
<div class='dropdown-content-opsi'>
<button class='dropdown-item-opsi' disabled='disabled' id='profiletab-button' onclick='document.getElementById("contentx").style.display="flex";' type='button'><svg height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='M12 4a8 8 0 0 0-6.96 11.947A4.99 4.99 0 0 1 9 14h6a4.99 4.99 0 0 1 3.96 1.947A8 8 0 0 0 12 4Zm7.943 14.076A9.959 9.959 0 0 0 22 12c0-5.523-4.477-10-10-10S2 6.477 2 12a9.958 9.958 0 0 0 2.057 6.076l-.005.018l.355.413A9.98 9.98 0 0 0 12 22a9.947 9.947 0 0 0 5.675-1.765a10.055 10.055 0 0 0 1.918-1.728l.355-.413l-.005-.018ZM12 6a3 3 0 1 0 0 6a3 3 0 0 0 0-6Z' fill='currentColor' fill-rule='evenodd'/></svg>Profile</button>
<button class='dropdown-item-opsi' onclick='document.getElementById("login-register-form").style.display="";'><svg height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M4 22q-.825 0-1.413-.588T2 20V9q0-.825.588-1.413T4 7h5V4q0-.825.588-1.413T11 2h2q.825 0 1.413.588T15 4v3h5q.825 0 1.413.588T22 9v11q0 .825-.588 1.413T20 22H4Zm0-2h16V9h-5q0 .825-.588 1.413T13 11h-2q-.825 0-1.413-.588T9 9H4v11Zm2-2h6v-.45q0-.425-.238-.788T11.1 16.2q-.5-.225-1.012-.338T9 15.75q-.575 0-1.088.113T6.9 16.2q-.425.2-.663.563T6 17.55V18Zm8-1.5h4V15h-4v1.5ZM9 15q.625 0 1.063-.438T10.5 13.5q0-.625-.438-1.063T9 12q-.625 0-1.063.438T7.5 13.5q0 .625.438 1.063T9 15Zm5-1.5h4V12h-4v1.5ZM11 9h2V4h-2v5Zm1 5.5Z' fill='currentColor'/></svg>Login/Register</button>
</div>
</div>
<script>
/*<![CDATA[*/
const dropdownButton = document.querySelector('.dropdown-btn-opsi');
const dropdownContent = document.querySelector('.dropdown-content-opsi'); dropdownButton.addEventListener('click', () => { dropdownContent.classList.toggle('show-opsi');
});
window.addEventListener('click', (event) => {
if (!event.target.matches('.dropdown-btn-opsi')) {
if (dropdownContent.classList.contains('show-opsi')) {
dropdownContent.classList.remove('show-opsi');
}
}
});
/*]]>*/
</script>
<!--Menu Login/Register-->
step 4: kode form.
letakan kode ini diatas </head>. jika masih bingung maka cari saja kode ini <b:includable id='inlineAd2'> dan letakan diatasnya
<b:includable id='frm'>
<div id='fixedform'>
<!-- Form Profile -->
<div class='ProfileX' id='contentx' style='display:none;'>
<h2>Profile</h2>
<span id='logoprofile'>
<svg fill='%23bbb' height='45' viewBox='0 0 24 24' width='45' xmlns='http://www.w3.org/2000/svg'><path d='M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z'/></svg>
</span>
<button class='btn-close-profile' id='close-profile' onclick='document.getElementById("contentx").style.display="none";'><svg height='20' viewBox='0 0 24 24' width='20' xmlns='http://www.w3.org/2000/svg'><path d='m14.5 9.5l-5 5m0-5l5 5M7 3.338A9.954 9.954 0 0 1 12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12c0-1.821.487-3.53 1.338-5' fill='none' stroke='currentColor' stroke-linecap='round' stroke-width='1.5'/></svg></button>
<div class='profile-content'>
<span class='data-user'>
<span>Uid:</span>
<span id='profile-uid'/>
</span>
<span class='data-user'>
<span>Username:</span>
<span id='profile-username'/>
<button class='cls' id='change-username-button'><svg height='20' viewBox='0 0 32 32' width='20' xmlns='http://www.w3.org/2000/svg'><path d='M13 3c-3.855 0-7 3.145-7 7c0 2.41 1.23 4.55 3.094 5.813C5.527 17.343 3 20.883 3 25h2c0-4.43 3.57-8 8-8c2.145 0 4.063.879 5.5 2.25l-4.719 4.719l-.062.312l-.688 3.532l-.312 1.468l1.469-.312l3.53-.688l.313-.062l10.094-10.094c1.16-1.16 1.16-3.09 0-4.25a3.018 3.018 0 0 0-4.219-.031l-3.968 3.969a10.103 10.103 0 0 0-3.032-2A7.024 7.024 0 0 0 20 10c0-3.855-3.145-7-7-7zm0 2c2.773 0 5 2.227 5 5s-2.227 5-5 5s-5-2.227-5-5s2.227-5 5-5zm13 10c.254 0 .52.082.719.281a.977.977 0 0 1 0 1.406l-9.688 9.688l-1.781.375l.375-1.781l9.688-9.688A.934.934 0 0 1 26 15z' fill='currentColor'/></svg></button>
</span>
<span class='data-user'>
<span>Email:</span>
<span id='profile-email'/>
</span>
<span class='data-user'>
<span>Role:</span>
<span id='profile-role'/>
</span>
<span class='data-user'>
<span>Exp Member:</span>
<span id='exp-role'/>
</span>
<div class='btn-opsi-profile'>
<button class='cls' onclick='document.querySelector('#delete-account-button').style.display='block'; document.querySelector('#box-btn-opsi-delete').style.display='flex'; document.querySelector('#cancel-delete-account').style.display='block''>Delete Account?</button> <div class='btn-opsi-delete' id='box-btn-opsi-delete' style='display:none'><span>Apakah Kamu yakin Ingin menghapus Akun Milik kamu?, Data yang sudah dihapus tidak bisa dikembalikan lagi.. tolong ingat itu!! </span>
<button class='cls' id='delete-account-button'>Yes! Delete MyAccount</button>
<button class='cls' id='cancel-delete-account' onclick='document.querySelector('#delete-account-button').style.display='none'; document.querySelector('#box-btn-opsi-delete').style.display='none'; document.querySelector('#cancel-delete-account').style.display='none'' style='display:none'>Cancel</button>
</div>
<button class='cls lmg' onclick='document.getElementById('btnlogout').style.display='flex''>logout?</button>
<div class='btn-opsi-logout' id='btnlogout' style='display:none'>
<span>Apakah Kamu yakin Ingin Log Out dari Akun Milik kamu?</span>
<button class='cls hidden' id='logout-button'>Yes!</button>
<button class='cls lmg2' onclick='document.getElementById('btnlogout').style.display='none''>Cancel!</button>
</div>
</div>
<!--div btn-opsi-profile -->
</div>
</div>
<!--Form Container -->
<div class='login-page fr-close' id='login-register-form' style='display:none'>
<div class='form'>
<button class='btn-closeform' onclick='document.getElementById('login-register-form').style.display='none''><svg height='34' viewBox='0 0 24 24' width='34' xmlns='http://www.w3.org/2000/svg'><path d='m14.5 9.5l-5 5m0-5l5 5M7 3.338A9.954 9.954 0 0 1 12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12c0-1.821.487-3.53 1.338-5' fill='none' stroke='currentColor' stroke-linecap='round' stroke-width='1.5'/></svg></button>
<!-- Form Login -->
<form class='login-fl' id='login-form'>
<h3>Welcome Back!</h3>
<div class='group icon-email'>
<input class='frinput' id='login-email' required='required' type='email'/>
<span class='bar'/>
<label><svg fill='var(--color-svg-input)' height='25' viewBox='0 0 24 24' width='25' xmlns='http://www.w3.org/2000/svg'><path d='M20,8L12,13L4,8V6L12,11L20,6M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z'/></svg>Email</label>
</div>
<div class='group icon-pas'>
<input class='frinput' id='login-password' required='required' type='password'/>
<span class='bar'/>
<label><svg fill='var(--color-svg-input)' height='25' viewBox='0 0 24 24' width='25' xmlns='http://www.w3.org/2000/svg'><path d='M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z'/></svg>Password</label>
<span class='icon-lock-pass' id='showpass'>
<svg class='showPas icon1' viewBox='0 0 24 24'><path d='M11.83,9L15,12.16C15,12.11 15,12.05 15,12A3,3 0 0,0 12,9C11.94,9 11.89,9 11.83,9M7.53,9.8L9.08,11.35C9.03,11.56 9,11.77 9,12A3,3 0 0,0 12,15C12.22,15 12.44,14.97 12.65,14.92L14.2,16.47C13.53,16.8 12.79,17 12,17A5,5 0 0,1 7,12C7,11.21 7.2,10.47 7.53,9.8M2,4.27L4.28,6.55L4.73,7C3.08,8.3 1.78,10 1,12C2.73,16.39 7,19.5 12,19.5C13.55,19.5 15.03,19.2 16.38,18.66L16.81,19.08L19.73,22L21,20.73L3.27,3M12,7A5,5 0 0,1 17,12C17,12.64 16.87,13.26 16.64,13.82L19.57,16.75C21.07,15.5 22.27,13.86 23,12C21.27,7.61 17,4.5 12,4.5C10.6,4.5 9.26,4.75 8,5.2L10.17,7.35C10.74,7.13 11.35,7 12,7Z' fill='var(--color-svg-input)'/></svg>
<svg class='showPas icon2 hidden' viewBox='0 0 24 24'>
<path d='M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z' fill='var(--color-svg-input)'/></svg>
</span>
</div>
<div class='boxbutton'>
<button class='btn-fl' type='submit'>login</button>
</div>
<p class='message'>
<a class='reoverPassword'>Forgot Password?</a>
</p>
<div class='border-wrp'>
<div class='border-bts'/>
<span class='spanor'>or</span>
<div class='border-bts'/>
</div>
<p class='message'>New User?
<a class='createAccount'>Register</a>
</p>
</form>
<!-- Form Register -->
<form class='register-fr' id='register-form'>
<h3>Create Account</h3>
<div class='group icon-email'>
<input class='frinput' id='register-email' required='required' type='email'/>
<span class='bar'/>
<label><svg fill='#bbb' height='25' viewBox='0 0 24 24' width='25' xmlns='http://www.w3.org/2000/svg'><path d='M20,8L12,13L4,8V6L12,11L20,6M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z'/></svg>Email</label>
</div>
<div class='group'>
<input class='frinput' id='register-username' required='required' type='text'/>
<span class='bar'/>
<label><svg fill='var(--color-svg-input)' height='25' viewBox='0 0 24 24' width='25' xmlns='http://www.w3.org/2000/svg'><path d='M12,4A4,4 0 0,1 16,8A4,4 0 0,1 12,12A4,4 0 0,1 8,8A4,4 0 0,1 12,4M12,14C16.42,14 20,15.79 20,18V20H4V18C4,15.79 7.58,14 12,14Z'/></svg>Username</label>
</div>
<div class='group icon-pas'>
<input class='frinput' id='register-password' required='required' type='password'/>
<span class='bar'/>
<label><svg fill='var(--color-svg-input)' height='25' viewBox='0 0 24 24' width='25' xmlns='http://www.w3.org/2000/svg'><path d='M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z'/></svg>Password</label>
<span class='icon-lock-pass' id='showpass2'>
<svg class='showPas icon3' viewBox='0 0 24 24'><path d='M11.83,9L15,12.16C15,12.11 15,12.05 15,12A3,3 0 0,0 12,9C11.94,9 11.89,9 11.83,9M7.53,9.8L9.08,11.35C9.03,11.56 9,11.77 9,12A3,3 0 0,0 12,15C12.22,15 12.44,14.97 12.65,14.92L14.2,16.47C13.53,16.8 12.79,17 12,17A5,5 0 0,1 7,12C7,11.21 7.2,10.47 7.53,9.8M2,4.27L4.28,6.55L4.73,7C3.08,8.3 1.78,10 1,12C2.73,16.39 7,19.5 12,19.5C13.55,19.5 15.03,19.2 16.38,18.66L16.81,19.08L19.73,22L21,20.73L3.27,3M12,7A5,5 0 0,1 17,12C17,12.64 16.87,13.26 16.64,13.82L19.57,16.75C21.07,15.5 22.27,13.86 23,12C21.27,7.61 17,4.5 12,4.5C10.6,4.5 9.26,4.75 8,5.2L10.17,7.35C10.74,7.13 11.35,7 12,7Z' fill='var(--color-svg-input)'/></svg>
<svg class='showPas icon4 hidden' viewBox='0 0 24 24'>
<path d='M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z' fill='var(--color-svg-input)'/></svg>
</span>
</div>
<div class='group' id='select-submenu'>
<select id='register-favorite' name='register-favorite'>
<option disabled='' selected='' value=''>Reader</option>
<option value='Manga'>Manga</option><option value='Manghua'>Manghua</option>
<option value='Manghwa'>Manghwa</option><option value='Light Novel JP'>Light Novel JP</option>
<option value='Web Novel jp'>Web Novel JP</option>
<option value='Web Novel KR'>Web Novel KR</option>
<option value='Web Novel CN'>Web Novel CN</option>
</select>
<span class='bar'/>
<label/>
</div>
<button class='btn-fl' type='submit'>REGISTER</button>
<p class='message'>Already have an account?<a class='signIn'>Log in here</a></p>
<p class='noted-message'>Your e-mail must be the same as the one you're using in your Ko-Fi or Patreon account.</p>
</form>
<!-- Form Resert Password-->
<form class='reset-fr' id='reset-password-form'>
<p class='noted'>Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.</p>
<div class='group'>
<input class='frinput' id='reset-password-email' required='required' type='email'/>
<span class='bar'/>
<label><svg fill='var(--color-svg-input)' height='25' viewBox='0 0 24 24' width='25' xmlns='http://www.w3.org/2000/svg'><path d='M20,8L12,13L4,8V6L12,11L20,6M20,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V6C22,4.89 21.1,4 20,4Z'/></svg>Email</label>
</div>
<button class='btn-fl' type='submit'>Reset password</button>
<p class='message'>Back to <a class='backToLogin'>Log in here</a></p>
</form>
</div>
</div>
<!--Notif Log-->
<div class='notiflog hidden' id='Lognotif-login'>
<span><p id='login-message'/></span>
<div class='notifbtn'>
<button class='btn-fl' id='closetab-button' onclick='loghidden()'>Close</button>
</div>
</div>
<div class='notiflog hidden' id='Lognotif-register'>
<span><p id='register-message'/></span>
<div class='notifbtn'>
<button class='btn-fl' id='closetab-button' onclick='loghidden()'>Close</button>
</div>
</div>
<div class='notiflog hidden' id='Lognotif-pass'>
<span><p id='reset-password-message'/></span>
<div class='notifbtn'>
<button class='btn-fl' id='closetab-button' onclick='loghidden()'>Close</button>
</div>
</div>
</div>
<script defer='defer'>
/*<![CDATA[*/
/*==== Js For Show And hidden Password by hirutshuji ====*/
function showpasslogin(){document.querySelector("#login-password").setAttribute("type","text"),document.querySelector(".icon1").classList.add("hidden"),document.querySelector(".icon2").classList.remove("hidden")}function hidepasslogin(){document.querySelector("#login-password").setAttribute("type","password"),document.querySelector(".icon1").classList.remove("hidden"),document.querySelector(".icon2").classList.add("hidden")}function showpassregister(){document.querySelector("#register-password").setAttribute("type","text"),document.querySelector(".icon3").classList.add("hidden"),document.querySelector(".icon4").classList.remove("hidden")}function hidepassregister(){document.querySelector("#register-password").setAttribute("type","password"),document.querySelector(".icon3").classList.remove("hidden"),document.querySelector(".icon4").classList.add("hidden")}var pwShownLogin=0;document.getElementById("showpass").addEventListener("click",function(){0==pwShownLogin?(pwShownLogin=1,showpasslogin()):(pwShownLogin=0,hidepasslogin())},!1);var pwShownRegister=0;document.getElementById("showpass2").addEventListener("click",function(){0==pwShownRegister?(pwShownRegister=1,showpassregister()):(pwShownRegister=0,hidepassregister())},!1);
/*]]>*/
</script>
<script defer='defer'>
/*<![CDATA[*/
$(".message a.signIn,.message a.createAccount").on("click",function(){$(".register-fr,.login-fl").animate({height:"toggle",opacity:"toggle"},"slow")}),$(".reoverPassword,.backToLogin").on("click",function(){$(".reset-fr,.login-fl").animate({height:"toggle",opacity:"toggle"},"slow")}),$("#register-favorite").each(function(){var e=$(this),t=$(this).children("option").length;e.addClass("s-hidden"),e.wrap('<div class="select"></div>'),e.after('<div class="styledSelect"></div>');var i=e.next("div.styledSelect");i.text(e.children("option").eq(0).text());for(var o=$("<ul />",{class:"options"}).insertAfter(i),l=0;l<t;l++)$("<li />",{text:e.children("option").eq(l).text(),rel:e.children("option").eq(l).val()}).appendTo(o);var n=o.children("li");i.click(function(e){e.stopPropagation(),$("div.styledSelect.active").each(function(){$(this).removeClass("active").next("ul.options").hide()}),$(this).toggleClass("active").next("ul.options").toggle()}),n.click(function(t){t.stopPropagation(),i.text($(this).text()).removeClass("active"),e.val($(this).attr("rel")),o.hide()}),$(document).click(function(){i.removeClass("active"),o.hide()})});
/*]]>*/
</script>
</b:includable>
<b:includable id='jsfrm'>
<script>/*<![CDATA[*/
/*====jsfrm v3.2 [selesai] by hirutshuji====*/
const firebaseConfigform=configformlogin;firebase.initializeApp(firebaseConfigform);const auth=firebase.auth(),db=firebase.firestore(),loginRegisterForm=document.querySelector("#login-register-form"),loginForm=document.querySelector("#login-form"),registerForm=document.querySelector("#register-form"),resetPasswordForm=document.querySelector("#reset-password-form"),loginEmail=document.querySelector("#login-email"),loginPassword=document.querySelector("#login-password"),loginMessage=document.querySelector("#login-message"),registerEmail=document.querySelector("#register-email"),registerUsername=document.querySelector("#register-username"),registerPassword=document.querySelector("#register-password"),registerFavorite=document.querySelector("#register-favorite"),registerMessage=document.querySelector("#register-message"),resetPasswordEmail=document.querySelector("#reset-password-email"),resetPasswordMessage=document.querySelector("#reset-password-message"),contentProfile=document.querySelector("#contentx"),profileUid=document.querySelector("#profile-uid"),profileEmail=document.querySelector("#profile-email"),profileUsername=document.querySelector("#profile-username"),profileRole=document.querySelector("#profile-role"),expRoleuser=document.querySelector("#exp-role"),logoutButton=document.querySelector("#logout-button"),LognotifLogin=document.querySelector("#Lognotif-login"),LognotifRegister=document.querySelector("#Lognotif-register"),LognotifResetpass=document.querySelector("#Lognotif-pass");function showContent(){contentProfile.classList.remove("hidden"),logoutButton.classList.remove("hidden"),removeDisabled()}function hideContent(){contentProfile.classList.add("hidden"),logoutButton.classList.add("hidden")}function loghidden(){LognotifLogin.classList.add("hidden"),LognotifRegister.classList.add("hidden"),LognotifResetpass.classList.add("hidden")}function removeDisabled(){document.getElementById("profiletab-button").removeAttribute("disabled")}const changeUsernameButton=document.querySelector("#change-username-button");changeUsernameButton.addEventListener("click",()=>{let e=prompt("Masukkan Username baru Anda:");if(null!==e){let t=auth.currentUser;db.collection("users").doc(t.uid).update({username:e}).then(()=>{profileUsername.textContent=e,alert("Username berhasil diubah.")}).catch(e=>{alert("Gagal mengubah Username: "+e.message)})}});const deleteAccountButton=document.querySelector("#delete-account-button");function showProfile(e){db.collection("users").doc(e).get().then(t=>{if(t.exists){let s=t.data();profileUid.textContent=e,profileEmail.textContent=s.email,profileUsername.textContent=s.username,profileRole.textContent=s.role,expRoleuser.textContent=s.exp}else console.log("Data User tidak ditemukan!")}).catch(e=>{console.log("Gagal Mengambil data User:",e)})}deleteAccountButton.addEventListener("click",()=>{let e=prompt("Masukkan kata sandi Anda untuk mengonfirmasi penghapusan akun, akun yang sudah dihapus tidak bisa dikembalikan:");if(null!==e){let t=auth.currentUser,s=firebase.auth.EmailAuthProvider.credential(t.email,e);t.reauthenticateWithCredential(s).then(()=>{db.collection("users").doc(t.uid).delete().then(()=>{t.delete().then(()=>{setTimeout(function(){alert("Account successfully deleted."),location.reload()},0)})}).catch(e=>{alert("Gagal menghapus akun: "+e.message)})}).catch(e=>{alert("Autentikasi gagal. Mohon periksa kata sandi Anda.")})}}),loginForm.addEventListener("submit",e=>{e.preventDefault();let t=loginEmail.value,s=loginPassword.value;auth.signInWithEmailAndPassword(t,s).then(e=>{let t=e.user;t.emailVerified?(LognotifLogin.classList.remove("hidden"),loginMessage.textContent="Login berhasil!",loginMessage.style.color="green",db.collection("users").doc(t.uid).update({emailVerified:!0}),setTimeout(function(){alert("Welcome Back!"),location.reload()},1e3)):(LognotifLogin.classList.remove("hidden"),loginMessage.textContent="Harap verifikasi email Anda sebelum login.",loginMessage.style.color="red")}).catch(e=>{LognotifLogin.classList.remove("hidden"),loginMessage.textContent="Login failed. "+e.message,loginMessage.style.color="red"})}),registerForm.addEventListener("submit",e=>{e.preventDefault();let t=registerEmail.value,s=registerUsername.value,r=registerPassword.value,o=registerFavorite.value,i=new Date;function a(e){return e.toLocaleDateString("id-ID",{timeZone:"Asia/Jakarta",day:"2-digit",month:"2-digit",year:"numeric",timeZoneName:"short"})}i.setSeconds(i.getSeconds()+10),auth.createUserWithEmailAndPassword(t,r).then(e=>{let n=e.user;return n.sendEmailVerification(),db.collection("users").doc(n.uid).set({email:t,username:s,password:r,favorite:o,role:"User",exp:a(i),emailVerified:!1})}).then(()=>{LognotifRegister.classList.remove("hidden"),registerMessage.textContent="Registrasi berhasil! Silakan periksa email Anda untuk memverifikasi akun Anda.",registerMessage.style.color="green",setTimeout(function(){alert("Pastikan verifikasi terlebih dahulu sebelum Login, dan data Anda hanya bisa dihapus di Tempat Profile."),location.reload(),auth.signOut()},1e3)}).catch(e=>{LognotifRegister.classList.remove("hidden"),registerMessage.textContent="Registration failed. "+e.message,registerMessage.style.color="red"})}),resetPasswordForm.addEventListener("submit",e=>{e.preventDefault();let t=resetPasswordEmail.value;auth.sendPasswordResetEmail(t).then(()=>{LognotifResetpass.classList.remove("hidden"),resetPasswordMessage.textContent="Password reset email sent. Please check your email to reset your password.",resetPasswordMessage.style.color="green"}).catch(e=>{LognotifResetpass.classList.remove("hidden"),resetPasswordMessage.textContent="Failed to send password reset email. "+e.message,resetPasswordMessage.style.color="red"})}),logoutButton.addEventListener("click",()=>{auth.signOut(),document.querySelector(".lmg").classList.add("hidden"),document.querySelector(".lmg2").classList.add("hidden"),location.reload()}),auth.onAuthStateChanged(e=>{e&&e.emailVerified?(showContent(),showProfile(e.uid),checkUserRole(e.uid)):hideContent()});
/*]]>*/
</script>
</b:includable>
<b:includable id='jsfrmcheck'>
<script>
/*<![CDATA[*/
/*==== jsfrmcheck v3.2 [selesai] by hirutshuji ====*/
function checkMembershipExp(){let e=document.getElementById("profile-uid"),r=document.querySelector("#exp-role");if(e&&r){let t=e.textContent,l=r.textContent.trim(),i=l.split(", ");if(2===i.length){let o=i[0];i[1];let n=o.split("/");if(3===n.length){let a=parseInt(n[0],10),s=parseInt(n[1],10)-1,d=parseInt(n[2],10),m=new Date(d,s,a);if(!isNaN(m.getTime())){let c=new Date;(c==m||c>=m||c>m)&&db.collection("users").doc(t).update({role:"User",exp:"Belum berlanggan Membership"}).then(()=>{alert("Membership dengan Role 'Member' Kamu telah habis karena itu Kami akan merubah kembali Role kamu ke 'User', silahkan Perpanjang jika ingin tetap Dengan Role Member.Semoga Harimu menyenangkan"),location.reload()}).catch(e=>{console.error("Gagal mengubah peran pengguna:",e)})}}}}}function checkUserRole(e){db.collection("users").doc(e).onSnapshot(e=>{if(e.exists){let r=e.data().role,t=document.querySelectorAll(".notifchapter"),l=document.querySelectorAll(".admin"),i=document.querySelectorAll(".member"),o=document.querySelectorAll(".modder"),n=document.querySelectorAll(".staff"),a=document.querySelectorAll(".guest"),s=document.querySelector(".rolenotif p").innerText;setTimeout(()=>{s===r||s!==r?t.forEach(e=>{e.classList.add("hidden")}):t.forEach(e=>{e.classList.remove("hidden")})},5e3),"Admin"===r?(l[0].classList.remove("admin","member","staff","modder","guest","hidden","hidden1"),checkMembershipExp(),unlockAdmin(),unlockModder(),unlockStaff(),unlockMember(),unlockUser(),console.log("Role Admin")):"Modder"===r?(o[0].classList.remove("modder","member","staff","guest","hidden","hidden1"),checkMembershipExp(),unlockModder(),unlockStaff(),unlockMember(),unlockUser(),console.log("Role Moddertor")):"Staff"===r?(n[0].classList.remove("staff","member","modder","guest","hidden","hidden1"),checkMembershipExp(),unlockModder(),unlockStaff(),unlockMember(),unlockUser(),console.log("Role Staff")):"Member"===r?(i[0].classList.remove("member","guest","hidden","hidden1"),checkMembershipExp(),unlockMember(),unlockUser(),console.log("Role Member")):"User"===r&&(a[0].classList.remove("guest","hidden"),checkMembershipExp(),unlockUser(),console.log("Role User"))}})}auth.onAuthStateChanged(e=>{e&&e.emailVerified?(showContent(),showProfile(e.uid),checkUserRole(e.uid)):hideContent()});
/*]]>*/</script>
</b:includable>
step 5:pemanggil kode form dan js utama.
Cari <body> dan letakan kode ini dibawahnya
<b:include name='frm'/>
<b:include name='jsfrm'/>
step 6:Pasang Form ke Chapter
Cari kode ini <div class='check-box'> <data:post.body/> </div> Didalam id='postChapter' Manga
Sudah ketemu ?.. jika sudah,maka kurung kode itu dengan kode dibawah ini
Perhatikan Tanda merah dalam kode ini,Seperti itulah cara kurungnya
<b:if cond='data:post.labels any (l => l.name == "Admin" || l.name == "User" || l.name == "Member" || l.name == "Modder" || l.name == "Staff")'>
<div class='notifchapter' id='notifchapterwrn'>
<div class='notifchrole'>
<h2>Chapter Terkunci</h2>
<span>Chapter Ini terkunci, Silahkan login terlebih dahulu Sesuai Role</span>
<b:if cond='data:post.labels any (l => l.name == "Admin")'>
<span class='rolenotif'>Unlock with Role: <p class='m-0 tac fs-20'>Admin</p></span>
<b:else/>
<b:if cond='data:post.labels any (l => l.name == "Modder")'>
<span class='rolenotif'>Unlock with Role: <p class='m-0 tac fs-20'>Modder</p></span>
<b:else/>
<b:if cond='data:post.labels any (l => l.name == "Staff")'>
<span class='rolenotif'>Unlock with Role: <p class='m-0 tac fs-20'>Staff</p></span>
<b:else/>
<b:if cond='data:post.labels any (l => l.name == "Member")'>
<span class='rolenotif'>Unlock with Role: <p class='m-0 tac c-ddd fs-20'>Member</p></span>
<b:else/>
<b:if cond='data:post.labels any (l => l.name == "User")'>
<span class='rolenotif'>Unlock with Role: <p class='m-0 tac c-ddd fs-20'>User</p></span>
</b:if>
</b:if>
</b:if>
</b:if>
</b:if>
</div>
</div>
</b:if>
<b:if cond='data:post.labels any (l => l.name == "Admin")'>
<script async='async'>/*<![CDATA[*/
function wrapDivs() {
var divs = document.getElementsByClassName('check-lck');
for (var i = 0; i < divs.length; i++) {
var div = divs[i];
var newDiv = document.createElement('div');
newDiv.className = 'premiumKTAdmin hidden1 admin';
div.parentNode.insertBefore(newDiv, div);
newDiv.appendChild(div);
}
const premiumSckAdmin = document.querySelectorAll('.premiumKTAdmin');
premiumSckAdmin.forEach(premiumCDAdmin => {
const isiKontenAdmin = premiumCDAdmin.innerHTML.trim();
const teksTerenkripsiAdmin = encryptKontentAdmin(isiKontenAdmin);
premiumCDAdmin.setAttribute('data-text', teksTerenkripsiAdmin);
premiumCDAdmin.innerHTML = '';
});
}
document.addEventListener('DOMContentLoaded', wrapDivs);
/*]]>*/</script>
<b:else/>
<b:if cond='data:post.labels any (l => l.name == "Staff")'>
<script async='async'>/*<![CDATA[*/
function wrapDivs() {
var divs = document.getElementsByClassName('check-lck');
for (var i = 0; i < divs.length; i++) { var div = divs[i];
var newDiv = document.createElement('div');
newDiv.className = 'premiumKTStaff staff modder admin hidden1';
div.parentNode.insertBefore(newDiv, div);
newDiv.appendChild(div);
}
const premiumSckStaff = document.querySelectorAll('.premiumKTStaff');
premiumSckStaff.forEach(premiumCDStaff => {
const isiKontenStaff = premiumCDStaff.innerHTML.trim();
const teksTerenkripsiStaff = encryptKontentStaff(isiKontenStaff);
premiumCDStaff.setAttribute('data-text', teksTerenkripsiStaff);
premiumCDStaff.innerHTML = '';
});
}
document.addEventListener('DOMContentLoaded', wrapDivs);
/*]]>*/</script>
<b:else/>
<b:if cond='data:post.labels any (l => l.name == "Modder")'>
<script async='async'>/*<![CDATA[*/
function wrapDivs() {
var divs = document.getElementsByClassName('check-lck');
for (var i = 0; i < divs.length; i++) { var div = divs[i];
var newDiv = document.createElement('div');
newDiv.className = 'premiumKTModder modder staff admin hidden1';
div.parentNode.insertBefore(newDiv, div);
newDiv.appendChild(div);
}
const premiumSckModder = document.querySelectorAll('.premiumKTModder');
premiumSckModder.forEach(premiumCDModder => {
const isiKontenModder = premiumCDModder.innerHTML.trim();
const teksTerenkripsiModder = encryptKontentModder(isiKontenModder);
premiumCDModder.setAttribute('data-text', teksTerenkripsiModder);
premiumCDModder.innerHTML = '';
});
}
document.addEventListener('DOMContentLoaded', wrapDivs);
/*]]>*/</script>
<b:else/>
<b:if cond='data:post.labels any (l => l.name == "Member")'>
<script async='async'>/*<![CDATA[*/
function wrapDivs() {
var divs = document.getElementsByClassName('check-lck');
for (var i = 0; i < divs.length; i++) { var div = divs[i];
var newDiv = document.createElement('div');
newDiv.className = 'premiumKTMember member admin staff modder hidden1';
div.parentNode.insertBefore(newDiv, div);
newDiv.appendChild(div);
}
const premiumSckMember = document.querySelectorAll('.premiumKTMember');
premiumSckMember.forEach(premiumCDMember => {
const isiKontenMember = premiumCDMember.innerHTML.trim();
const teksTerenkripsiMember = encryptKontentMember(isiKontenMember);
premiumCDMember.setAttribute('data-text', teksTerenkripsiMember);
premiumCDMember.innerHTML = '';
});
}
document.addEventListener('DOMContentLoaded', wrapDivs);
/*]]>*/</script>
<b:else/>
<b:if cond='data:post.labels any (l => l.name == "User")'>
<script async='async'>/*<![CDATA[*/
function wrapDivs() {
var divs = document.getElementsByClassName('check-lck');
for (var i = 0; i < divs.length; i++) {
var div = divs[i];
var newDiv = document.createElement('div');
newDiv.className = 'premiumKTUser admin staff modder member hidden guest';
div.parentNode.insertBefore(newDiv, div);
newDiv.appendChild(div);
}
const premiumSckUser = document.querySelectorAll('.premiumKTUser');
premiumSckUser.forEach(premiumCDUser => {
const isiKontenUser = premiumCDUser.innerHTML.trim();
const teksTerenkripsiUser = encryptKontentUser(isiKontenUser);
premiumCDUser.setAttribute('data-text', teksTerenkripsiUser);
premiumCDUser.innerHTML = '';
});
}
document.addEventListener('DOMContentLoaded', wrapDivs);
/*]]>*/</script>
</b:if>
</b:if>
</b:if>
</b:if>
</b:if>
<div class='check-lck'>
<div class='check-box'> <data:post.body/>
</div>
</div>
<b:include name='jsfrmcheck'/>
step 6.5 : Kode Encrypt
Kode Encrypt Letakan ini di atas </body> atau letakan di atas </head>
opsional, kalian bisa encrypt kode ini pakai tools obufescator, ini demi kalian supaya aman, karena kode ini yang bertugas membuka encryptnya.Wajib baca ini
Kode untuk "Untuk Manga" encryptnya punya batas 10ribu huruf, jadi kalau kalian pasang ini di website untuk novel maka Novel kalian jadi rusak saat didecrypt, dikarena novel itu sangat panjang dan banyak textnya, bahkan bisa 10ribu huruf lebih
karena hal ini aku menerima laporan 'novel jadi rusak saat dibuka'.
padahal aku buat ini untuk Manga, karena itu aku pakai btoa.
jadi Aku sudah buat yang "untuk Novel", itu bekerja dengan baik sejauh aku test.
Jika nanti masih ada bug tolong laporkanUntuk Manga
<script>
/*<![CDATA[*/
let kodenumberAdmin=22,
kodenumberStaff=25,
kodenumberModder=20,
kodenumberMember=15,
kodenumberUser=10;
function encryptKontentAdmin(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberAdmin);t+=o}return btoa(t)}function encryptKontentModder(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberModder);t+=o}return btoa(t)}function encryptKontentStaff(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberStaff);t+=o}return btoa(t)}function encryptKontentMember(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberMember);t+=o}return btoa(t)}function encryptKontentUser(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberUser);t+=o}return btoa(t)}function openlockAdmin(e){e=atob(e);let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberAdmin);t+=o}return t}function unlockAdmin(){document.querySelectorAll(".premiumKTAdmin").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockAdmin(t);e.innerHTML=r,e.removeAttribute("data-text")})}function openlockModder(e){e=atob(e);let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberModder);t+=o}return t}function unlockModder(){document.querySelectorAll(".premiumKTModder").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockModder(t);e.innerHTML=r,e.removeAttribute("data-text")})}function openlockStaff(e){e=atob(e);let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberStaff);t+=o}return t}function unlockStaff(){document.querySelectorAll(".premiumKTStaff").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockStaff(t);e.innerHTML=r,e.removeAttribute("data-text")})}function openlockMember(e){e=atob(e);let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberMember);t+=o}return t}function unlockMember(){document.querySelectorAll(".premiumKTMember").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockMember(t);e.innerHTML=r,e.removeAttribute("data-text")})}function openlockUser(e){e=atob(e);let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberUser);t+=o}return t}function unlockUser(){document.querySelectorAll(".premiumKTUser").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockUser(t);e.innerHTML=r,e.removeAttribute("data-text")})}
/*]]>*/
</script>
Untuk Novel
<script>
/*<![CDATA[*/
let kodenumberAdmin=22,
kodenumberStaff=25,
kodenumberModder=20,
kodenumberMember=15,
kodenumberUser=10;
function encryptKontentAdmin(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberAdmin);t+=o}return t}function encryptKontentModder(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberModder);t+=o}return t}function encryptKontentStaff(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberStaff);t+=o}return t}function encryptKontentMember(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberMember);t+=o}return t}function encryptKontentUser(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)+kodenumberUser);t+=o}return t}function openlockAdmin(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberAdmin);t+=o}return t}function unlockAdmin(){document.querySelectorAll(".premiumKTAdmin").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockAdmin(t);e.innerHTML=r,e.removeAttribute("data-text")})}function openlockModder(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberModder);t+=o}return t}function unlockModder(){document.querySelectorAll(".premiumKTModder").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockModder(t);e.innerHTML=r,e.removeAttribute("data-text")})}function openlockStaff(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberStaff);t+=o}return t}function unlockStaff(){document.querySelectorAll(".premiumKTStaff").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockStaff(t);e.innerHTML=r,e.removeAttribute("data-text")})}function openlockMember(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberMember);t+=o}return t}function unlockMember(){document.querySelectorAll(".premiumKTMember").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockMember(t);e.innerHTML=r,e.removeAttribute("data-text")})}function openlockUser(e){let t="";for(let r=0;r<e.length;r++){let o=String.fromCharCode(e.charCodeAt(r)-kodenumberUser);t+=o}return t}function unlockUser(){document.querySelectorAll(".premiumKTUser").forEach(e=>{let t=e.getAttribute("data-text"),r=openlockUser(t);e.innerHTML=r,e.removeAttribute("data-text")})}
/*]]>*/
</script>
step 7 Update(3.2): dasboard admin,letakan dihalaman
<style>
:root {
--bg-datauser-dasboard: #1e2129;
--color-dasboard: #0c70de;
--color-text-dasboard: #fff;
}
ul#user-list li button:first-child,ul#user-list li button:nth-child(2),ul#user-list li button:nth-child(3){font-size:12px;padding:5px;margin:5px;position:absolute}
ul#user-list{margin:0;counter-reset:usertotal;list-style:none;}
ul#user-list li::before {
position: absolute;
top: -30px;
left: -20px;
font-size: 16px;
border-radius: 5px;
padding: 3px 7px;
background:var(--color-dasboard);
color: var(--color-text-dasboard);
counter-increment: usertotal;
content: counter(usertotal);
}
#user-list li {
position: relative;
margin: 55px 0 25px -20px;
background: var(--bg-datauser-dasboard);
color:var(--color-text-dasboard);
padding: 15px;
height: auto;
border-radius: 15px;
font-size: 16px;
float: left;
}
span.setting-user{display:flex;flex-direction:column}
span.setting-user>span{border:1px solid var(--color-dasboard);border-radius:5px;padding:1px 10px;margin:3px;overflow:hidden}
span.setting-user>span:hover{overflow:auto}
ul#user-list li button:first-child {
background: var(--color-dasboard);
color:var(--color-text-dasboard);
border: none;
border-radius: 5px;
right: -5px;
top: -25px;
}
ul#user-list li button:nth-child(2) {
background: #0000;
color: #fff;
border-radius: 5px;
border: 1px solid #eee;
bottom: 13px;
right: 16px;
}ul#user-list li button:nth-child(3){border:1px solid var(--color-dasboard);border-radius:5px;bottom:0;left:0}
/*generate tanggal*/
div#set1 {
display: flex;
padding: 5px;
margin: 5px;
justify-content: center;
flex-direction: column;
align-items: center;
text-align: center;
}
input#checkTanggal {
padding: 10px 15px;
background: #1e2129ba;
color: #fff;
outline: none;
border: none;
border-radius: 5px;
text-align: center;
}
input#checkTanggal::placeholder {
color: #fff;
}
span#inputset1 {
display: flex;
flex-direction: column;
align-items: center;
}
#inputset1 button {
background:var(--color-dasboard);
color: #fff;
border: none;
border-radius: 15px;
padding: 6px 20px;
margin: 5px;
}
span#result_tanggal {
position: relative;
border-radius: 15px;
background: #1e2129ba;
color: #fff;
padding: 3px;
width: 50%;
min-height: 60px;
max-height: 100%;
margin: 5px;
}
span#result_tanggal:before {
content: "Output >";
position: absolute;
top: 0;
left: -80px;
background: #1e2129ba;
color: #fff;
padding: 3px 8px;
border-radius: 16px;
}
/*pencarian tanggal*/
.setting-dashboard {
display: flex;
padding: 5px;
margin: 5px;
justify-content: center;
flex-direction: column;
align-items: center;
text-align: center;
}
span.cariUser,.filterUser {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
gap: 5px;
}
input#search-input {
width: 100%;
padding: 10px 15px;
background: #1e2129ba;
color: #fff;
outline: none;
border: none;
border-radius: 5px;
text-align: center;
}
input#search-input::placeholder {
color: #fff;
}
.cariUser button {
background: var(--color-dasboard);
color: #fff;
border: none;
border-radius: 15px;
padding: 6px 20px;
margin: 5px;
}
/*pencarian role*/
select#filter-role {
width: 50%;
padding: 10px 15px;
background: #1e2129ba;
color: #fff;
outline: none;
border: none;
border-radius: 5px;
text-align: center;
font-size: 14px;
}
span.filterUser button {
background: var(--color-dasboard);
color: #fff;
border: none;
border-radius: 15px;
padding: 6px 20px;
margin: 5px;
}
/*pagination*/
div#pagination {
width: 100%;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
padding: 3px;
}
div#pagination button {
padding: 5px 8px;
background: #0c70de;
border-radius: 5px;
border: none;
width: 24%;
color: #fff;
}
div#page-numbers {
display: inline-flex;
justify-content: center;
align-items: center;
}
div#page-numbers span {
margin: auto 5px;
border: none;
background: #0c70de;
color: #eee;
font-size: 16px;
border-radius: 5px;
padding: 3px 7px;
}
div#page-numbers span.current-page,
div#pagination button:hover,
div#page-numbers span:hover {
background: #ff9a00;
color: #1e2129;
}
</style>
<div id="admin-dashboard" class="hidden1">
<div id='set1'>
<b>Tools Penghitung Tanggal</b>
<p>Masukan Text Seperti :[10 hari] atau [10 bulan] atau [10 tahun] nanti kamu bakal dapat Format Tanggal dan Tanggal itu bisa kamu masukan Ke Exp Role</p>
<span id='inputset1'>
<input placeholder="Exp User 5 hari? 7 hari?" type="text" id="checkTanggal" />
<button onclick="hitungTanggal()">Generate Tanggal?</button>
<span id="result_tanggal" align="center"></span>
</span>
</div>
<div class="setting-dashboard">
<span class="cariUser">
<input type="text" id="search-input" placeholder="Cari berdasarkan ID, Email, Role, atau Username"/>
<button onclick="searchUsers()">Cari User</button>
</span>
<br/>
<span class="filterUser">
<select id="filter-role">
<option value="all">Semua Role</option>
<option value="Role: Admin">Admin</option>
<option value="Role: Staff">Staff</option>
<option value="Role: Modder">Modder</option>
<option value="Role: Member">Member</option>
<option value="Role: User">User</option>
</select>
<button onclick="filterUsers()">Filter Role</button>
</span>
</div>
<ul id="user-list"></ul>
<div id="pagination">
<button onclick="loadPreviousPage()">Prev</button>
<div id="page-numbers"></div>
<button onclick="loadNextPage()">Next</button>
</div>
</div>
<script>
/*<![CDATA[*/
function showAdminDashboard(){document.querySelector("#admin-dashboard").classList.remove("hidden1")}function filterUsers(){let e=document.querySelector("#filter-role").value;document.querySelectorAll("#user-list li").forEach(a=>{let s=a.querySelector(".role-user").textContent;"all"===e||s===e?a.style.display="block":a.style.display="none"})}function searchUsers(){let e=document.querySelector("#search-input").value.toLowerCase();document.querySelectorAll("#user-list li").forEach(a=>{a.textContent.toLowerCase().includes(e)?a.style.display="block":a.style.display="none"})}function changeUserRole(e,a){db.collection("users").doc(e).get().then(s=>{if(s.exists){if("Admin"===s.data().role){alert("Tidak diizinkan Merubah User dengan Role Admin.");return}db.collection("users").doc(e).update({role:a}).then(()=>{alert("Role User berhasil diubah.")}).catch(e=>{alert("Gagal mengubah Role User: "+e.message)})}}).catch(e=>{alert("Gagal mengambil data User: "+e.message)})}function ExpRoleuser(e,a){if(!/^(\d{2})\/(\d{2})\/(\d{4})$/.test(a)){alert("Format tanggal tidak valid. Gunakan format dd/mm/yyyy.");return}db.collection("users").doc(e).get().then(s=>{if(s.exists){let t=s.data();if("Admin"===t.role){alert("Tidak diizinkan Merubah Tanggal Exp pada user dengan Role Admin.");return}let i=a.split("/"),r=parseInt(i[0],10),n=parseInt(i[1],10)-1,l=parseInt(i[2],10),o=new Date(l,n,r);if(isNaN(o.getTime())){alert("Format tanggal tidak valid. Gunakan format dd/mm/yyyy.");return}let u=o.toLocaleDateString("id-ID",{timeZone:"Asia/Jakarta",day:"2-digit",month:"2-digit",year:"numeric",timeZoneName:"short"});"Admin"!==t.role&&(db.collection("users").doc(e).update({exp:u}),alert("Tanggal Exp Role User berhasil diubah."))}}).catch(e=>{console.error("Error getting user data:",e)})}function showUserList(e){let a=document.querySelector("#user-list");a.innerHTML="",sessionStorage.setItem("DataListhiru",JSON.stringify(e)),e.forEach(e=>{let s=document.createElement("li");s.classList.add("usersub"),s.innerHTML=`
<span class="setting-user">
<span id="uidcheck" class="username-user">Uid: ${e.uid}</span>
<span class="username-user">Nama: ${e.username}</span>
<details>
<summary>info Status email?</summary>
<p>false = Belum verifikasi email dan belum login sekalipun</p>
<p>true = sudah verifikasi email dan sudah Login sekali (terdaftar)</p>
</details>
<span class="email-user">Email: ${e.email}</span>
<span class="email-status">Status email: ${e.emailVerified}</span>
<details>
<summary>info Role</summary>
<p>Hanya 3 Role yang tersedia</p>
<p>1: Admin = membuka Konten User & Member & Admin</p>
<p>2: Member = membuka Konten User & Member</p>
<p>3: User = membuka Konten User</p>
</details>
<span class="role-user">Role: ${e.role}</span>
<span class="favorite-user">Opsi: ${e.favorite}</span>
<details>
<summary>info aturan Exp Role</summary>
<p>Hanya Tanggal angka yang diijinkan</p>
<p>1. dd/mm/yyyy: harus wajib dua angka seperti ini [01/01/2023] Angka satu punya angka nol</p>
<p>2. dd/mm/yyyy: Dalam Tanggal kalian tidak boleh memasukan Huruf, Hanya angka yang diperbolehkan</p>
<p>3. dd/mm/yyyy: Kalian Juga tidak boleh Memasukan WIB Karena Itu otomatis Bakal ada dengan sendirinya</p>
</details>
<span class="exp-role">exp: ${e.exp}</span>
</span>
<span class="btn-edit">
<button class="editrole">Edit Role</button>
<button class="editexp">Edit Tanggal Exp</button>
</span>
`;s.querySelector(".editrole").addEventListener("click",()=>{let a=prompt("Masukkan Role baru untuk User:");null!==a&&""!==a.trim()&&changeUserRole(e.uid,a)});s.querySelector(".editexp").addEventListener("click",()=>{let a=prompt("Masukkan tanggal Exp membership: contoh (30/12/2023) tanpa WIB:");null!==a&&""!==a.trim()&&ExpRoleuser(e.uid,a)}),a.appendChild(s)}),loadUsers()}function watchUserCollection(){let e=sessionStorage.getItem("DataListhiru");e&&showUserList(e=JSON.parse(e)),db.collection("users").onSnapshot(e=>{let a=[];e.forEach(e=>{a.push({uid:e.id,...e.data()})}),sessionStorage.setItem("DataListhiru",JSON.stringify(a)),showUserList(a)})}function checkUserRole(e){db.collection("users").doc(e).onSnapshot(e=>{if(e.exists){let a=e.data(),s=document.querySelector(".admin-utama");document.querySelector(".user-member"),document.querySelector(".guest"),"Admin"===a.role?(showAdminDashboard(),watchUserCollection(),s.classList.remove("user-member"),s.classList.remove("admin-utama"),s.classList.remove("guest"),s.classList.remove("hidden1"),s.classList.remove("hidden"),console.log("Role [Admin]")):"Staff"===a.role?(alert("Akun kamu role [Staff], tidak bisa membuka halaman admin"),console.log("Role [Staff]"),sessionStorage.removeItem("DataListhiru"),window.history.back()):"Modder"===a.role?(alert("Akun kamu role [Modder], tidak bisa membuka halaman admin"),console.log("Role [Modder]"),sessionStorage.removeItem("DataListhiru"),window.history.back()):"Member"===a.role?(alert("Akun kamu role [Member], tidak bisa membuka halaman admin"),console.log("Role [Member]"),sessionStorage.removeItem("DataListhiru"),window.history.back()):"User"===a.role&&(alert("Akun kamu role [user], tidak bisa membuka halaman admin"),console.log("Role [User]"),sessionStorage.removeItem("DataListhiru"),window.history.back())}})}
/*]]>*/
</script>
<script>
function hitungTanggal(){var a=document.getElementById("checkTanggal").value,t=parseInt(a),e=a.toLowerCase().match(/[a-z]+/);if(isNaN(t)||null===e)return document.getElementById("result_tanggal").innerHTML="Format input kamu Salah, Contoh yang Benar: '10 hari' atau '10 bulan' atau '10 tahun'.";var n=new Date,l=new Date(n);"hari"===e[0]||"Hari"===e[0]?l.setDate(n.getDate()+t):"bulan"===e[0]||"Bulan"===e[0]?l.setMonth(n.getMonth()+t):("tahun"===e[0]||"Tahun"===e[0])&&l.setFullYear(n.getFullYear()+t);var r=l.getDate(),u=l.getMonth()+1,g=l.getFullYear();r<10&&(r="0"+r),u<10&&(u="0"+u);var h=r+"/"+u+"/"+g;return document.getElementById("result_tanggal").innerHTML=h}
</script>
<script>
//<![CDATA[
let currentPage=1;
const usersPerPage=1;//jumlah User ditampilkan perhalaman
function setUsersPerPage(e){usersPerPage=e,currentPage=1,loadUsers()}function loadUsers(){let e=(currentPage-1)*usersPerPage,r=e+usersPerPage,a=document.querySelectorAll("#user-list li");a.forEach(e=>{e.style.display="none"});for(let s=e;s<r&&s<a.length;s++)a[s].style.display="block";displayPageNumbers()}function loadPreviousPage(){currentPage>1&&(currentPage--,loadUsers())}function loadNextPage(){currentPage++,loadUsers()}function displayPageNumbers(){let e=document.querySelectorAll("#user-list li"),r=e.length,a=Math.ceil(r/usersPerPage),s=document.querySelector("#page-numbers");s.innerHTML="";for(let t=1;t<=a;t++){let l=document.createElement("span");l.textContent=t,t===currentPage&&l.classList.add("current-page"),l.addEventListener("click",()=>{currentPage=t,loadUsers()}),s.appendChild(l)}}const url=new URL(window.location.href);url.searchParams.has("page")&&(currentPage=parseInt(url.searchParams.get("page")));
//]]>
</script>
Selesai
Next Update Akan dirapikan kodenya, dan kalau ada yang request silahkan komentar
kalau ada yang punya saran dan kritik dipersilahkan komentar. (Saran metode kunci postingan yang lebih baik dibutuhkan disini).
Manual tanpa Menggunakan Label [ User, Admin, Member, Modder, Staff ]
Masukan Post Didalam div
Support jika kalian suka form login ini : Demo Trakteer
untuk mendapat akses kode versi gratis
silahkan masuk kegroup telegram dan chat aku disana
Group Telegram
Can you give me an example? What do you want to edit?,Maybe that example can be useful when I update this login code
It's already in the video.
As long as you follow the tutorial it will work.
Firebase database Will be active when you have opened the section "firebase database" And start setting the rules.
That's because you didn't delete the part in the javascript,
The element you removed has a class/id Try searching for class/id In javascript and delete if you have found it
The document ID that you said is a User ID, the user ID is randomly generated when you register In form register.
Maybe I misunderstood what you meant, if possible please give me a screenshot to make it clearer.
You have to find the element used to enclose the article and just add a div with class "lck".
And skip step 4 and 5 because this step only for ZeistmangaV5
I want to ask, What theme do you use?
Di tunggu tutorialnya.
top: -25px;
font-size: 14px;}
this is the css section that creates the effect
Agak lama karena internetnya cuman 2Mb
Login: https://ibb.co/SKrJ2rs
Register: https://ibb.co/gS9H400
Ganti ini dengan punya kamu sendiri.
<script>/*<![CDATA[*/
const configformlogin={
apiKey: "AIzaSyCDUKoueS66e77qvqGbrc1Clb0eFJWi2JU",
authDomain: "formlogin-6e176.firebaseapp.com",
projectId: "formlogin-6e176",
storageBucket: "formlogin-6e176.appspot.com",
messagingSenderId: "197923569691",
appId: "1:197923569691:web:db39447bcd0f6d7bd6f8be",
measurementId: "G-9RHRPYQXVQ"
};
/*]]>*/
</script>
I'll make a tutorial later on Thursday, because I'm busy in the next two days.
Work Stage: https://demokodehiru.blogspot.com/p/dasboard-admin-hiru.html
That's early stage code, for my development.
And only a few web developers can get it.
If you still want, Go Trakteer Link , it's not expensive, only 0,33$ dollar (for support development).
If there is an update to the code, you will still get the Unminified code.
Yep..Code Bakal Terus diupdate sampai benar-benar memberikan Kemanan ketat, karena targetku adalah Encrypt Kontent...Untuk Web Premium Yang sangat Butuh Ginian
Update kali ini cuman bug kecil.
akan kucoba targetkan fitur itu.Otw cari di stackoverflow
Link
<!--Menu Login/Register-->
<div class='dropdown-opsi'>
<button class='dropdown-btn-opsi menu-login'>
<span class='sm:dn'>Login</span></button>
<div class='dropdown-content-opsi'>
<button class='dropdown-item-opsi' disabled='disabled' id='profiletab-button' onclick='document.getElementById("contentx").style.display="flex";' type='button'><svg height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path clip-rule='evenodd' d='M12 4a8 8 0 0 0-6.96 11.947A4.99 4.99 0 0 1 9 14h6a4.99 4.99 0 0 1 3.96 1.947A8 8 0 0 0 12 4Zm7.943 14.076A9.959 9.959 0 0 0 22 12c0-5.523-4.477-10-10-10S2 6.477 2 12a9.958 9.958 0 0 0 2.057 6.076l-.005.018l.355.413A9.98 9.98 0 0 0 12 22a9.947 9.947 0 0 0 5.675-1.765a10.055 10.055 0 0 0 1.918-1.728l.355-.413l-.005-.018ZM12 6a3 3 0 1 0 0 6a3 3 0 0 0 0-6Z' fill='currentColor' fill-rule='evenodd'/></svg>Profile</button>
<button class='dropdown-item-opsi' onclick='document.getElementById("login-register-form").style.display="";'><svg height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M4 22q-.825 0-1.413-.588T2 20V9q0-.825.588-1.413T4 7h5V4q0-.825.588-1.413T11 2h2q.825 0 1.413.588T15 4v3h5q.825 0 1.413.588T22 9v11q0 .825-.588 1.413T20 22H4Zm0-2h16V9h-5q0 .825-.588 1.413T13 11h-2q-.825 0-1.413-.588T9 9H4v11Zm2-2h6v-.45q0-.425-.238-.788T11.1 16.2q-.5-.225-1.012-.338T9 15.75q-.575 0-1.088.113T6.9 16.2q-.425.2-.663.563T6 17.55V18Zm8-1.5h4V15h-4v1.5ZM9 15q.625 0 1.063-.438T10.5 13.5q0-.625-.438-1.063T9 12q-.625 0-1.063.438T7.5 13.5q0 .625.438 1.063T9 15Zm5-1.5h4V12h-4v1.5ZM11 9h2V4h-2v5Zm1 5.5Z' fill='currentColor'/></svg>Login/Register</button>
</div>
</div>
<script>
/*<![CDATA[*/
const dropdownButton = document.querySelector('.dropdown-btn-opsi');
const dropdownContent = document.querySelector('.dropdown-content-opsi'); dropdownButton.addEventListener('click', () => { dropdownContent.classList.toggle('show-opsi');
});
window.addEventListener('click', (event) => {
if (!event.target.matches('.dropdown-btn-opsi')) {
if (dropdownContent.classList.contains('show-opsi')) {
dropdownContent.classList.remove('show-opsi');
}
}
});
/*]]>*/
</script>
<!--Menu Login/Register-->
Screenshot
Link video test
dikarenakan timer coutdown realtime gak mungkin bisa dibuat olehku.
Tapi kalau tanggal exp Member di Profile bisa aja, jadi ketika sudah Habis Waktunya maka Role Membernya akan balik ke User
Moga cepat sembuh.
Itu Udah dibuat Cuman Belum direlease, soalnya belum ada stylenya dan stuck di button delete , Video.
The point is you have to connect and add logic to the function checkUserRole(e),
place the new code for the New Role check Logic condition in if else
newRole1 = document.querySelectorAll(".guest");
else if ("User" === s) { newRole1[0].classList.remove("guest", "hidden");
console.log("Role User");
}
Screenshot,
Sama info usernya tidak muncul
Screenshot
Dan juga pas login dengan akun admin chapter yang terkunci tetap tidak terbuka
Ss 2: https://ibb.co/C6HmrT2
<style>
/* Style all input fields */
input {
width: 100%;
padding: 12px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
margin-top: 6px;
margin-bottom: 16px;
}
/* Style the submit button */
input[type=submit] {
background-color: #04AA6D;
color: white;
}
/* Style the container for inputs */
.container {
background-color: #f1f1f1;
padding: 20px;
}
/* The message box is shown when the user clicks on the password field */
#message {
display:none;
background: #f1f1f1;
color: #000;
position: relative;
padding: 20px;
margin-top: 10px;
}
#message p {
padding: 10px 35px;
font-size: 18px;
}
/* Add a green text color and a checkmark when the requirements are right */
.valid {
color: green;
}
.valid:before {
position: relative;
left: -35px;
content: "✔";
}
/* Add a red text color and an "x" when the requirements are wrong */
.invalid {
color: red;
}
.invalid:before {
position: relative;
left: -35px;
content: "✖";
}
</style>
</head>
<body>
<h3>Password Validation</h3>
<p>Try to submit the form.</p>
<div class="container">
<form action="/action_page.php">
<label for="usrname">Username</label>
<input type="text" id="usrname" name="usrname" required>
<label for="psw">Password</label>
<input type="password" id="psw" name="psw" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}" title="Must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters" required>
<input type="submit" value="Submit">
</form>
</div>
<div id="message">
<h3>Password must contain the following:</h3>
<p id="letter" class="invalid">A <b>lowercase</b> letter</p>
<p id="capital" class="invalid">A <b>capital (uppercase)</b> letter</p>
<p id="number" class="invalid">A <b>number</b></p>
<p id="length" class="invalid">Minimum <b>8 characters</b></p>
</div>
<script>
var myInput = document.getElementById("psw");
var letter = document.getElementById("letter");
var capital = document.getElementById("capital");
var number = document.getElementById("number");
var length = document.getElementById("length");
// When the user clicks on the password field, show the message box
myInput.onfocus = function() {
document.getElementById("message").style.display = "block";
}
// When the user clicks outside of the password field, hide the message box
myInput.onblur = function() {
document.getElementById("message").style.display = "none";
}
// When the user starts to type something inside the password field
myInput.onkeyup = function() {
// Validate lowercase letters
var lowerCaseLetters = /[a-z]/g;
if(myInput.value.match(lowerCaseLetters)) {
letter.classList.remove("invalid");
letter.classList.add("valid");
} else {
letter.classList.remove("valid");
letter.classList.add("invalid");
}
// Validate capital letters
var upperCaseLetters = /[A-Z]/g;
if(myInput.value.match(upperCaseLetters)) {
capital.classList.remove("invalid");
capital.classList.add("valid");
} else {
capital.classList.remove("valid");
capital.classList.add("invalid");
}
// Validate numbers
var numbers = /[0-9]/g;
if(myInput.value.match(numbers)) {
number.classList.remove("invalid");
number.classList.add("valid");
} else {
number.classList.remove("valid");
number.classList.add("invalid");
}
// Validate length
if(myInput.value.length >= 8) {
length.classList.remove("invalid");
length.classList.add("valid");
} else {
length.classList.remove("valid");
length.classList.add("invalid");
}
}
</script>
I'll make a tutorial on installing it tomorrow
Video : Link
file: Link
you see the gift menu above the header,
open the gift and enter the account
username: hiru
password : lumatina
[ account exp: 01/10/2023 ]
Check this video : Link
Chapter Terkunci
Chapter Ini terkunci, Silahkan login terlebih dahulu Sesuai Role
Unlock with Role:
Member it keeps disappearing, and when the user's role is 'Member the content isn't showing..
did you change the label? or class name?
It's hard for me to know because the code worked fine when I tested it.
and for role notification issues
Chapter Terkunci
Chapter Ini terkunci, Silahkan login terlebih dahulu Sesuai Role
Unlock with Role:
Member
which often disappears, that's because I set it using setTimeout 5 seconds,
in step 4... more precisely in function checkUserRole, there is this code
setTimeout(()=>{s===r||s!==r?t.forEach(e=>{e.classList.add("hidden")}):t.forEach(e=>{e.classList.remove("hidden")})},5e3)
Just replace the 5 seconds, with the seconds you want...
5e3
5000= 5e3 = 5sec
10000 10e4 = 10 seconds
60000 = 6e4 = 60 seconds
3600000 = 36e5 = 1 hour
do you mean zeistmaid v1.2?,
it is very difficult to install form login v3.2 into Zeistmaid v1.2, because code count bookmark.
code form login v3.2: Link
Contact me if you have any problems.
I will help you install it
https://t.me/webhiru
My profile not appear and How to give role? Did I skip look?
, replace using this rule
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
how to give role: Link
I'll make a tutorial tonight
Link video
just try putting it on
background:#222; then the whole screen goes dark, the reason why it doesn't work is because the container covers the whole screen so what you click is the container and nothing else
When I have free time I will make a tutorial
I've logged in there and it's normal, it's just a "member" problem that I haven't checked
Check it out
Firestore rules Have you replaced it?
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth != null;
}
}
}
To make it work... maybe you should put the function canvas in code function checkUserRole
const imgTags = `<data:post.body.cssEscaped/>`;
ImageManager.loadImages(imgTags);
});
I don't quite understand what you mean and what it's for
function loadImg () {
const imgTags = `<data:post.body.cssEscaped/>`;
ImageManager.loadImages(imgTags);
}
put this function " loadImg () " under unlockUser() in the function checkUserRole
like this
"Member"===t?(n[0].classList.remove("member","guest","hidden","hidden1"),checkMembershipExp(),unlockMember(),unlockUser(),loadImg (),console.log("Role Member"))
function notiRole(){let t=document.querySelectorAll(".notifchapter");t?t.forEach(e=>{e.classList.add("hidden")}): t.forEach(e=>{e.classList.remove("hidden")})}
function loadImg () {
const imgTags = `<data:post.body.cssEscaped/>`;
ImageManager.loadImages(imgTags);
}
function loadImg () {
const imgTags = `<data:post.body.cssEscaped/>`;
ImageManager.loadImages(imgTags);
}
And look for a code like this then replace it
window.addEventListener(`load`, function () {
const imgTags = `<data:post.body.cssEscaped/>`;
ImageManager.loadImages(imgTags);
});
With this code
function loadImg () {
const imgTags = `<data:post.body.cssEscaped/>`;
ImageManager.loadImages(imgTags);
}
1 Because the rules of the two modes are different, that's why I suggest changing the rules.
2 There is no database with the name "users"
find this code
find this code in jsfrm
loginMessage.textContent = "login failed. " + e.message;
replace with this
if (e.code === "auth/user-not-found") {
loginMessage.textContent = "Email not found. Please register";
} else if (e.code === "auth/wrong-password") {
loginMessage.textContent = "Wrong password. Please try again.";
} else {
loginMessage.textContent = "Login Failed. There is an error: " + e.message;
}
Does the form you use on the Zeistmaid theme use the same code as this post?
then in the login section, register and profile or open content... is it all working normally?
ZMv6 Search Bookmark Setting not work
.hidden,.hidden1,.form .register-fr,.form .reset-fr,.icon1.hidden,.icon2.hidden,.options li:first-child{display:none}
example like this
.hidden1,.form .register-fr,.form .reset-fr,.icon1.hidden,.icon2.hidden,.options li:first-child{display:none}
How css?
this is the video tutorial Link video
9 labels can be used if more there will be error
<b:if cond='data:post.labels any (labelLock => labelLock.name in ["MemberA1", "MemberA2","MemberA3","MemberA4","MemberA5","Admin","Staff","Modder","User","Member"])'>
I don't know where the error is because I don't know what changes you made to the jsfrm code.
screenshot code jsfrm and record console.log when you register
service cloud.firestore {
match /databases/{database}/documents {
// Allow read access for authenticated users.
match /{document=**} {
allow read: if request.auth != null;
// Allow write access only for authenticated users from a specific domain and subdomains.
allow write: if request.auth != null &&
request.auth.token.email.matches(".*@yourdomain.com");
}
}
}
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read: if request.auth != null;
// Allow write access only for authenticated users with the custom claim 'domain' set to 'sdacvip.com'.
allow write: if request.auth != null &&
request.auth.token.domain == 'domain.com';
}
}
}
I think this worked