logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://hacktivis.me/git/pleroma-fe.git

emoji_picker.vue (5405B)


  1. <template>
  2. <Popover
  3. ref="popover"
  4. trigger="click"
  5. popover-class="emoji-picker popover-default"
  6. :trigger-attrs="{ 'aria-hidden': true, tabindex: -1 }"
  7. @show="onPopoverShown"
  8. @close="onPopoverClosed"
  9. >
  10. <template #content>
  11. <div class="heading">
  12. <!--
  13. Body scroll lock needs to be on every scrollable element on safari iOS.
  14. Here we tell it to enable scrolling for this element.
  15. See https://github.com/willmcpo/body-scroll-lock#vanilla-js
  16. -->
  17. <span
  18. ref="header"
  19. v-body-scroll-lock="isInModal"
  20. class="emoji-tabs"
  21. >
  22. <span
  23. v-for="group in filteredEmojiGroups"
  24. :ref="setGroupRef('group-header-' + group.id)"
  25. :key="group.id"
  26. class="button-unstyled emoji-tabs-item"
  27. :class="{
  28. toggled: activeGroupView === group.id
  29. }"
  30. :title="group.text"
  31. role="button"
  32. @click.prevent="highlight(group.id)"
  33. >
  34. <span
  35. v-if="group.image"
  36. class="emoji-picker-header-image"
  37. >
  38. <still-image
  39. :alt="group.text"
  40. :src="group.image"
  41. />
  42. </span>
  43. <FAIcon
  44. v-else
  45. :icon="group.icon"
  46. fixed-width
  47. />
  48. </span>
  49. </span>
  50. <span
  51. v-if="stickerPickerEnabled"
  52. class="additional-tabs"
  53. >
  54. <span
  55. class="button-unstyled stickers-tab-icon additional-tabs-item"
  56. :class="{toggled: showingStickers}"
  57. :title="$t('emoji.stickers')"
  58. @click.prevent="toggleStickers"
  59. >
  60. <FAIcon
  61. icon="sticky-note"
  62. fixed-width
  63. />
  64. </span>
  65. </span>
  66. </div>
  67. <div
  68. v-if="contentLoaded"
  69. class="content"
  70. >
  71. <div
  72. class="emoji-content"
  73. :class="{hidden: showingStickers}"
  74. >
  75. <div class="emoji-search">
  76. <input
  77. ref="search"
  78. v-model="keyword"
  79. type="text"
  80. class="input form-control"
  81. :placeholder="$t('emoji.search_emoji')"
  82. @input="$event.target.composing = false"
  83. >
  84. </div>
  85. <!-- Enables scrolling for this element on safari iOS. See comments for header. -->
  86. <DynamicScroller
  87. ref="emoji-groups"
  88. v-body-scroll-lock="isInModal"
  89. class="emoji-groups"
  90. :class="groupsScrolledClass"
  91. :min-item-size="minItemSize"
  92. :items="emojiItems"
  93. :emit-update="true"
  94. @update="onScroll"
  95. @visible="recalculateItemPerRow"
  96. @resize="recalculateItemPerRow"
  97. >
  98. <template #default="{ item: group, index, active }">
  99. <DynamicScrollerItem
  100. :ref="setGroupRef('group-' + group.id)"
  101. :item="group"
  102. :active="active"
  103. :data-index="index"
  104. :size-dependencies="[group.emojis.length]"
  105. >
  106. <div
  107. class="emoji-group"
  108. >
  109. <h6
  110. v-if="group.isFirstRow"
  111. class="emoji-group-title"
  112. >
  113. {{ group.text }}
  114. </h6>
  115. <span
  116. v-for="emoji in group.emojis"
  117. :key="group.id + emoji.displayText"
  118. :title="maybeLocalizedEmojiName(emoji)"
  119. class="emoji-item"
  120. role="button"
  121. @click.stop.prevent="onEmoji(emoji)"
  122. >
  123. <span
  124. v-if="!emoji.imageUrl"
  125. class="emoji-picker-emoji -unicode"
  126. >{{ emoji.replacement }}</span>
  127. <still-image
  128. v-else
  129. class="emoji-picker-emoji -custom"
  130. loading="lazy"
  131. :alt="maybeLocalizedEmojiName(emoji)"
  132. :src="emoji.imageUrl"
  133. :data-emoji-name="group.id + emoji.displayText"
  134. />
  135. </span>
  136. </div>
  137. </DynamicScrollerItem>
  138. </template>
  139. </DynamicScroller>
  140. <div class="keep-open">
  141. <Checkbox v-model="keepOpen">
  142. {{ $t('emoji.keep_open') }}
  143. </Checkbox>
  144. </div>
  145. <div
  146. v-if="!hideCustomEmoji"
  147. class="hide-custom-emoji"
  148. >
  149. <Checkbox
  150. v-model="hideCustomEmojiInPicker"
  151. @change="onShowing"
  152. >
  153. {{ $t('emoji.hide_custom_emoji') }}
  154. </Checkbox>
  155. </div>
  156. </div>
  157. <div
  158. v-if="showingStickers"
  159. class="stickers-content"
  160. >
  161. <sticker-picker
  162. @uploaded="onStickerUploaded"
  163. @upload-failed="onStickerUploadFailed"
  164. />
  165. </div>
  166. </div>
  167. </template>
  168. </Popover>
  169. </template>
  170. <script src="./emoji_picker.js"></script>
  171. <style lang="scss" src="./emoji_picker.scss"></style>