index.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <RightFillPano>
  3. <ui-group borderBottom>
  4. <template #header>
  5. <ui-button @click="editTagging = createTagging()">
  6. <ui-icon type="add" />
  7. 新增
  8. </ui-button>
  9. </template>
  10. </ui-group>
  11. <ui-group title="标注">
  12. <template #icon>
  13. <ui-icon
  14. ctrl
  15. :class="{active: showSearch}"
  16. type="search"
  17. @click="showSearch = !showSearch"
  18. style="margin-right: 10px"
  19. />
  20. <ui-icon
  21. ctrl
  22. :type="custom.showTaggings ? 'eye-s' : 'eye-n'"
  23. @click="custom.showTaggings = !custom.showTaggings"
  24. />
  25. </template>
  26. <ui-group-option v-if="showSearch">
  27. <ui-input type="text" width="100%" placeholder="搜索" v-model="keyword">
  28. <template #preIcon>
  29. <ui-icon type="search" />
  30. </template>
  31. </ui-input>
  32. </ui-group-option>
  33. <TagingSign
  34. v-for="tagging in filterTaggings"
  35. :key="tagging.id"
  36. :tagging="tagging"
  37. :selected="selectTagging === tagging"
  38. @edit="editTagging = tagging"
  39. @delete="deleteTagging(tagging)"
  40. @select="selected => selectTagging = selected ? tagging : null"
  41. @fixed="fixedTagging(tagging)"
  42. />
  43. </ui-group>
  44. </RightFillPano>
  45. <Edit
  46. v-if="editTagging"
  47. :data="editTagging"
  48. @quit="editTagging = null"
  49. @save="saveHandler"
  50. />
  51. </template>
  52. <script lang="ts" setup>
  53. import Edit from './edit.vue'
  54. import TagingSign from './sign.vue'
  55. import { RightFillPano } from '@/layout'
  56. import { useViewStack } from '@/hook'
  57. import { computed, ref } from 'vue';
  58. import { router, RoutesName } from '@/router'
  59. import { custom } from '@/env'
  60. import {
  61. taggings,
  62. getTaggingStyle,
  63. Tagging,
  64. autoSaveTaggings,
  65. createTagging,
  66. getTaggingPositions,
  67. taggingPositions,
  68. isOld,
  69. save,
  70. getTagging
  71. } from '@/store'
  72. const showSearch = ref(false)
  73. const keyword = ref('')
  74. const filterTaggings = computed(() => taggings.value.filter(tagging => tagging.title.includes(keyword.value)))
  75. const editTagging = ref<Tagging | null>(null)
  76. const saveHandler = (tagging: Tagging) => {
  77. if (!editTagging.value) return;
  78. if (!getTagging(editTagging.value.id)) {
  79. taggings.value.push(tagging)
  80. const style = getTaggingStyle(tagging.styleId)
  81. if (style) {
  82. style.lastUse = 1
  83. }
  84. } else {
  85. Object.assign(editTagging.value, tagging)
  86. }
  87. editTagging.value = null
  88. }
  89. const deleteTagging = (tagging: Tagging) => {
  90. const index = taggings.value.indexOf(tagging)
  91. const positions = getTaggingPositions(tagging)
  92. taggingPositions.value = taggingPositions.value.filter(position => !positions.includes(position))
  93. taggings.value.splice(index, 1)
  94. }
  95. const fixedTagging = async (tagging: Tagging) => {
  96. if (isOld.value) {
  97. await save()
  98. }
  99. router.push({ name: RoutesName.taggingPosition, params: { id: tagging.id } })
  100. }
  101. const selectTagging = ref<Tagging | null>(null)
  102. useViewStack(autoSaveTaggings)
  103. </script>
  104. <style scoped>
  105. .active {
  106. color: var(--color-main-normal) !important;
  107. }
  108. </style>