Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
506 changes: 471 additions & 35 deletions dist/doboard-widget-bundle.js

Large diffs are not rendered by default.

120 changes: 95 additions & 25 deletions dist/doboard-widget-bundle.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/doboard-widget-bundle.min.js.map

Large diffs are not rendered by default.

22 changes: 21 additions & 1 deletion js/src/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ const spotfixApiCall = async(data, method, accountId = undefined) => {

if (responseBody.data.operation_status === 'FAILED') {
const errorMessage = responseBody.data.operation_message || 'Operation failed without specific message';
if(responseBody?.data?.operation_message === 'session_id Unknown'){
clearLocalstorageOnLogout();
checkLogInOutButtonsVisible();
await deleteDB();
}
throw new Error(errorMessage);
}

Expand Down Expand Up @@ -176,6 +181,7 @@ const registerUserDoboard = async (projectToken, accountId, email, nickname, pag
operationMessage: result.operation_message,
operationStatus: result.operation_status,
userEmailConfirmed: result.user_email_confirmed,
accounts: result.accounts,
};
};

Expand All @@ -193,11 +199,24 @@ const loginUserDoboard = async (email, password) => {
operationMessage: result.operation_message,
operationStatus: result.operation_status,
userEmailConfirmed: result.user_email_confirmed,
accounts: result.accounts
}
}

const forgotPasswordDoboard = async (email) => {
const data = {
email: email
}
return await spotfixApiCall(data, 'user_password_reset');
}

