ai/agent-chat/conversation-picker.component.ts

Metadata

Relationships

<div class="card-header d-flex a-i-center gap-4 separator flex-no-shrink">
  <div class="flex-grow min-width-0">
    @if (selectedConversation()) {
      <c8y-input-group-editable
        ariaLabel="Conversation title"
        [ngModel]="selectedConversation()!.title"
        formGroupClass="m-b-0"
        [maxLength]="100"
        (save)="updateConversationTitle($event)"
      ></c8y-input-group-editable>
    } @else {
      <p class="conversation-picker__placeholder text-truncate text-muted">
        {{ 'New conversation' | translate }}
      </p>
    }
  </div>

  <ng-content></ng-content>

  <div
    class="dropdown flex-no-shrink"
    #convDropdown="bs-dropdown"
    dropdown
    c8yDropdownFocusTrap
    [insideClick]="true"
  >
    <button
      class="btn btn-icon dropdown-toggle"
      [attr.aria-label]="'Conversation history' | translate"
      [tooltip]="'Conversation history' | translate"
      placement="top"
      container="body"
      type="button"
      #historyToggle
      [adaptivePosition]="false"
      [delay]="500"
      dropdownToggle
    >
      <i c8yIcon="history"></i>
    </button>
    <div
      class="dropdown-menu dropdown-menu-right conversation-picker__menu"
      *dropdownMenu
    >
      <div class="sticky-top separator-bottom p-8">
        <p class="p-b-8 p-l-8">
          <strong>{{ 'Conversations' | translate }}</strong>
        </p>
        <div class="input-group input-group-search input-group-sm">
          <input
            class="form-control"
            [attr.aria-label]="'Search conversations' | translate"
            type="text"
            [value]="searchTerm()"
            [placeholder]="'Search…' | translate"
            (input)="onSearchInput($any($event.target).value)"
          />
          <span class="input-group-btn">
            <button
              class="btn btn-clean"
              [title]="(searchTerm() ? 'Clear search' : 'Search') | translate"
              type="button"
              data-dropdown-keep-open
              (click)="clearSearch()"
            >
              <i [c8yIcon]="searchTerm() ? 'close' : 'search'"></i>
            </button>
          </span>
        </div>
      </div>

      @if (isLoadingConversations()) {
        <div class="p-16 text-center">
          <c8y-loading></c8y-loading>
        </div>
      } @else if ((conversationPage()?.data?.length ?? 0) === 0) {
        <!-- The list changes as the user types in the search, so announce the empty result. -->
        <div
          class="p-16"
          role="status"
        >
          @if (searchTerm()) {
            <c8y-ui-empty-state
              [icon]="'search'"
              [title]="'No results to display.' | translate"
              [subtitle]="'Adjust or clear the search.' | translate"
              [horizontal]="true"
            ></c8y-ui-empty-state>
          } @else {
            <c8y-ui-empty-state
              [icon]="'history'"
              [title]="'No conversations to display.' | translate"
              [horizontal]="true"
            ></c8y-ui-empty-state>
          }
        </div>
      } @else {
        <ul class="list-unstyled m-0">
          @for (conv of conversationPage()!.data; track conv.id) {
            @let isSelected = conv.id === selectedConversation()?.id;
            <li
              class="conversation-picker__item d-flex a-i-center gap-8 p-t-8 p-b-8 p-l-16 p-r-16 separator-bottom"
              [class.conversation-picker__item--active]="isSelected"
            >
              <button
                class="btn-clean d-col flex-grow min-width-0 text-left"
                [attr.aria-current]="isSelected ? 'true' : null"
                type="button"
                (click)="convDropdown.hide(); selectConversation(conv)"
              >
                <span class="text-truncate">
                  <c8y-highlight
                    [text]="conv.title"
                    [pattern]="searchTerm()"
                  ></c8y-highlight>
                </span>
                @if (conv.updatedAt) {
                  <small class="text-muted text-nowrap">{{ conv.updatedAt | c8yDate }}</small>
                }
              </button>
              <c8y-popover-confirm
                class="flex-no-shrink showOnHover"
                [class.open]="rowConfirm.isOpen"
                [title]="'Delete conversation' | translate"
                [placement]="'bottom'"
                [outsideClick]="true"
                #rowConfirm
              >
                <button
                  class="btn-icon btn btn-sm"
                  [attr.aria-label]="'Delete conversation' | translate"
                  [tooltip]="'Delete conversation' | translate"
                  container="body"
                  aria-haspopup="dialog"
                  type="button"
                  [adaptivePosition]="false"
                  [delay]="500"
                  (click)="$event.stopPropagation(); confirmAndDelete(rowConfirm, conv)"
                >
                  <i c8yIcon="trash"></i>
                </button>
              </c8y-popover-confirm>
            </li>
          }
        </ul>
        @if (conversationPage()?.paging?.next) {
          <button
            class="btn btn-default btn-block m-t-8 m-b-8"
            [class.btn-pending]="isLoadingMore()"
            type="button"
            data-dropdown-keep-open
            [disabled]="isLoadingMore()"
            (click)="loadMoreConversations()"
          >
            {{ loadMoreConversationsLabel | translate }}
          </button>
        }
      }
    </div>
  </div>

  <c8y-popover-confirm
    class="flex-no-shrink"
    [title]="'Delete conversation' | translate"
    [placement]="'bottom'"
    [outsideClick]="true"
    [adaptivePosition]="true"
    #headerConfirm
  >
    <button
      class="btn btn-icon"
      [attr.aria-label]="'Delete conversation' | translate"
      [tooltip]="'Delete conversation' | translate"
      container="body"
      aria-haspopup="dialog"
      type="button"
      [adaptivePosition]="false"
      [delay]="500"
      [disabled]="!selectedConversation()"
      (click)="confirmAndDelete(headerConfirm, selectedConversation())"
    >
      <i c8yIcon="trash"></i>
    </button>
  </c8y-popover-confirm>
</div>

results matching ""

    No results matching ""