You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

AppOrderSelectorElement.vue 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <template>
  2. <li :data-cy-app-order-element="app.id"
  3. :class="{
  4. 'order-selector-element': true,
  5. 'order-selector-element--disabled': app.default
  6. }">
  7. <svg width="20"
  8. height="20"
  9. viewBox="0 0 20 20"
  10. role="presentation">
  11. <image preserveAspectRatio="xMinYMin meet"
  12. x="0"
  13. y="0"
  14. width="20"
  15. height="20"
  16. :xlink:href="app.icon"
  17. class="order-selector-element__icon" />
  18. </svg>
  19. <div class="order-selector-element__label">
  20. {{ app.label ?? app.id }}
  21. </div>
  22. <div class="order-selector-element__actions">
  23. <NcButton v-show="!isFirst && !app.default"
  24. :aria-label="t('settings', 'Move up')"
  25. data-cy-app-order-button="up"
  26. type="tertiary-no-background"
  27. @click="$emit('move:up')">
  28. <template #icon>
  29. <IconArrowUp :size="20" />
  30. </template>
  31. </NcButton>
  32. <div v-show="isFirst || !!app.default" aria-hidden="true" class="order-selector-element__placeholder" />
  33. <NcButton v-show="!isLast && !app.default"
  34. :aria-label="t('settings', 'Move down')"
  35. data-cy-app-order-button="down"
  36. type="tertiary-no-background"
  37. @click="$emit('move:down')">
  38. <template #icon>
  39. <IconArrowDown :size="20" />
  40. </template>
  41. </NcButton>
  42. <div v-show="isLast || !!app.default" aria-hidden="true" class="order-selector-element__placeholder" />
  43. </div>
  44. </li>
  45. </template>
  46. <script lang="ts">
  47. import { translate as t } from '@nextcloud/l10n'
  48. import { PropType, defineComponent } from 'vue'
  49. import IconArrowDown from 'vue-material-design-icons/ArrowDown.vue'
  50. import IconArrowUp from 'vue-material-design-icons/ArrowUp.vue'
  51. import NcButton from '@nextcloud/vue/dist/Components/NcButton.js'
  52. interface IApp {
  53. id: string // app id
  54. icon: string // path to the icon svg
  55. label?: string // display name
  56. default?: boolean // for app as default app
  57. }
  58. export default defineComponent({
  59. name: 'AppOrderSelectorElement',
  60. components: {
  61. IconArrowDown,
  62. IconArrowUp,
  63. NcButton,
  64. },
  65. props: {
  66. app: {
  67. type: Object as PropType<IApp>,
  68. required: true,
  69. },
  70. isFirst: {
  71. type: Boolean,
  72. default: false,
  73. },
  74. isLast: {
  75. type: Boolean,
  76. default: false,
  77. },
  78. },
  79. emits: {
  80. 'move:up': () => true,
  81. 'move:down': () => true,
  82. },
  83. setup() {
  84. return {
  85. t,
  86. }
  87. },
  88. })
  89. </script>
  90. <style lang="scss" scoped>
  91. .order-selector-element {
  92. // hide default styling
  93. list-style: none;
  94. // Align children
  95. display: flex;
  96. flex-direction: row;
  97. align-items: center;
  98. // Spacing
  99. gap: 12px;
  100. padding-inline: 12px;
  101. &:hover {
  102. background-color: var(--color-background-hover);
  103. border-radius: var(--border-radius-large);
  104. }
  105. &--disabled {
  106. border-color: var(--color-text-maxcontrast);
  107. color: var(--color-text-maxcontrast);
  108. .order-selector-element__icon {
  109. opacity: 75%;
  110. }
  111. }
  112. &__actions {
  113. flex: 0 0;
  114. display: flex;
  115. flex-direction: row;
  116. gap: 6px;
  117. }
  118. &__label {
  119. flex: 1 1;
  120. text-overflow: ellipsis;
  121. overflow: hidden;
  122. }
  123. &__placeholder {
  124. height: 44px;
  125. width: 44px;
  126. }
  127. &__icon {
  128. filter: var(--background-invert-if-bright);
  129. }
  130. }
  131. </style>