We’ve migrated our documentation to a new site, which means some URLs have changed.
Subscriptions

Why is the Site Licensing Manage Users section in My Account now showing?

In case you are implementing Site Licensing and after going to the My Account section as a licensee representative and the Manage Users list is empty, you will need to have a look at the My Account Site Licensing Components template.

license.png

Reverting this template to its default version will effectively pull down the newest updates on the template for newly released or newly enabled features.

It's best to revert to default before you make any other customizations to the template (because reverting to default would remove those).

In case you've already customizations to this template, please replace the following part of the template's code:

HTML
<script type="text/ng-template" id="/widget/myaccount/partials/licensing/contract-list-selector-options.shtml">
  <div class="pn-licensing__dropdown-container" ng-show="contracts &amp;&amp; contracts.length">
    <ul class="pn-licensing__dropdown-list">
      <li class="pn-licensing__dropdown-list-item"
          ng-repeat="contract in contracts track by contract.contractId">
        <button
            type="button"
            class="pn-licensing__dropdown-item-button"
            ng-attr-data-e2e-contract="{{ contract.name }}"
            ng-class="{'pn-licensing__dropdown-item-button--checked': contract === selectedContract}"
            ng-click="onSelectContract(contract)"
        >
          {{ contract.name | tc: 'term.name' }}
        </button>
      </li>
    </ul>
  </div>
</script>

<script type="text/ng-template" id="/widget/myaccount/partials/licensing/contract-users-list.shtml">
<div>
  <div ng-if="usersLoaded">
    <input class="pn-contract-users__search"
           type="text"
           data-e2e="contract_users_search"
           ng-attr-placeholder="{{ 'Search' | t }}..."
           ng-disabled="isSearchDisabled"
           ng-model="usersSearch"
           ng-change="onSearchChange(usersSearch)"/>

    <div class="pn-contract-users-list__header pn-contract-user">
      <div class="pn-contract-user__email"
           data-e2e="contract_users_email_header"
           ng-click="onChangeOrder()">
        <t>Email address</t>
        <div class="pn-contract-user-email-sort" ng-class="'pn-contract-user-email-sort--' + orderDirection"></div>
      </div>
      <div class="pn-contract-user__fname">
        <t>First name</t>
      </div>
      <div class="pn-contract-user__lname">
        <t>Last name</t>
      </div>
      <div class="pn-contract-user__status">
        <t>Status</t>
      </div>
      <div class="pn-contract-user__actions"></div>
    </div>

    <div class="pn-contract-users-list__body"
         pn-two-way-infinite-scroll="handleScroll"
         pn-scroll-row-height="50"
         pn-scroll-offset="{{usersOffset}}"
         pn-scroll-threshold="20"
    >
      <contract-user ng-repeat="user in users track by user.contractUserId"
                     user="user"
                     ng-attr-data-e2e-contract-user-row="{{ user.contractUserId }}"
      ></contract-user>

      <div class="pn-contract-users-add" pn-sticky>
        <contract-user ng-if="showNewUserRow"></contract-user>
        <div class="pn-contract-users-add__button"
             data-e2e="add_user"
             ng-click="onShowNewUserRow()">
          <i class="pn-contract-users-add__plus"></i>
          <t>Add user</t>
        </div>
      </div>
    </div>
  </div>
</div>
</script>