const logoutUserDoboard = async (projectToken, accountId) => {

const logoutUserDoboard = async (projectToken) => {
const sessionId = localStorage.getItem('spotfix_session_id');
const accountsString = localStorage.getItem('spotfix_accounts');
const accounts = accountsString !== 'undefined' ? JSON.parse(accountsString || '[]') : [];
const accountId = accounts.length > 0 ? accounts[0].account_id : 1;

if(sessionId && accountId) {
const data = {
session_id: sessionId,
Expand All @@ -214,6 +233,7 @@ const logoutUserDoboard = async (projectToken, accountId) => {
if (result.operation_status === 'SUCCESS') {
await deleteDB();
clearLocalstorageOnLogout();
checkLogInOutButtonsVisible();
}
}
}
Expand Down
80 changes: 72 additions & 8 deletions js/src/handlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -212,15 +212,23 @@ function registerUser(taskDetails) {
localStorage.setItem('spotfix_session_id', response.sessionId);
localStorage.setItem('spotfix_user_id', response.userId);
localStorage.setItem('spotfix_email', response.email);
localStorage.setItem('spotfix_accounts', JSON.stringify(response.accounts));
spotfixIndexedDB.init();
userUpdate(projectToken, accountId);
} else if (response.operationStatus === 'SUCCESS' && response.operationMessage && response.operationMessage.length > 0) {
if (response.operationMessage == 'Waiting for email confirmation') {
if (response.operationMessage === 'Waiting for email confirmation') {
response.operationMessage = 'Waiting for an email confirmation. Please check your Inbox.';
if (document.getElementById('doboard_task_widget-error_message').innerText === 'Waiting for an email confirmation. Please check your Inbox.') {
response.operationMessage = 'Incorrect email address. Please confirm your email to create the spot.';
}
}
if (typeof showMessageCallback === 'function') {
showMessageCallback(response.operationMessage, 'notice');
}
const submitButton = document.getElementById('doboard_task_widget-submit_button');
submitButton.disabled = true;
submitButton.innerText = ksesFilter('Create spot');

} else {
throw new Error('Session ID not found in response');
}
Expand All @@ -241,7 +249,10 @@ function loginUser(taskDetails) {
if (response.sessionId) {
localStorage.setItem('spotfix_session_id', response.sessionId);
localStorage.setItem('spotfix_user_id', response.userId);
localStorage.setItem('spotfix_email', response.email);
localStorage.setItem('spotfix_email', userEmail);
localStorage.setItem('spotfix_accounts', JSON.stringify(response.accounts));
checkLogInOutButtonsVisible();
spotfixIndexedDB.init();
} else if (response.operationStatus === 'SUCCESS' && response.operationMessage && response.operationMessage.length > 0) {
if (typeof showMessageCallback === 'function') {
Expand All @@ -256,6 +267,33 @@ function loginUser(taskDetails) {
});
}

function forgotPassword(userEmail) {
return (showMessageCallback) => forgotPasswordDoboard(userEmail)
.then(response => {
console.log('response ', response)
if (response?.operation_status === 'SUCCESS') {
showMessageCallback('New password sent to email', 'notice');
const forgotPasswordForm = document.getElementById('doboard_task_widget-container-login-forgot-password-form');
const loginContainer = document.getElementById('doboard_task_widget-input-container-login');
const submitButton = document.getElementById('doboard_task_widget-submit_button');
if (forgotPasswordForm) {
forgotPasswordForm.classList.add('doboard_task_widget-hidden');
}
if (loginContainer) {
loginContainer.classList.remove('doboard_task_widget-hidden');
if (submitButton) {
submitButton.closest('.doboard_task_widget-field').classList.add('doboard_task_widget-hidden');
}
}
} else {
throw new Error('Response error');
}
})
.catch(error => {
throw error;
});
}

function userUpdate(projectToken, accountId) {
const sessionId = localStorage.getItem('spotfix_session_id');
const userId = localStorage.getItem('spotfix_user_id');
Expand Down Expand Up @@ -291,7 +329,6 @@ function setToggleStatus(rootElement){
const clickHandler = () => {
const timer = setTimeout(() => {
localStorage.setItem('spotfix_widget_is_closed', '1');
wsSpotfix.close();
rootElement.hide();
clearTimeout(timer);
}, 300);
Expand All @@ -305,13 +342,40 @@ function setToggleStatus(rootElement){

function checkLogInOutButtonsVisible (){
if(!localStorage.getItem('spotfix_session_id')) {
const el = document
.getElementById('doboard_task_widget-user_menu-logout_button')
?.closest('.doboard_task_widget-user_menu-item');
if(el) el.style.display = 'none';
} else {
const el = document.getElementById('doboard_task_widget-user_menu-signlog_button');
const el = document.getElementById('doboard_task_widget-user_menu-logout_button')?.closest('.doboard_task_widget-user_menu-item');
if(el) el.style.display = 'none';

const loginContainer = document.getElementById('doboard_task_widget-input-container-login')
if(loginContainer) {
loginContainer.classList.remove('doboard_task_widget-hidden');
}
clearUserMenuData();
} else {
const el = document.getElementById('doboard_task_widget-user_menu-logout_button')?.closest('.doboard_task_widget-user_menu-item');
if(el) el.style.display = 'block';
const loginContainer = document.getElementById('doboard_task_widget-input-container-login')
if(loginContainer) {
loginContainer.classList.add('doboard_task_widget-hidden');
}
}
}

/**
* Clear user menu data in menu
*/
async function clearUserMenuData() {
const userNameElement = document.querySelector('.doboard_task_widget-user_menu-header-user-name');
const emailElement = document.querySelector('.doboard_task_widget-user_menu-header-email');
const avatarElement = document.querySelector('.doboard_task_widget-user_menu-header-avatar');

if (userNameElement) {
userNameElement.innerText = 'Guest';
}
if (emailElement) {
emailElement.innerText = '';
}
if (avatarElement) {
avatarElement.src = SpotFixSVGLoader.getAsDataURI('iconAvatar');
}
}

Expand Down
116 changes: 93 additions & 23 deletions js/src/loaders/SpotFixTemplatesLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,27 +170,64 @@ class SpotFixTemplatesLoader {

<div class="doboard_task_widget-login">

<span>If you want to receive notifications by email write here you email contacts.</span>
<span class="doboard_task_widget-login-icon" >If you want to receive notifications by email write here you email contacts.</span>

<div class="doboard_task_widget-accordion">

<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-user_name" class="doboard_task_widget-field" type="text" name="user_name">
<label for="doboard_task_widget-user_name">Nickname</label>
</div>

<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-user_email" class="doboard_task_widget-field" type="email" name="user_email">
<label for="doboard_task_widget-user_email">Email</label>

<div class="doboard_task_widget-input-container-phantom">
<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-user_name" class="doboard_task_widget-field" type="text" name="user_name">
<label for="doboard_task_widget-user_name">Nickname</label>
</div>

<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-user_email" class="doboard_task_widget-field" type="email" name="user_email">
<label for="doboard_task_widget-user_email">Email</label>
</div>

<div class="doboard_task_widget-input-container hidden">
<input id="doboard_task_widget-user_password" class="doboard_task_widget-field" type="password" name="user_password">
<label for="doboard_task_widget-user_password">Password</label>
</div>

<i>Note about DoBoard register and accepting email notifications about tasks have to be here.</i>
</br>
<i>If you are a doBoard user, use same Email and password as at <a href="https://doboard.com" target="_blank" rel="nofollow">doboard.com</a>
on the <span id="doboard_task_widget-show_login_form" class="doboard_task_widget-show_login_form">login page</span>
</i>
</div>

<div id="doboard_task_widget-input-container-login" class="doboard_task_widget-input-container-login doboard_task_widget-hidden">
<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-login_email" class="doboard_task_widget-field" type="email" name="login_email">
<label for="doboard_task_widget-login_email">Email</label>
</div>
<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-login_password" class="doboard_task_widget-field" type="password" name="login_password">
<label for="doboard_task_widget-login_password">Password</label>
<span class="doboard_task_widget-bottom-eye-icon" id="doboard_task_widget-password-toggle"></span>
</div>
<div>
<span id="doboard_task_widget-forgot_password" class="doboard_task_widget-forgot_password">Forgot Password?</span>
</div>
<div class="doboard_task_widget-login-buttons-wrapper">
<button id="doboard_task_widget-on_phantom_login_page" class="doboard_task_widget-submit_button">Cancel</button>
<button id="doboard_task_widget-login_button" class="doboard_task_widget-submit_button">Log in</button>
</div>
<div>
<i><span id="doboard_task_widget-login-is-invalid" class="doboard_task_widget-login-is-invalid doboard_task_widget-hidden">Logon or password is invalid </span></i>
</div>
</div>
<div id="doboard_task_widget-container-login-forgot-password-form" class="doboard_task_widget-forgot_password_form doboard_task_widget-hidden">
<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-forgot_password_email" class="doboard_task_widget-field" type="email" name="forgot_password_email">
<label for="doboard_task_widget-forgot_password_email">Email</label>
</div>
<div class="doboard_task_widget-login-buttons-wrapper">
<button id="doboard_task_widget-forgot_password-black" class="doboard_task_widget-submit_button">Cancel</button>
<button id="doboard_task_widget-restore_password_button" class="doboard_task_widget-submit_button">Restore password</button>
</div>
</div>

<div class="doboard_task_widget-input-container hidden">
<input id="doboard_task_widget-user_password" class="doboard_task_widget-field" type="password" name="user_password">
<label for="doboard_task_widget-user_password">Password</label>
</div>

<i>Note about DoBoard register and accepting email notifications about tasks have to be here.</i>

</div>

</div>
Expand Down Expand Up @@ -253,11 +290,8 @@ class SpotFixTemplatesLoader {
</div>
<div style="display: flex; flex-direction: column; align-items: center">
<img class="doboard_task_widget-user_menu-header-avatar" src="{{avatar}}" alt="">
<span style="font-size: 16px; font-weight: 700">{{userName}}</span>
<span style="font-size: 12px;">{{email}}</span>
<span id="doboard_task_widget-user_menu-signlog_button">
<a style="cursor: pointer" rel="nofollow" target="_blank">Sign up or Log in</a>
</span>
<span class="doboard_task_widget-user_menu-header-user-name" style="font-size: 16px; font-weight: 700">{{userName}}</span>
<span class="doboard_task_widget-user_menu-header-email" style="font-size: 12px;">{{email}}</span>
</div>
</div>
<div class="doboard_task_widget-content" style="min-height:200px ">
Expand All @@ -284,6 +318,38 @@ class SpotFixTemplatesLoader {
<span class="logout_button">Log out</span>
</span>
</div>

<div id="doboard_task_widget-input-container-login" class="doboard_task_widget-input-container-login doboard_task_widget-input-container-login-menu ">
<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-login_email" class="doboard_task_widget-field" type="email" name="login_email">
<label for="doboard_task_widget-login_email">Email</label>
</div>
<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-login_password" class="doboard_task_widget-field" type="password" name="login_password">
<label for="doboard_task_widget-login_password">Password</label>
<span class="doboard_task_widget-bottom-eye-icon" id="doboard_task_widget-password-toggle"></span>
</div>
<div>
<span id="doboard_task_widget-forgot_password" class="doboard_task_widget-forgot_password">Forgot Password?</span>
</div>
<div class="doboard_task_widget-field">
<button id="doboard_task_widget-login_button" class="doboard_task_widget-submit_button">Log in</button>
</div>
<div>
<i><span id="doboard_task_widget-login-is-invalid" class="doboard_task_widget-login-is-invalid doboard_task_widget-hidden">Logon or password is invalid </span></i>
</div>
</div>
<div id="doboard_task_widget-container-login-forgot-password-form" class="doboard_task_widget-forgot_password_form doboard_task_widget-forgot_password_form-menu doboard_task_widget-hidden">
<div class="doboard_task_widget-input-container">
<input id="doboard_task_widget-forgot_password_email" class="doboard_task_widget-field" type="email" name="forgot_password_email">
<label for="doboard_task_widget-forgot_password_email">Email</label>
</div>
<div class="doboard_task_widget-login-buttons-wrapper">
<button id="doboard_task_widget-forgot_password-black" class="doboard_task_widget-submit_button">Cancel</button>
<button id="doboard_task_widget-restore_password_button" class="doboard_task_widget-submit_button">Restore password</button>
</div>
</div>

</div>
</div>
<div style="padding: 16px; font-size: 13px; position: sticky; bottom: 0">
Expand All @@ -293,6 +359,10 @@ class SpotFixTemplatesLoader {
doBoard
</a></span>
</div>
<div class="doboard_task_widget-message-wrapper hidden">
<span id="doboard_task_widget-error_message-header"></span>
<div id="doboard_task_widget-error_message"></div>
</div>
</div>
</div>`;
}
Expand Down
1 change: 1 addition & 0 deletions js/src/storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ function clearLocalstorageOnLogout () {
localStorage.removeItem('spotfix_email');
localStorage.removeItem('spotfix_session_id');
localStorage.removeItem('spotfix_user_id');
localStorage.removeItem('spotfix_accounts');
localStorage.setItem('spotfix_widget_is_closed', '1');
wsSpotfix.close();
}
Loading