/* global jQuery, wp, m365LoginAdmin */ ( function ( $ ) { 'use strict'; var cfg = window.m365LoginAdmin || {}; var i18n = cfg.i18n || {}; $( function () { var $preview = $( '#m365-preview' ); /* ---------------- Tabs ---------------- */ var $tabs = $( '.m365-admin__tab' ); var $panels = $( '.m365-admin__panel' ); function activate( name ) { $tabs.removeClass( 'is-active' ).attr( 'aria-selected', 'false' ).filter( '[data-tab="' + name + '"]' ).addClass( 'is-active' ).attr( 'aria-selected', 'true' ); $panels.removeClass( 'is-active' ).filter( '[data-panel="' + name + '"]' ).addClass( 'is-active' ); try { window.localStorage.setItem( 'm365LoginTab', name ); } catch ( e ) {} // Keep the URL (and the post-save redirect) on this tab. var $referer = $( '#m365-referer' ); if ( $referer.length && window.history && window.history.replaceState ) { var url = new URL( window.location.href ); if ( 'connection' === name ) { url.searchParams.delete( 'tab' ); } else { url.searchParams.set( 'tab', name ); } url.searchParams.delete( 'settings-updated' ); window.history.replaceState( null, '', url.toString() ); $referer.val( url.pathname + url.search ); } } $tabs.on( 'click', function () { activate( $( this ).data( 'tab' ) ); } ); var initial = $( '.m365-admin__tabs' ).data( 'initial-tab' ); if ( initial && $tabs.filter( '[data-tab="' + initial + '"]' ).length ) { activate( initial ); } else { try { var saved = window.localStorage.getItem( 'm365LoginTab' ); if ( saved && $tabs.filter( '[data-tab="' + saved + '"]' ).length ) { activate( saved ); } } catch ( e ) {} } // Jump to the tab that contains a validation error. var $error = $( '.settings-error' ).first(); if ( $error.length && $error.text().toLowerCase().indexOf( 'tenant' ) !== -1 ) { activate( 'connection' ); } /* ---------------- Live preview ---------------- */ function setVar( name, value ) { $preview[ 0 ].style.setProperty( '--m365-' + name, value ); } function updateIcon() { var show = $( '[data-preview="show-icon"]' ).is( ':checked' ); var url = $.trim( $( '#m365-icon-url' ).val() ); var $icon = $( '#m365-preview-icon' ); var $thumb = $( '#m365-icon-thumb' ); $icon.toggleClass( 'is-hidden', ! show ); if ( url ) { var $img = $( '', { src: url, alt: '' } ); $icon.empty().append( $img ); $thumb.empty().append( $img.clone() ); } else { $icon.html( cfg.defaultLogo || '' ); $thumb.html( cfg.defaultLogo || '' ); } } $( '[data-preview="text"]' ).on( 'input', function () { $( '#m365-preview-text' ).text( $( this ).val() ); } ); $( '[data-preview="divider"]' ).on( 'input', function () { var val = $.trim( $( this ).val() ); $( '#m365-preview-divider' ).text( val ).closest( '.m365-login__divider' ).toggleClass( 'is-hidden', ! val ); } ).trigger( 'input' ); $( '[data-preview="show-icon"], #m365-icon-url' ).on( 'change input', updateIcon ); $( '[data-preview="radius"]' ).on( 'input change', function () { setVar( 'radius', $( this ).val() + 'px' ); $( '#m365-radius-value' ).text( $( this ).val() + ' px' ); } ); $( '.m365-color' ).wpColorPicker( { change: function ( event, ui ) { var key = $( event.target ).data( 'preview' ); var color = ui.color.toString(); setVar( key.replace( '_', '-' ), color ); }, clear: function ( event ) { var $input = $( event.target ).closest( '.wp-picker-container' ).find( '.m365-color' ); setVar( $input.data( 'preview' ).replace( '_', '-' ), $input.data( 'default-color' ) ); } } ); $( '.m365-preset' ).on( 'click', function () { var preset = $( this ).data( 'preset' ); if ( ! preset ) { return; } $.each( preset, function ( key, value ) { $( '#m365-button_' + key ).wpColorPicker( 'color', value ); } ); } ); /* ---------------- Media library ---------------- */ var frame; $( '#m365-icon-choose' ).on( 'click', function ( e ) { e.preventDefault(); if ( ! window.wp || ! wp.media ) { return; } if ( ! frame ) { frame = wp.media( { title: i18n.chooseIcon || '', button: { text: i18n.useIcon || '' }, library: { type: 'image' }, multiple: false } ); frame.on( 'select', function () { var attachment = frame.state().get( 'selection' ).first().toJSON(); var url = attachment.url; if ( attachment.sizes && attachment.sizes.thumbnail && attachment.mime !== 'image/svg+xml' ) { url = attachment.sizes.thumbnail.url; } $( '#m365-icon-url' ).val( url ).trigger( 'input' ); } ); } frame.open(); } ); $( '#m365-icon-reset' ).on( 'click', function ( e ) { e.preventDefault(); $( '#m365-icon-url' ).val( '' ).trigger( 'input' ); } ); /* ---------------- Auth method switch ---------------- */ function applyMethod() { var method = $( 'input[name$="[auth_method]"]:checked' ).val() || 'secret'; $( '.m365-method__option' ).removeClass( 'is-selected' ).filter( '[data-method="' + method + '"]' ).addClass( 'is-selected' ); $( '.m365-auth-panel' ).removeClass( 'is-active' ).filter( '[data-method="' + method + '"]' ).addClass( 'is-active' ); } $( 'input[name$="[auth_method]"]' ).on( 'change', applyMethod ); applyMethod(); /* ---------------- Certificate generation ---------------- */ $( '#m365-cert-generate' ).on( 'click', function () { var $btn = $( this ); var $out = $( '#m365-cert-result' ); if ( $btn.data( 'replace' ) && ! window.confirm( i18n.confirmCert ) ) { return; } $btn.prop( 'disabled', true ); $out.removeClass( 'is-success is-error' ).prop( 'hidden', false ).text( i18n.generating || '…' ); $.post( cfg.ajaxUrl, { action: cfg.certAction, nonce: cfg.nonce, op: 'generate' } ).done( function ( res ) { if ( res && res.success ) { $out.addClass( 'is-success' ).text( res.data.message ); window.setTimeout( function () { window.location.reload(); }, 800 ); } else { $out.addClass( 'is-error' ).text( ( res && res.data && res.data.message ) || i18n.testFailed ); $btn.prop( 'disabled', false ); } } ).fail( function () { $out.addClass( 'is-error' ).text( i18n.testFailed ); $btn.prop( 'disabled', false ); } ); } ); $( '#m365-cert-remove' ).on( 'change', function () { if ( this.checked && ! window.confirm( i18n.confirmCertRemove ) ) { this.checked = false; } } ); $( '#m365-cert-paste-toggle' ).on( 'click', function ( e ) { e.preventDefault(); $( '#m365-cert-paste' ).prop( 'hidden', function ( i, v ) { return ! v; } ); } ); /* ---------------- Secret visibility ---------------- */ $( '.m365-toggle-secret' ).on( 'click', function () { var $input = $( '#m365-client-secret' ); var show = 'password' === $input.attr( 'type' ); $input.attr( 'type', show ? 'text' : 'password' ); $( this ).find( '.dashicons' ).toggleClass( 'dashicons-visibility', ! show ).toggleClass( 'dashicons-hidden', show ); } ); /* ---------------- Copy redirect URI ---------------- */ $( '.m365-copy__button' ).on( 'click', function () { var $btn = $( this ); var text = $( '#' + $btn.data( 'copy' ) ).text(); var done = function () { $btn.text( i18n.copied || 'Copied!' ); window.setTimeout( function () { $btn.text( i18n.copy || 'Copy' ); }, 1500 ); }; if ( navigator.clipboard && navigator.clipboard.writeText ) { navigator.clipboard.writeText( text ).then( done ); } else { var $tmp = $( '