<script type="text/ng-template" id="/widget/myaccount/partials/licensing/contract-user.shtml">
<div>
  <div ng-if="error" class="pn-contract-user-error">
    <div class="pn-contract-user-error__icon"></div>
    <div data-e2e="contract_user_error">{{ error }}</div>
  </div>
  <div class="pn-contract-user">
    <div class="pn-contract-user__email"
         ng-class="{'pn-contract-user__email--error': error || !isEditing &amp;&amp; user &amp;&amp; user.state === 'INVALID'}">
      <div ng-if="!isEditing || isEditing &amp;&amp; !canEditEmail"
           ng-class="{'pn-contract-user__email--readonly': !canEditEmail}">
        {{ user.email }}
      </div>
      <div ng-if="isEditing &amp;&amp; canEditEmail">
        <input type="text"
               autocomplete="off"
               ng-model="editedUser.email"
               ng-attr-placeholder="{{ 'Email address' | t }}..."
               data-e2e="contract_user_email"
               ng-keydown="handleInputKeydown($event)"/>
      </div>
    </div>
    <div class="pn-contract-user__fname">
      <div ng-if="!isEditing">{{ user.firstName }}</div>
      <div ng-if="isEditing">
        <input type="text"
               autocomplete="off"
               ng-model="editedUser.firstName"
               ng-attr-placeholder="{{ 'First name' | t }}..."
               data-e2e="contract_user_fname"
               ng-keydown="handleInputKeydown($event)"/>
      </div>
    </div>
    <div class="pn-contract-user__lname">
      <div ng-if="!isEditing">{{ user.lastName }}</div>
      <div ng-if="isEditing">
        <input type="text"
               autocomplete="off"
               ng-model="editedUser.lastName"
               ng-attr-placeholder="{{ 'Last name' | t }}..."
               data-e2e="contract_user_lname"
               ng-keydown="handleInputKeydown($event)"/>
      </div>
    </div>
    <div class="pn-contract-user__status"
         ng-class="{ 'pn-contract-user__status--invalid': user &amp;&amp; user.state === 'INVALID' }"
    >
      <div ng-if="!isEditing">{{ userStatus }}</div>
    </div>
    <div class="pn-contract-user__actions">
      <tp-menu ng-if="!isEditing"
               is-disabled="areActionsDisabled"
               data-e2e="contract_user_manage_button">
        <tp-menu-item ng-if="canEditUser"
                      ng-click="handleEditUser()"
                      data-e2e="user_button_edit">
          <t>Edit</t>
        </tp-menu-item>
        <tp-menu-item ng-if="canRevokeUser"
                      ng-click="handleRevokeUser(user)"
                      data-e2e="user_button_revoke">
          <t>Revoke</t>
        </tp-menu-item>
        <tp-menu-item ng-if="canRestoreUser"
                      ng-click="handleRestoreUser(user)"
                      data-e2e="user_button_restore">
          <t>Restore</t>
        </tp-menu-item>
        <tp-menu-item ng-if="canInviteUser"
                      ng-click="handleInviteUser(user)"
                      data-e2e="user_button_invite">
          <t>Invite</t>
        </tp-menu-item>
        <tp-menu-item ng-if="canRemoveUser"
                      ng-click="handleRemoveUser(user)"
                      data-e2e="user_button_remove">
          <t>Remove</t>
        </tp-menu-item>
      </tp-menu>

      <div class="pn-contract-user__controls" ng-if="isEditing">
        <div class="pn-contract-user__cancel" ng-click="handleEditCancel()"></div>
        <div class="pn-contract-user__submit" ng-click="handleEditSubmit()"></div>
      </div>
    </div>
  </div>
</div>
</script>

With this:

HTML
<script type="text/ng-template" id="/widget/myaccount/partials/licensing/contract-list-selector-options.shtml">
  <div class="pn-licensing__dropdown-container" ng-show="contracts &amp;&amp; contracts.length">
    <ul class="pn-licensing__dropdown-list">
      <li class="pn-licensing__dropdown-list-item"
          ng-repeat="contract in contracts track by contract.contractId">
        <button
            type="button"
            class="pn-licensing__dropdown-item-button"
            ng-attr-data-e2e-contract="{{ contract.name }}"
            ng-click="onSelectContract(contract)"
        >
          {{ contract.name | tc: 'term.name' }}
          <div ng-if="contract === selectedContract" class="pn-icon pn-icon--tick"></div>
        </button>
      </li>
    </ul>
  </div>
</script>

<script type="text/ng-template" id="/widget/myaccount/partials/licensing/contract-users-list.shtml">
<div>
  <pn-list
    columns-config="columnsConfig"
    scroll-config="scrollConfig"
    search-config="searchConfig"
    items-provider="itemsProvider"
    new-item-config="newItemConfig"
    edit-item="editUser"
    adapter="listAdapter"
    empty-state-text="{{ 'No users to show' | t }}"
    item-menu-action="itemMenuAction"
    data-e2e="contract_users_list"
  ></pn-list>
</div>
</script>

If after updating this template's code the Site licensing Manage users section in My Account still doesn't show, you would need to revert also the template My account common components back to its default version.

This can be done in the Piano dashboard under ManageTemplates → selecting the My account common components template → clicking Revert to default:

image

Last updated: