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
175 changes: 165 additions & 10 deletions dist/doboard-widget-bundle.js

Large diffs are not rendered by default.

14 changes: 8 additions & 6 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.

13 changes: 12 additions & 1 deletion js/src/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ const attachmentAddDoboard = async (fileData) => {
// @ToDo need to handle result?
};

const registerUserDoboard = async (projectToken, accountId, email, nickname, pageURL) => {
const registerUserDoboard = async (projectToken, accountId, email, nickname) => {
let data = {
project_token: projectToken,
account_id: accountId,
Expand Down Expand Up @@ -343,6 +343,17 @@ const userUpdateDoboard = async (projectToken, accountId, sessionId, userId, tim
};
};

const getProjectDoboard = async (projectToken, accountId) => {
const sessionId = localStorage.getItem('spotfix_session_id');
const data = {
project_token: projectToken,
};
if (sessionId) {
data.session_id = sessionId;
}
return await spotfixApiCall(data, 'project_get', accountId);
};

const getReleaseVersion = async () => {
try {
const res = await fetch('https://api.github.com/repos/CleanTalk/SpotFix/tags');
Expand Down
8 changes: 5 additions & 3 deletions js/src/handlers.js
Original file line number Diff line number Diff line change
Expand Up @@ -199,14 +199,14 @@ function registerUser(taskDetails) {
const userName = taskDetails.userName;
const projectToken = taskDetails.projectToken;
const accountId = taskDetails.accountId;
const pageURL = taskDetails.selectedData.pageURL ? taskDetails.selectedData.pageURL : window.location.href;

const resultRegisterUser = (showMessageCallback) => registerUserDoboard(projectToken, accountId, userEmail, userName, pageURL)
const resultRegisterUser = (showMessageCallback) => registerUserDoboard(projectToken, accountId, userEmail, userName)
.then((response) => {
if (response.accountExists) {
document.querySelector('.doboard_task_widget-accordion .doboard_task_widget-input-container').innerText = ksesFilter('Account already exists. Please, login usin your password.');
document.querySelector('.doboard_task_widget-accordion .doboard_task_widget-input-container').innerText = ksesFilter('Account already exists. Please, login usin your password.');
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a typo in usin

document.querySelector('.doboard_task_widget-accordion .doboard_task_widget-input-container.hidden').classList.remove('hidden');
document.getElementById('doboard_task_widget-user_password').focus();
return response;
} else if (response.sessionId) {
localStorage.setItem('spotfix_session_id', response.sessionId);
localStorage.setItem('spotfix_user_id', response.userId);
Expand All @@ -217,6 +217,7 @@ function registerUser(taskDetails) {
wsSpotfix.connect();
wsSpotfix.subscribe();
userUpdate(projectToken, accountId);
return response;
} else if (response.operationStatus === 'SUCCESS' && response.operationMessage && response.operationMessage.length > 0) {
if (response.operationMessage == 'Waiting for email confirmation') {
response.operationMessage = 'Waiting for an email confirmation. Please check your Inbox.';
Expand All @@ -230,6 +231,7 @@ function registerUser(taskDetails) {
const submitButton = document.getElementById('doboard_task_widget-submit_button');
submitButton.disabled = true;
submitButton.innerText = ksesFilter('Create spot');
return response;
} else {
throw new Error('Session ID not found in response');
}
Expand Down
8 changes: 5 additions & 3 deletions js/src/loaders/SpotFixTemplatesLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,12 @@ class SpotFixTemplatesLoader {
<label class="spotfix_placeholder_title" for="doboard_task_widget-title">Report about</label>
</div>

<div class="doboard_task_widget-input-container doboard_task_widget-input-container-textarea" style="flex-grow: 1; min-height: 200px">
<div id="doboard_task_widget-description-container" class="doboard_task_widget-input-container doboard_task_widget-input-container-textarea" style="flex-grow: 1; min-height: 200px">
<textarea id="doboard_task_widget-description" class="doboard_task_widget-field" name="description" placeholder=" " required></textarea>
<label for="doboard_task_widget-description" class="doboard_task_widget-field-textarea-label" >Description</label>
</div>

<div class="doboard_task_widget-login" style="margin-top: 12px; margin-bottom: 4px">
<div class="doboard_task_widget-login">

<span class="doboard_task_widget-login-icon" >Sign up here to receive notifications.</span>

Expand All @@ -168,11 +168,13 @@ class SpotFixTemplatesLoader {
<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>

<button id="doboard_task_widget-register_only_button" class="doboard_task_widget-submit_button doboard_task_widget-hidden" style="margin-top: 8px; width: 100%;">Sign up</button>

<i>Note about DoBoard register and accepting email notifications about tasks have to be here.</i>
</br>
Expand Down
15 changes: 15 additions & 0 deletions js/src/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,21 @@ function spotFixInit() {
new CleanTalkWidgetDoboard({}, 'wrap');
loadBotDetector();
loadTinyMCE();

const projectToken = localStorage.getItem('spotfix_project_token');
const accountId = localStorage.getItem('spotfix_company_id');
if (projectToken && accountId) {
getProjectDoboard(projectToken, accountId)
.then(result => {
if (result && result?.projects && result?.projects[0]) {
const project = result?.projects[0];
if (project?.require_full_registration !== undefined) {
localStorage.setItem('spotfix_require_full_registration', project?.require_full_registration);
}
}
})
.catch(err => console.error('project_get error:', err));
}
}

function loadBotDetector() {
Expand Down
128 changes: 127 additions & 1 deletion js/src/widget.js
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,8 @@ class CleanTalkWidgetDoboard {
submitButton.closest('.doboard_task_widget-field').classList.remove('doboard_task_widget-hidden');
}

await this.createWidgetElement('create_issue');

} catch (error) {
document.querySelector('.doboard_task_widget-login-is-invalid').classList.remove('doboard_task_widget-hidden');
}
Expand Down Expand Up @@ -503,6 +505,86 @@ class CleanTalkWidgetDoboard {
}
})
}

const registerOnlyButton = document.getElementById('doboard_task_widget-register_only_button');
if (registerOnlyButton) {
registerOnlyButton.addEventListener('click', async () => {
const userNameElement = document.getElementById('doboard_task_widget-user_name');
const userEmailElement = document.getElementById('doboard_task_widget-user_email');

const userName = userNameElement?.value?.trim();
const userEmail = userEmailElement?.value?.trim();
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

if (!userName) {
userNameElement.style.borderColor = 'red';
userNameElement.focus();
userNameElement.addEventListener('input', function() {
this.style.borderColor = '';
});
return;
}

// Validate email
if (!userEmail) {
userEmailElement.style.borderColor = 'red';
userEmailElement.focus();
userEmailElement.addEventListener('input', function() {
this.style.borderColor = '';
});
return;
} else if (!emailRegex.test(userEmail)) {
userEmailElement.style.borderColor = 'red';
userEmailElement.focus();
userEmailElement.addEventListener('input', function() {
this.style.borderColor = '';
});
return;
}

registerOnlyButton.disabled = true;
registerOnlyButton.innerText = 'Signing up...';

try {
const taskDetails = {
userName: userName,
userEmail: userEmail,
projectToken: this.params.projectToken,
accountId: this.params.accountId,
};

const response = await registerUser(taskDetails)(this.registrationShowMessage);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, be sure that will not appear any JS-errors about doboard_task_widget-submit_button


if (response && response.accountExists) {
const loginContainer = document.getElementById('doboard_task_widget-input-container-login');
const phantomContainer = document.querySelector('.doboard_task_widget-input-container-phantom');
const loginEmailElement = document.getElementById('doboard_task_widget-login_email');

if (phantomContainer) {
phantomContainer.classList.add('doboard_task_widget-hidden');
}
if (loginContainer) {
loginContainer.classList.remove('doboard_task_widget-hidden');
}
if (loginEmailElement && userEmail) {
loginEmailElement.value = userEmail;
loginEmailElement.classList.add('has-value');
}
registerOnlyButton.classList.add('doboard_task_widget-hidden');

this.registrationShowMessage('Account already exists. Please login with your password.', 'notice');
} else if (localStorage.getItem('spotfix_session_id')) {
// Redraw widget after successful registration
await this.createWidgetElement('create_issue');
}
} catch (error) {
this.registrationShowMessage(error.message, 'error');
}

registerOnlyButton.disabled = false;
registerOnlyButton.innerText = 'Sign up';
});
}
}

/**
Expand Down Expand Up @@ -643,6 +725,41 @@ class CleanTalkWidgetDoboard {
document.querySelector('.doboard_task_widget-login').classList.add('hidden');
}

const requireFullRegistration = localStorage.getItem('spotfix_require_full_registration') === '1';
const titleContainer = document.getElementById('doboard_task_widget-title')?.closest('.doboard_task_widget-input-container');
const descriptionContainer = document.getElementById('doboard_task_widget-description-container');
const requireFullRegistrationMessage = document.getElementById('doboard_task_widget-require_full_registration');
const submitButtonContainer = document.getElementById('doboard_task_widget-submit_button')?.closest('.doboard_task_widget-field');
const visibilityToggle = document.querySelector('.doboard_task_widget-visibility-toggle');

const registerOnlyButton = document.getElementById('doboard_task_widget-register_only_button');

if (requireFullRegistration && !sessionIdExists) {
if (titleContainer) titleContainer.style.display = '';
if (descriptionContainer) descriptionContainer.style.display = '';
if (submitButtonContainer) submitButtonContainer.style.display = 'none';
if (visibilityToggle) visibilityToggle.style.display = 'none';
if (requireFullRegistrationMessage) requireFullRegistrationMessage.classList.remove('doboard_task_widget-hidden');
const loginSection = document.querySelector('.doboard_task_widget-login');
if (loginSection) loginSection.classList.add('active');
// Hide login accordion icon when require_full_registration
const loginIcon = document.querySelector('.doboard_task_widget-login-icon');
if (loginIcon) loginIcon.classList.add('doboard_task_widget-login-icon-hidden');
// Show register only button
if (registerOnlyButton) registerOnlyButton.classList.remove('doboard_task_widget-hidden');
} else {
if (titleContainer) titleContainer.style.display = '';
if (descriptionContainer) descriptionContainer.style.display = '';
if (submitButtonContainer) submitButtonContainer.style.display = '';
if (visibilityToggle) visibilityToggle.style.display = '';
if (requireFullRegistrationMessage) requireFullRegistrationMessage.classList.add('doboard_task_widget-hidden');
// Show login accordion icon when not require_full_registration
const loginIcon = document.querySelector('.doboard_task_widget-login-icon');
if (loginIcon) loginIcon.classList.remove('doboard_task_widget-login-icon-hidden');
// Hide register only button
if (registerOnlyButton) registerOnlyButton.classList.add('doboard_task_widget-hidden');
}

if (
selection.type === 'Range'
) {
Expand Down Expand Up @@ -1511,7 +1628,16 @@ class CleanTalkWidgetDoboard {
if ( accordionController ) {
const context = this;
accordionController.addEventListener('click', function() {
this.closest('.doboard_task_widget-login').classList.toggle('active');
const loginSection = this.closest('.doboard_task_widget-login');
const requireFullRegistration = localStorage.getItem('spotfix_require_full_registration') === '1';
const sessionIdExists = !!localStorage.getItem('spotfix_session_id');

if (requireFullRegistration && !sessionIdExists) {
loginSection.classList.add('active');
} else {
loginSection.classList.toggle('active');
}

// Scroll
context.positionWidgetContainer();
setTimeout(() => {
Expand Down
19 changes: 19 additions & 0 deletions styles/doboard-widget.css
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,8 @@
}

.doboard_task_widget-login {
margin-top: 12px;
margin-bottom: 4px;
border: 1px solid #BBC7D1;
border-radius: 4px;
padding: 11px 8px 8px 8px;
Expand Down Expand Up @@ -401,6 +403,11 @@
transform: rotate(-135deg);
top: 7px;
}

.doboard_task_widget-login-icon.doboard_task_widget-login-icon-hidden::after {
display: none;
}

.doboard_task_widget-login .doboard_task_widget-input-container .doboard_task_widget-field,
.doboard_task_widget-login .doboard_task_widget-field + label {
background: #F9FBFD;
Expand Down Expand Up @@ -1495,3 +1502,15 @@ input:checked + .slider:before {
margin-bottom: 12px
}

/* Require full registration message */
.doboard_task_widget-require_full_registration {
padding: 16px;
background-color: #65D4AC;
border-radius: 8px;
margin-bottom: 12px;
}

.doboard_task_widget-require_full_registration-title {
color: #252A2F;
font-weight: 500;
}