@@ -468,6 +468,8 @@ class CleanTalkWidgetDoboard {
468468 submitButton . closest ( '.doboard_task_widget-field' ) . classList . remove ( 'doboard_task_widget-hidden' ) ;
469469 }
470470
471+ await this . createWidgetElement ( 'create_issue' ) ;
472+
471473 } catch ( error ) {
472474 document . querySelector ( '.doboard_task_widget-login-is-invalid' ) . classList . remove ( 'doboard_task_widget-hidden' ) ;
473475 }
@@ -519,6 +521,86 @@ class CleanTalkWidgetDoboard {
519521 }
520522 } )
521523 }
524+
525+ const registerOnlyButton = document . getElementById ( 'doboard_task_widget-register_only_button' ) ;
526+ if ( registerOnlyButton ) {
527+ registerOnlyButton . addEventListener ( 'click' , async ( ) => {
528+ const userNameElement = document . getElementById ( 'doboard_task_widget-user_name' ) ;
529+ const userEmailElement = document . getElementById ( 'doboard_task_widget-user_email' ) ;
530+
531+ const userName = userNameElement ?. value ?. trim ( ) ;
532+ const userEmail = userEmailElement ?. value ?. trim ( ) ;
533+ const emailRegex = / ^ [ ^ \s @ ] + @ [ ^ \s @ ] + \. [ ^ \s @ ] + $ / ;
534+
535+ if ( ! userName ) {
536+ userNameElement . style . borderColor = 'red' ;
537+ userNameElement . focus ( ) ;
538+ userNameElement . addEventListener ( 'input' , function ( ) {
539+ this . style . borderColor = '' ;
540+ } ) ;
541+ return ;
542+ }
543+
544+ // Validate email
545+ if ( ! userEmail ) {
546+ userEmailElement . style . borderColor = 'red' ;
547+ userEmailElement . focus ( ) ;
548+ userEmailElement . addEventListener ( 'input' , function ( ) {
549+ this . style . borderColor = '' ;
550+ } ) ;
551+ return ;
552+ } else if ( ! emailRegex . test ( userEmail ) ) {
553+ userEmailElement . style . borderColor = 'red' ;
554+ userEmailElement . focus ( ) ;
555+ userEmailElement . addEventListener ( 'input' , function ( ) {
556+ this . style . borderColor = '' ;
557+ } ) ;
558+ return ;
559+ }
560+
561+ registerOnlyButton . disabled = true ;
562+ registerOnlyButton . innerText = 'Signing up...' ;
563+
564+ try {
565+ const taskDetails = {
566+ userName : userName ,
567+ userEmail : userEmail ,
568+ projectToken : this . params . projectToken ,
569+ accountId : this . params . accountId ,
570+ } ;
571+
572+ const response = await registerUser ( taskDetails ) ( this . registrationShowMessage ) ;
573+
574+ if ( response && response . accountExists ) {
575+ const loginContainer = document . getElementById ( 'doboard_task_widget-input-container-login' ) ;
576+ const phantomContainer = document . querySelector ( '.doboard_task_widget-input-container-phantom' ) ;
577+ const loginEmailElement = document . getElementById ( 'doboard_task_widget-login_email' ) ;
578+
579+ if ( phantomContainer ) {
580+ phantomContainer . classList . add ( 'doboard_task_widget-hidden' ) ;
581+ }
582+ if ( loginContainer ) {
583+ loginContainer . classList . remove ( 'doboard_task_widget-hidden' ) ;
584+ }
585+ if ( loginEmailElement && userEmail ) {
586+ loginEmailElement . value = userEmail ;
587+ loginEmailElement . classList . add ( 'has-value' ) ;
588+ }
589+ registerOnlyButton . classList . add ( 'doboard_task_widget-hidden' ) ;
590+
591+ this . registrationShowMessage ( 'Account already exists. Please login with your password.' , 'notice' ) ;
592+ } else if ( localStorage . getItem ( 'spotfix_session_id' ) ) {
593+ // Redraw widget after successful registration
594+ await this . createWidgetElement ( 'create_issue' ) ;
595+ }
596+ } catch ( error ) {
597+ this . registrationShowMessage ( error . message , 'error' ) ;
598+ }
599+
600+ registerOnlyButton . disabled = false ;
601+ registerOnlyButton . innerText = 'Sign up' ;
602+ } ) ;
603+ }
522604 }
523605
524606 /**
@@ -675,6 +757,41 @@ class CleanTalkWidgetDoboard {
675757 document . querySelector ( '.doboard_task_widget-login' ) . classList . add ( 'hidden' ) ;
676758 }
677759
760+ const requireFullRegistration = localStorage . getItem ( 'spotfix_require_full_registration' ) === '1' ;
761+ const titleContainer = document . getElementById ( 'doboard_task_widget-title' ) ?. closest ( '.doboard_task_widget-input-container' ) ;
762+ const descriptionContainer = document . getElementById ( 'doboard_task_widget-description-container' ) ;
763+ const requireFullRegistrationMessage = document . getElementById ( 'doboard_task_widget-require_full_registration' ) ;
764+ const submitButtonContainer = document . getElementById ( 'doboard_task_widget-submit_button' ) ?. closest ( '.doboard_task_widget-field' ) ;
765+ const visibilityToggle = document . querySelector ( '.doboard_task_widget-visibility-toggle' ) ;
766+
767+ const registerOnlyButton = document . getElementById ( 'doboard_task_widget-register_only_button' ) ;
768+
769+ if ( requireFullRegistration && ! sessionIdExists ) {
770+ if ( titleContainer ) titleContainer . style . display = '' ;
771+ if ( descriptionContainer ) descriptionContainer . style . display = '' ;
772+ if ( submitButtonContainer ) submitButtonContainer . style . display = 'none' ;
773+ if ( visibilityToggle ) visibilityToggle . style . display = 'none' ;
774+ if ( requireFullRegistrationMessage ) requireFullRegistrationMessage . classList . remove ( 'doboard_task_widget-hidden' ) ;
775+ const loginSection = document . querySelector ( '.doboard_task_widget-login' ) ;
776+ if ( loginSection ) loginSection . classList . add ( 'active' ) ;
777+ // Hide login accordion icon when require_full_registration
778+ const loginIcon = document . querySelector ( '.doboard_task_widget-login-icon' ) ;
779+ if ( loginIcon ) loginIcon . classList . add ( 'doboard_task_widget-login-icon-hidden' ) ;
780+ // Show register only button
781+ if ( registerOnlyButton ) registerOnlyButton . classList . remove ( 'doboard_task_widget-hidden' ) ;
782+ } else {
783+ if ( titleContainer ) titleContainer . style . display = '' ;
784+ if ( descriptionContainer ) descriptionContainer . style . display = '' ;
785+ if ( submitButtonContainer ) submitButtonContainer . style . display = '' ;
786+ if ( visibilityToggle ) visibilityToggle . style . display = '' ;
787+ if ( requireFullRegistrationMessage ) requireFullRegistrationMessage . classList . add ( 'doboard_task_widget-hidden' ) ;
788+ // Show login accordion icon when not require_full_registration
789+ const loginIcon = document . querySelector ( '.doboard_task_widget-login-icon' ) ;
790+ if ( loginIcon ) loginIcon . classList . remove ( 'doboard_task_widget-login-icon-hidden' ) ;
791+ // Hide register only button
792+ if ( registerOnlyButton ) registerOnlyButton . classList . add ( 'doboard_task_widget-hidden' ) ;
793+ }
794+
678795 if (
679796 selection . type === 'Range'
680797 ) {
@@ -1614,7 +1731,16 @@ class CleanTalkWidgetDoboard {
16141731 if ( accordionController ) {
16151732 const context = this ;
16161733 accordionController . addEventListener ( 'click' , function ( ) {
1617- this . closest ( '.doboard_task_widget-login' ) . classList . toggle ( 'active' ) ;
1734+ const loginSection = this . closest ( '.doboard_task_widget-login' ) ;
1735+ const requireFullRegistration = localStorage . getItem ( 'spotfix_require_full_registration' ) === '1' ;
1736+ const sessionIdExists = ! ! localStorage . getItem ( 'spotfix_session_id' ) ;
1737+
1738+ if ( requireFullRegistration && ! sessionIdExists ) {
1739+ loginSection . classList . add ( 'active' ) ;
1740+ } else {
1741+ loginSection . classList . toggle ( 'active' ) ;
1742+ }
1743+
16181744 // Scroll
16191745 context . positionWidgetContainer ( ) ;
16201746 setTimeout ( ( ) => {
0 commit comments