• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Freegle / Iznik / 11495

09 May 2026 07:35AM UTC coverage: 69.06% (-3.8%) from 72.847%
11495

Pull #408

circleci

edwh
docs(migration): mark restartproject and repaircafewales as migrated (PR #408)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pull Request #408: feat(batch): migrate check_cgas, visualise, tn_sync + dry-run improvements

9127 of 10554 branches covered (86.48%)

Branch coverage included in aggregate %.

507 of 663 new or added lines in 16 files covered. (76.47%)

11902 existing lines in 138 files now uncovered.

101630 of 149824 relevant lines covered (67.83%)

19.56 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.43
/iznik-nuxt3/components/NotificationOptions.vue
1
<template>
1✔
2
  <b-dropdown
1✔
3
    id="notification-list"
1✔
4
    ref="theel"
1✔
5
    v-model="notificationsShown"
1✔
6
    class="white text-center notification-list topstack"
1✔
7
    :variant="smallScreen ? 'transparent' : ''"
1✔
8
    toggle-class="notification-list__dropdown-toggle p-xl-0"
1✔
9
    menu-class="notification-list__dropdown-menu"
1✔
10
    lazy
1✔
11
    right
1✔
12
    no-caret
1✔
13
    aria-label="notifications"
1✔
14
    @shown="loadLatestNotifications"
1✔
15
  >
16
    <template #button-content>
1✔
17
      <div
1✔
18
        class="position-relative me-md-2 me-xl-0"
1✔
19
        :class="{ 'text-center small': !smallScreen }"
1✔
20
      >
21
        <v-icon icon="bell" class="fa-2 notification-list__icon" />
1✔
22
        <b-badge
1✔
23
          v-if="unreadNotificationCount"
1✔
24
          variant="danger"
1✔
25
          class="notification-badge"
1✔
26
        >
27
          {{ unreadNotificationCount }}
1✔
28
        </b-badge>
1✔
29
        <div v-if="!smallScreen" class="nav-item__text">Notifications</div>
1✔
30
      </div>
1✔
31
    </template>
32
    <b-dropdown-item
1✔
33
      v-if="notifications.length"
1✔
34
      link-class="notification-list__item"
1✔
35
    >
36
      <div class="d-flex justify-content-end">
1✔
37
        <b-button variant="secondary" size="sm" @click="markAllRead">
1✔
38
          Mark all read
39
        </b-button>
1✔
40
      </div>
1✔
41
    </b-dropdown-item>
1✔
42
    <b-dropdown-divider />
1✔
43
    <b-dropdown-item
1✔
44
      v-for="notification in notificationsToShow"
1✔
45
      :key="'notification-' + notification.id"
1✔
46
      link-class="notification-list__item p-1"
1✔
47
    >
48
      <NotificationOne :id="notification.id" @show-modal="showAboutMe" />
1✔
49
    </b-dropdown-item>
1✔
50
    <infinite-loading
1✔
51
      :key="infiniteId"
1✔
52
      :distance="distance"
1✔
53
      force-use-infinite-wrapper="#notification-list"
1✔
54
      @infinite="loadMoreNotifications"
1✔
55
    >
56
      <template #no-results />
1✔
57
      <template #no-more />
1✔
58
      <template #spinner>
1✔
59
        <Spinner :size="50" />
1✔
60
      </template>
61
    </infinite-loading>
1✔
62
  </b-dropdown>
1✔
63
</template>
64
<script setup>
65
import { ref, watch, computed, defineAsyncComponent } from 'vue'
1✔
66
import { storeToRefs } from 'pinia'
1✔
67
import { useNotificationStore } from '~/stores/notification'
1✔
68

69
const InfiniteLoading = defineAsyncComponent(() =>
1✔
UNCOV
70
  import('~/components/InfiniteLoading')
×
71
)
1✔
72
const NotificationOne = defineAsyncComponent(() =>
1✔
UNCOV
73
  import('~/components/NotificationOne')
×
74
)
1✔
75

76
const notificationStore = useNotificationStore()
1✔
77

78
defineProps({
79
  distance: {
80
    type: Number,
81
    required: true,
82
  },
83
  smallScreen: {
84
    type: Boolean,
85
    required: false,
86
    default: false,
87
  },
88
})
89

90
const notificationsShown = ref(false)
1✔
91
const toShow = ref(5)
1✔
92
const infiniteId = ref(0)
1✔
93
const notifications = computed(() => {
1✔
94
  // return first
19✔
95
  return notificationStore.list
19✔
96
})
19✔
97
const notificationsToShow = computed(() => {
1✔
98
  return notifications.value.slice(0, toShow.value)
19✔
99
})
19✔
100

101
const { count } = storeToRefs(notificationStore)
1✔
102
const unreadNotificationCount = count
1✔
103

104
const theel = ref(null)
1✔
105

106
const loadLatestNotifications = async () => {
1✔
107
  // We want to make sure we have the most up to date notifications.
1✔
108
  await notificationStore.fetchList()
1✔
109
  infiniteId.value++
1✔
110
  toShow.value = 5
1✔
111

112
  if (theel.value) {
1✔
113
    theel.value.scrollTop = 0
1✔
114
  }
1✔
115
}
1✔
116

117
const loadMoreNotifications = ($state) => {
1✔
118
  if (toShow.value < notifications.value.length) {
×
UNCOV
119
    toShow.value = Math.min(notifications.value.length, toShow.value + 5)
×
UNCOV
120
    $state.loaded()
×
UNCOV
121
  } else {
×
UNCOV
122
    $state.complete()
×
UNCOV
123
  }
×
UNCOV
124
}
×
125
const markAllRead = async () => {
1✔
126
  await notificationStore.allSeen()
1✔
127
}
1✔
128

129
const emit = defineEmits([
1✔
130
  'update:notificationsShown',
131
  'update:unreadNotificationCount',
132
  'showAboutMe',
133
])
134

135
watch(unreadNotificationCount, (newVal) => {
1✔
136
  emit('update:unreadNotificationCount', newVal)
33✔
137
})
33✔
138

139
watch(notificationsShown, (newVal) => {
1✔
140
  emit('update:notificationsShown', newVal)
×
UNCOV
141
})
×
142

143
const showAboutMe = () => {
1✔
144
  emit('showAboutMe')
1✔
145
}
1✔
146
</script>
147
<style scoped lang="scss">
148
@import 'bootstrap/scss/functions';
149
@import 'bootstrap/scss/variables';
150
@import 'bootstrap/scss/mixins/_breakpoints';
151

152
.notification-badge {
153
  position: absolute;
154
  top: 0px;
155
  left: 18px;
156

157
  @include media-breakpoint-up(xl) {
158
    left: 45px;
159
    top: 3px;
160
  }
161
}
162

163
.notification-list {
164
  max-width: 100%;
165
}
166

167
.notification-list__icon {
168
  height: 32px;
169
  margin-bottom: 0;
170
}
171

172
/* These classes style the bootstrap b-nav-item-dropdown component */
173
:deep(.notification-list__dropdown-toggle) {
174
  color: $color-white !important;
175
  transition: all var(--transition-fast);
176

177
  &:hover {
178
    color: $color-white-opacity-75 !important;
179
  }
180
}
181

182
:deep(.notification-list__dropdown-menu) {
183
  height: 500px;
184
  width: min(400px, 100vw) !important;
185
  overflow-y: auto;
186

187
  @include media-breakpoint-down(md) {
188
    width: 300px;
189
    right: -51px;
190
  }
191
}
192

193
.notification-list :deep(.dropdown-item) {
194
  width: min(400px, 100vw) !important;
195
  max-width: 100%;
196
  padding-left: 5px;
197
  overflow-wrap: break-word;
198
  // Remove Bootstrap borders - NotificationOne handles its own borders
199
  border: none !important;
200

201
  @include media-breakpoint-down(md) {
202
    width: 300px;
203
    right: -51px;
204
  }
205
}
206

207
// Reduce divider visibility to prevent flash
208
.notification-list :deep(.dropdown-divider) {
209
  margin: 0;
210
  border-color: transparent;
211
}
212

213
:deep(.dropdown-toggle.show) {
214
  border-color: transparent !important;
215
}
216

217
.topstack {
218
  z-index: 10000;
219
}
220
</style>
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc