Viewing File: /usr/local/cpanel/base/frontend/jupiter/domains/directives/domainSearchModal.ptt

<!-- Domain Search Modal -->
<div class="domain-search-modal"
     ng-class="{'domain-search-modal--overlay-open': purchaseConfirmation || redirectFailed || redirectSucceeded}">

    <!-- Modal body (inert while a purchase overlay is open) -->
    <div class="domain-search-modal__body"
         ng-attr-inert="{{ (purchaseConfirmation || redirectFailed || redirectSucceeded) ? '' : undefined }}">

    <!-- Success banner: shown when the searched-for domain matched a result -->
    <div class="domain-search-modal__success"
         ng-if="matchedDomain"
         data-testid="domain-search-success-banner"
         role="status"
         aria-live="polite">
        <div class="domain-search-modal__success-content">
            <div class="domain-search-modal__success-heading">
                <i class="fas fa-check-circle domain-search-modal__success-check" aria-hidden="true"></i>
                <p class="domain-search-modal__success-title">
                    [% locale.maketext('“[_1]” is available.', '{{ matchedDomain.domain }}') %]
                </p>
            </div>
            <p class="domain-search-modal__success-subtitle">
                [% locale.maketext('Secure your place on the web!') %]
            </p>
            <p class="domain-search-modal__success-price">
                [% locale.maketext('[_1] / year', '{{ matchedDomain.price }}') %]
            </p>
            <button type="button"
                    class="btn domain-search-modal__purchase-btn domain-search-modal__purchase-btn--outline domain-search-modal__success-purchase"
                    ng-click="purchaseDomain(matchedDomain, $event)"
                    data-purchase-domain="{{ matchedDomain.domain }}"
                    data-testid="domain-search-success-purchase-btn">
                [% locale.maketext('Purchase') %]
            </button>
        </div>
        <button type="button"
                class="domain-search-modal__success-close"
                ng-click="closeModal()"
                aria-label="[% locale.maketext('Close') %]"
                data-testid="domain-search-success-close">
            <i class="fas fa-times" aria-hidden="true"></i>
        </button>
        <img class="domain-search-modal__success-graphic"
             src="images/check.svg"
             alt="" />
    </div>

    <!-- Featured Recommendations Header -->
    <div class="domain-search-modal__header" ng-if="!matchedDomain">
        <div class="domain-search-modal__title-row"
             ng-if="!unavailableDomain">
            <h2 class="domain-search-modal__title"
                id="domainSearchModalTitle"
                ng-if="!pendingSearchDomain && !noResults">
                [% locale.maketext("We Think You’ll Like …") %]
            </h2>
            <h2 class="domain-search-modal__title"
                id="domainSearchModalNoResultsTitle"
                ng-if="!pendingSearchDomain && noResults"
                role="status"
                aria-live="polite"
                data-testid="domain-search-no-results-title">
                [% locale.maketext("No Domains Found") %]
            </h2>
            <h2 class="domain-search-modal__title"
                id="domainSearchModalPendingTitle"
                ng-if="pendingSearchDomain"
                data-testid="domain-search-pending-title">
                [% locale.maketext('Searching for “[_1]” …', '{{ pendingSearchDomain }}') %]
            </h2>
            <button type="button"
                    class="domain-search-modal__close"
                    ng-click="closeModal()"
                    aria-label="[% locale.maketext('Close') %]">
                <i class="fas fa-times" aria-hidden="true"></i>
            </button>
        </div>

        <!-- Unavailable banner: shown when the user searched an exact domain
             (with a TLD) that is not available -->
        <div class="domain-search-modal__unavailable"
             ng-if="unavailableDomain"
             data-testid="domain-search-unavailable-banner"
             role="status"
             aria-live="polite">
            <div class="domain-search-modal__unavailable-content">
                <h2 class="domain-search-modal__unavailable-title"
                    id="domainSearchModalUnavailableTitle">
                    [% locale.maketext("We’re sorry …") %]
                </h2>
                <p class="domain-search-modal__unavailable-subtitle">
                    [% locale.maketext('“[_1]” is not available.', '{{ unavailableDomain }}') %]
                </p>
                <p class="domain-search-modal__unavailable-prompt">
                    [% locale.maketext('But you might be interested in:') %]
                </p>
            </div>
            <button type="button"
                    class="domain-search-modal__close domain-search-modal__unavailable-close"
                    ng-click="closeModal()"
                    aria-label="[% locale.maketext('Close') %]"
                    data-testid="domain-search-unavailable-close">
                <i class="fas fa-times" aria-hidden="true"></i>
            </button>
        </div>

        <!-- Loading state -->
        <div class="domain-search-modal__featured"
             ng-if="loading"
             aria-busy="true"
             aria-label="[% locale.maketext('Loading domain recommendations …') %]">
            <div class="domain-search-modal__featured-card domain-search-modal__featured-card--skeleton">
                <span class="domain-search-modal__skeleton-block domain-search-modal__skeleton-block--domain"></span>
                <span class="domain-search-modal__skeleton-block domain-search-modal__skeleton-block--price"></span>
                <span class="domain-search-modal__skeleton-block domain-search-modal__skeleton-block--button"></span>
            </div>
            <div class="domain-search-modal__featured-card domain-search-modal__featured-card--skeleton">
                <span class="domain-search-modal__skeleton-block domain-search-modal__skeleton-block--domain"></span>
                <span class="domain-search-modal__skeleton-block domain-search-modal__skeleton-block--price"></span>
                <span class="domain-search-modal__skeleton-block domain-search-modal__skeleton-block--button"></span>
            </div>
        </div>

        <!-- Loaded featured cards -->
        <div class="domain-search-modal__featured" ng-if="!loading">
            <div class="domain-search-modal__featured-card"
                 ng-repeat="rec in featured track by rec.domain"
                 data-testid="domain-search-featured-card">
                <div class="domain-search-modal__premium-badge"
                     ng-if="rec.isPremium">
                    [% locale.maketext('Premium') %]
                </div>
                <div class="domain-search-modal__card-content">
                    <div class="domain-search-modal__card-domain">
                        <i class="fas fa-check-circle domain-search-modal__check-icon" aria-hidden="true"></i>
                        <span class="domain-search-modal__domain-name"
                              ng-bind-html="highlightTld(rec.domain)"></span>
                    </div>
                    <p class="domain-search-modal__card-price">
                        [% locale.maketext('Only [_1] / year.', '{{ rec.price }}') %]
                    </p>
                </div>
                <button type="button"
                        class="btn domain-search-modal__purchase-btn domain-search-modal__purchase-btn--accent"
                        ng-click="purchaseDomain(rec, $event)"
                        data-purchase-domain="{{ rec.domain }}"
                        data-testid="domain-search-purchase-btn">
                    [% locale.maketext('Purchase') %]
                </button>
            </div>
        </div>
    </div>

    <!-- Search Section -->
    <div class="domain-search-modal__search-section">
        <label class="domain-search-modal__search-label"
               for="domainSearchInput">
            [% locale.maketext('Search for a domain') %]
        </label>
        <div class="domain-search-modal__search-row">
            <div class="domain-search-modal__search-bar">
                <i class="fas fa-search domain-search-modal__search-icon" aria-hidden="true"></i>
                <input type="text"
                       id="domainSearchInput"
                       class="form-control domain-search-modal__search-input"
                       ng-model="searchQuery"
                       ng-keydown="handleSearchKeydown($event)"
                       autocomplete="off"
                       aria-describedby="domainSearchInputHint"
                       placeholder="[% locale.maketext('Use exact terms or let our AI find unique suggestions based on your input.') %]" />
            </div>
            <button type="button"
                    class="btn domain-search-modal__search-btn"
                    ng-click="searchDomains()"
                    ng-disabled="searching || !searchQuery"
                    data-testid="domain-search-search-btn">
                <i class="fas fa-magic" aria-hidden="true"></i>
                [% locale.maketext('Search Domains') %]
            </button>
        </div>
        <!-- Keep this hint in the DOM (toggle visibility, not existence) so the
             input's aria-describedby reference stays valid for screen readers. -->
        <p class="domain-search-modal__search-hint"
           id="domainSearchInputHint"
           ng-show="!searchQuery"
           data-testid="domain-search-hint">
            [% locale.maketext('Enter a domain name or keyword to search.') %]
        </p>
        <button type="button"
                class="domain-search-modal__search-options-link"
                ng-click="toggleSearchOptions()"
                aria-expanded="{{ showSearchOptions }}">
            {{ showSearchOptions
                ? '[% locale.maketext("Hide Options") %]'
                : '[% locale.maketext("Show Options") %]' }}
        </button>
        <div class="domain-search-modal__search-options" ng-if="showSearchOptions">
            <tld-priority-input priorities="tldFilters"
                                supported-tlds="supportedTlds"
                                disabled="purchasingDomain"
                                input-id="domainSearchModalTldInput">
            </tld-priority-input>
        </div>
    </div>

    <!-- Also Available Table -->
    <div class="domain-search-modal__results"
         ng-if="available.length || searching">
        <div class="domain-search-modal__results-header">
            <strong id="domain-search-modal-results-heading">[% locale.maketext('Also available') %]</strong>
        </div>

        <div class="domain-search-modal__results-scroll"
             tabindex="{{ (!searching && available.length) ? 0 : -1 }}"
             role="region"
             aria-labelledby="domain-search-modal-results-heading">

            <!-- Searching state -->
            <div class="domain-search-modal__results-loading"
                 ng-if="searching"
                 aria-busy="true">
                <i class="fas fa-spinner fa-spin" aria-hidden="true"></i>
                [% locale.maketext('Searching for available domains …') %]
            </div>

            <!-- Results table -->
            <div class="domain-search-modal__table" ng-if="!searching">
                <div class="domain-search-modal__row"
                     ng-repeat="rec in available track by rec.domain"
                     data-testid="domain-search-available-row">
                    <div class="domain-search-modal__row-domain">
                        <span>{{ rec.domain }}</span>
                    </div>
                    <div class="domain-search-modal__row-price">
                        <span class="domain-search-modal__premium-tag"
                              ng-if="rec.isPremium">
                            [% locale.maketext('Premium') %]
                        </span>
                        {{ rec.price }} / [% locale.maketext('year') %]
                    </div>
                    <button type="button"
                            class="btn domain-search-modal__purchase-btn domain-search-modal__purchase-btn--outline"
                            ng-click="purchaseDomain(rec, $event)"
                            data-purchase-domain="{{ rec.domain }}"
                            data-testid="domain-search-purchase-btn">
                        [% locale.maketext('Purchase') %]
                    </button>
                </div>
            </div>

        </div>
    </div>

    <!-- No results message -->
    <div class="domain-search-modal__no-results"
         ng-if="!loading && !searching && !available.length && searchPerformed">
        <p>[% locale.maketext('No additional domains found. Try a different search term.') %]</p>
    </div>

    <!-- Go Back Footer -->
    <div class="domain-search-modal__footer">
        <button type="button"
                class="btn btn-link domain-search-modal__go-back"
                ng-click="closeModal()"
                data-testid="domain-search-go-back">
            <i class="fas fa-arrow-left" aria-hidden="true"></i>
            [% locale.maketext('Go Back') %]
        </button>
    </div>
    </div><!-- /.domain-search-modal__body -->

    <!-- Purchase Confirmation overlay -->
    <div class="domain-search-modal__overlay"
         ng-if="purchaseConfirmation && !redirectFailed && !redirectSucceeded"
         ng-keydown="handleConfirmationKeydown($event)"
         data-testid="domain-search-confirmation-overlay">
        <div class="domain-search-modal__confirmation"
             role="dialog"
             aria-modal="true"
             aria-labelledby="domainSearchModalConfirmationTitle"
             aria-describedby="domainSearchModalConfirmationDesc"
             data-testid="domain-search-confirmation">
            <div class="domain-search-modal__confirmation-header">
                <span class="domain-search-modal__confirmation-icon" aria-hidden="true">
                    <img class="domain-search-modal__confirmation-icon-img"
                         src="images/redirect-arrow.svg"
                         alt="" />
                </span>
                <h2 id="domainSearchModalConfirmationTitle"
                    class="domain-search-modal__confirmation-title"
                    tabindex="-1">
                    [% locale.maketext('Redirecting to Store') %]
                </h2>
                <button type="button"
                        class="domain-search-modal__close domain-search-modal__confirmation-close"
                        ng-click="cancelPurchaseConfirmation()"
                        aria-label="[% locale.maketext('Close') %]"
                        data-testid="domain-search-confirmation-close">
                    <i class="fas fa-times" aria-hidden="true"></i>
                </button>
            </div>
            <div class="domain-search-modal__confirmation-body">
                <p id="domainSearchModalConfirmationDesc"
                   class="domain-search-modal__confirmation-intro">
                    [% locale.maketext("We’re redirecting you to your hosting provider’s store to complete your purchase of:") %]
                </p>
                <div class="domain-search-modal__confirmation-domain"
                     data-testid="domain-search-confirmation-domain">
                    {{ purchaseConfirmation.domain }}
                </div>
                <p class="domain-search-modal__confirmation-note">
                    [% locale.maketext('After your purchase, return to [asis,cPanel] to view your domain.') %]
                </p>
                <div class="domain-search-modal__popup-blocked"
                     ng-if="blockedPurchaseUrl"
                     data-testid="domain-search-popup-blocked-banner"
                     role="alert">
                    <i class="fas fa-exclamation-triangle domain-search-modal__popup-blocked-icon"
                       aria-hidden="true"
                       data-testid="domain-search-popup-blocked-icon"></i>
                    <div class="domain-search-modal__popup-blocked-body">
                        <h3 class="domain-search-modal__popup-blocked-title"
                            data-testid="domain-search-popup-blocked-title">
                            [% locale.maketext('Your browser blocked the store tab.') %]
                        </h3>
                        <p class="domain-search-modal__popup-blocked-message"
                           data-testid="domain-search-popup-blocked-message">
                            [% locale.maketext('Your browser prevented the new tab from opening automatically. Click the button below to continue to your provider’s store and finish your purchase.') %]
                        </p>
                        <a id="domainSearchPopupBlockedLink"
                           class="btn btn-primary domain-search-modal__popup-blocked-link"
                           ng-href="{{ blockedPurchaseUrl }}"
                           target="_blank"
                           rel="noopener noreferrer"
                           ng-click="dismissBlockedPurchaseUrl()"
                           data-testid="domain-search-popup-blocked-link">
                            [% locale.maketext('Continue to Store') %]
                            <i class="fas fa-external-link-alt" aria-hidden="true"></i>
                        </a>
                    </div>
                </div>
            </div>
            <div class="domain-search-modal__confirmation-actions">
                <button type="button"
                        class="btn btn-link domain-search-modal__go-back"
                        ng-click="cancelPurchaseConfirmation()"
                        ng-disabled="purchasingDomain"
                        data-testid="domain-search-confirmation-cancel">
                    <i class="fas fa-arrow-left" aria-hidden="true"></i>
                    [% locale.maketext('Go Back') %]
                </button>
                <button type="button"
                        class="btn btn-primary domain-search-modal__confirmation-continue"
                        ng-click="confirmPurchase()"
                        ng-disabled="purchasingDomain || blockedPurchaseUrl"
                        aria-busy="{{ !!purchasingDomain }}"
                        data-testid="domain-search-confirmation-purchase-btn">
                    <i class="fas fa-spinner fa-spin" aria-hidden="true" ng-if="purchasingDomain"></i>
                    [% locale.maketext('Continue') %]
                </button>
            </div>
        </div>
    </div>

    <div class="domain-search-modal__overlay"
         ng-if="redirectSucceeded"
         ng-keydown="handleSuccessKeydown($event)"
         data-testid="domain-search-redirect-success-overlay">
        <div class="domain-search-modal__confirmation domain-search-modal__confirmation--wide"
             role="dialog"
             aria-modal="true"
             aria-labelledby="domainSearchModalSuccessTitle"
             aria-describedby="domainSearchModalSuccessDesc domainSearchModalSuccessDomain domainSearchModalSuccessNextStepLabel {{ canAddDomain ? 'domainSearchModalSuccessNoteAdd' : 'domainSearchModalSuccessNote' }}"
             data-testid="domain-search-redirect-success">
            <div class="domain-search-modal__confirmation-header">
                <span class="domain-search-modal__confirmation-icon" aria-hidden="true">
                    <img class="domain-search-modal__confirmation-icon-img"
                         src="images/redirect-success.svg"
                         alt="" />
                </span>
                <h2 id="domainSearchModalSuccessTitle"
                    class="domain-search-modal__confirmation-title"
                    tabindex="-1">
                    [% locale.maketext('Let’s connect your domain!') %]
                </h2>
                <button type="button"
                        class="domain-search-modal__close domain-search-modal__confirmation-close"
                        ng-click="dismissRedirectSuccess()"
                        aria-label="[% locale.maketext('Close') %]"
                        data-testid="domain-search-redirect-success-close">
                    <i class="fas fa-times" aria-hidden="true"></i>
                </button>
            </div>
            <div class="domain-search-modal__confirmation-body">
                <p id="domainSearchModalSuccessDesc"
                   class="domain-search-modal__confirmation-intro">
                    [% locale.maketext("You have been redirected to your hosting provider’s store to complete your purchase of:") %]
                </p>
                <div id="domainSearchModalSuccessDomain"
                     class="domain-search-modal__confirmation-domain"
                     data-testid="domain-search-redirect-success-domain">
                    {{ purchaseConfirmation.domain }}
                </div>
                <div class="domain-search-modal__next-step"
                     data-testid="domain-search-redirect-success-next-step">
                    <i class="fas fa-arrow-circle-right domain-search-modal__next-step-icon"
                       aria-hidden="true"></i>
                    <div class="domain-search-modal__next-step-content">
                        <p id="domainSearchModalSuccessNextStepLabel"
                           class="domain-search-modal__next-step-label">
                            [% locale.maketext('Next step[comment,Label introducing the required post-purchase action]') %]
                        </p>
                        <p id="domainSearchModalSuccessNoteAdd"
                           class="domain-search-modal__next-step-text"
                           ng-if="canAddDomain">
                            [% locale.maketext('After you’ve purchased your domain, make sure to add it to [asis,cPanel] to start using it.') %]
                        </p>
                        <p id="domainSearchModalSuccessNote"
                           class="domain-search-modal__next-step-text"
                           ng-if="!canAddDomain">
                            [% locale.maketext('After you’ve purchased your domain, return to [asis,cPanel] to add it and start using it.') %]
                        </p>
                    </div>
                </div>
            </div>
            <!-- "Go Back" returns to the search results so the user can buy
                 another domain; it does not add the just-purchased one, which
                 they can still add manually later. "Add Domain" adds it now.
                 The header ✕ and Escape close the whole modal. The "Done"
                 fallback replaces "Add Domain" only when no add-domain handler
                 was supplied, so the panel always offers a forward
                 action. -->
            <div class="domain-search-modal__confirmation-actions">
                <button type="button"
                        class="btn btn-link domain-search-modal__go-back"
                        ng-click="cancelPurchaseConfirmation()"
                        data-testid="domain-search-redirect-success-back">
                    <i class="fas fa-arrow-left" aria-hidden="true"></i>
                    [% locale.maketext('Go Back') %]
                </button>
                <button type="button"
                        ng-if="canAddDomain"
                        class="btn btn-primary domain-search-modal__confirmation-continue"
                        ng-click="addPurchasedDomain()"
                        data-testid="domain-search-redirect-success-add-btn">
                    <i class="fas fa-plus" aria-hidden="true"></i>
                    [% locale.maketext('Add Domain') %]
                </button>
                <button type="button"
                        ng-if="!canAddDomain"
                        class="btn btn-primary domain-search-modal__confirmation-continue"
                        ng-click="dismissRedirectSuccess()"
                        data-testid="domain-search-redirect-success-done-btn">
                    [% locale.maketext('Done') %]
                </button>
            </div>
        </div>
    </div>

    <!-- Redirection Failed overlay -->
    <div class="domain-search-modal__overlay"
         ng-if="redirectFailed"
         ng-keydown="handleFailureKeydown($event)"
         data-testid="domain-search-failure-overlay">
        <div class="domain-search-modal__confirmation domain-search-modal__confirmation--error"
             role="alertdialog"
             aria-modal="true"
             aria-labelledby="domainSearchModalFailureTitle"
             aria-describedby="domainSearchModalFailureDesc"
             data-testid="domain-search-failure">
            <div class="domain-search-modal__confirmation-header">
                <span class="domain-search-modal__confirmation-icon"
                      aria-hidden="true">
                    <img class="domain-search-modal__confirmation-icon-img"
                         src="images/redirect-error.svg"
                         alt="" />
                </span>
                <h2 id="domainSearchModalFailureTitle"
                    class="domain-search-modal__confirmation-title"
                    tabindex="-1">
                    [% locale.maketext('Redirection Failed') %]
                </h2>
            </div>
            <div class="domain-search-modal__confirmation-body">
                <p id="domainSearchModalFailureDesc"
                   class="domain-search-modal__confirmation-intro">
                    [% locale.maketext('Try again.') %]
                </p>
            </div>
            <div class="domain-search-modal__confirmation-actions domain-search-modal__confirmation-actions--end">
                <button type="button"
                        class="btn btn-primary domain-search-modal__confirmation-continue"
                        ng-click="dismissRedirectFailure()"
                        data-testid="domain-search-failure-continue-btn">
                    [% locale.maketext('Continue') %]
                </button>
            </div>
        </div>
    </div>
</div>
Back to Directory