Skip to content

Commit ecb8ab4

Browse files
authored
Merge pull request #154 from simonredfern/develop
Banks drop down and move debug items to Help
2 parents 75bea4c + d11a7a9 commit ecb8ab4

File tree

9 files changed

+437
-29
lines changed

9 files changed

+437
-29
lines changed

.rules

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Do NOT create summary documents, implementation notes, architecture diagrams, or extensive documentation UNLESS explicitly asked to do so by the user.

components.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ declare module 'vue' {
3838
ElMain: typeof import('element-plus/es')['ElMain']
3939
ElRow: typeof import('element-plus/es')['ElRow']
4040
ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
41-
ElTable: typeof import('element-plus/es')['ElTable']
42-
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
4341
ElTag: typeof import('element-plus/es')['ElTag']
4442
ElTooltip: typeof import('element-plus/es')['ElTooltip']
4543
GlossarySearchNav: typeof import('./src/components/GlossarySearchNav.vue')['default']

src/components/Content.vue

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ const summary = ref('')
5050
const tags = ref<string[]>([])
5151
const allTags = ref<string[]>([])
5252
const resourceDocs = inject(obpResourceDocsKey)
53-
const displayPrev = ref(true)
54-
const displayNext = ref(true)
53+
const displayPrev = ref(false)
54+
const displayNext = ref(false)
5555
const prev = ref({ id: 'prev' })
5656
const next = ref({ id: 'next' })
5757
const favoriteButtonStyle = ref('favorite favoriteButton')
@@ -319,18 +319,18 @@ onBeforeRouteUpdate(async (to) => {
319319
<el-divider class="divider" />
320320
<el-row>
321321
<el-col :span="12" class="pager-left">
322-
<el-icon v-show="displayPrev">
322+
<el-icon v-if="displayPrev">
323323
<ArrowLeftBold />
324324
</el-icon>
325-
<RouterLink v-show="displayPrev" class="pager-router-link"
325+
<RouterLink v-if="displayPrev" class="pager-router-link"
326326
:to="{ name: 'api', params: { version: prev.version }, query: { operationid: prev.id } }">{{ prev.title }}
327327
</RouterLink>
328328
</el-col>
329329
<el-col :span="12" class="pager-right">
330-
<RouterLink v-show="displayNext" class="pager-router-link"
330+
<RouterLink v-if="displayNext" class="pager-router-link"
331331
:to="{ name: 'api', params: { version: next.version }, query: { operationid: next.id } }">{{ next.title }}
332332
</RouterLink>
333-
<el-icon v-show="displayNext">
333+
<el-icon v-if="displayNext">
334334
<ArrowRightBold />
335335
</el-icon>
336336
</el-col>

src/components/HeaderNav.vue

Lines changed: 67 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<script setup lang="ts">
2929
import { ref, inject, watchEffect, onMounted, onUnmounted, computed } from 'vue'
3030
import { useRoute, useRouter } from 'vue-router'
31-
import { OBP_API_DEFAULT_RESOURCE_DOC_VERSION, getCurrentUser } from '../obp'
31+
import { OBP_API_DEFAULT_RESOURCE_DOC_VERSION, getCurrentUser, getOBPBanks } from '../obp'
3232
import { getOBPAPIVersions } from '../obp/api-version'
3333
import {
3434
LOGO_URL as logoSource,
@@ -60,8 +60,28 @@ const combinedMessageDocs = computed(() => {
6060
return [...regularDocs, ...jsonSchemaDocs]
6161
})
6262
63-
// Debug menu items
64-
const debugMenuItems = ref(['/debug/providers-status', '/debug/oidc'])
63+
// Help menu items (includes debug pages)
64+
const helpMenuItems = ref(['/help', '/debug/providers-status', '/debug/oidc'])
65+
66+
// Banks state
67+
const banks = ref<Array<{ bank_id: string; bank_code: string; full_name: string }>>([])
68+
const bankItems = computed(() =>
69+
[...banks.value]
70+
.sort((a, b) => (a.full_name || a.bank_id || '').localeCompare(b.full_name || b.bank_id || ''))
71+
.map(b => {
72+
const name = b.full_name || b.bank_id || ''
73+
const id = b.bank_id || ''
74+
return name !== id ? `${name} | ${id}` : id
75+
})
76+
)
77+
const selectedBankId = ref(localStorage.getItem('obp-selected-bank-id') || '')
78+
const banksDropdownLabel = computed(() => {
79+
if (selectedBankId.value) {
80+
const bank = banks.value.find(b => b.bank_id === selectedBankId.value)
81+
return bank ? (bank.full_name || bank.bank_id) : 'Banks'
82+
}
83+
return 'Banks'
84+
})
6585
6686
// Split versions into main and other
6787
const mainVersions = ['BGv1.3', 'BGv2', 'OBPv5.1.0', 'OBPv6.0.0', 'UKv3.1', 'dynamic-endpoints', 'dynamic-entities', 'OBPdynamic-endpoint', 'OBPdynamic-entity']
@@ -227,6 +247,9 @@ const handleMore = (command: string, source?: string) => {
227247
// Regular message docs (connector names contain underscores)
228248
console.log('Navigating to message docs:', command)
229249
router.push({ name: 'message-docs', params: { id: command } })
250+
} else if (command === '/help') {
251+
console.log('Navigating to help page')
252+
router.push('/help')
230253
} else if (command.startsWith('/debug/')) {
231254
console.log('Navigating to debug page:', command)
232255
router.push(command)
@@ -238,7 +261,28 @@ const handleMore = (command: string, source?: string) => {
238261
}
239262
}
240263
264+
const handleBankSelect = (item: string) => {
265+
// Extract bank_id from display format "full_name | bank_id" or just "bank_id"
266+
const parts = item.split(' | ')
267+
const bankId = parts[parts.length - 1]
268+
const bank = banks.value.find(b => b.bank_id === bankId)
269+
if (bank) {
270+
selectedBankId.value = bank.bank_id
271+
localStorage.setItem('obp-selected-bank-id', bank.bank_id)
272+
window.dispatchEvent(new CustomEvent('obp-bank-selected', { detail: bank.bank_id }))
273+
}
274+
}
275+
241276
onMounted(async () => {
277+
// Fetch banks
278+
getOBPBanks().then((data) => {
279+
if (data && data.banks && Array.isArray(data.banks)) {
280+
banks.value = data.banks
281+
}
282+
}).catch((error) => {
283+
console.error('Failed to fetch banks:', error)
284+
})
285+
242286
// Fetch available providers
243287
await fetchAvailableProviders()
244288
@@ -292,9 +336,24 @@ const getCurrentPath = () => {
292336
<RouterLink class="router-link" id="header-nav-glossary" to="/glossary">{{
293337
$t('header.glossary')
294338
}}</RouterLink>
295-
<RouterLink class="router-link" id="header-nav-help" to="/help">{{
296-
$t('header.help')
297-
}}</RouterLink>
339+
<SvelteDropdown
340+
class="menu-right"
341+
id="header-nav-help"
342+
label="Help"
343+
:items="helpMenuItems"
344+
:hover-color="headerLinksHoverColor"
345+
:background-color="headerLinksBackgroundColor"
346+
@select="handleMore"
347+
/>
348+
<SvelteDropdown
349+
class="menu-right"
350+
id="header-nav-banks"
351+
:label="banksDropdownLabel"
352+
:items="bankItems"
353+
:hover-color="headerLinksHoverColor"
354+
:background-color="headerLinksBackgroundColor"
355+
@select="handleBankSelect"
356+
/>
298357
<a v-if="showObpApiManagerButton && hasObpApiManagerHost" v-bind:href="obpApiManagerHost" class="router-link" id="header-nav-api-manager">
299358
{{ $t('header.api_manager') }}
300359
</a>
@@ -316,15 +375,6 @@ const getCurrentPath = () => {
316375
:background-color="headerLinksBackgroundColor"
317376
@select="handleMore"
318377
/>
319-
<SvelteDropdown
320-
class="menu-right"
321-
id="header-nav-debug"
322-
label="Debug"
323-
:items="debugMenuItems"
324-
:hover-color="headerLinksHoverColor"
325-
:background-color="headerLinksBackgroundColor"
326-
@select="handleMore"
327-
/>
328378
<!--<span class="el-dropdown-link">
329379
<RouterLink class="router-link" id="header-nav-spaces" to="/spaces">{{
330380
$t('header.spaces')
@@ -529,7 +579,8 @@ button.login-button-disabled {
529579
/* Custom dropdown containers */
530580
#header-nav-versions,
531581
#header-nav-message-docs,
532-
#header-nav-debug {
582+
#header-nav-help,
583+
#header-nav-banks {
533584
display: inline-block;
534585
vertical-align: middle;
535586
}

src/components/Preview.vue

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
-->
2727

2828
<script setup lang="ts">
29-
import { ref, reactive, inject, onBeforeMount } from 'vue'
29+
import { ref, reactive, inject, onBeforeMount, onMounted, onUnmounted } from 'vue'
3030
import { onBeforeRouteUpdate, useRoute } from 'vue-router'
3131
import { getOperationDetails } from '../obp/resource-docs'
3232
import { ElNotification, FormInstance } from 'element-plus'
@@ -73,6 +73,13 @@ const requestForm = reactive({ url: '' })
7373
const roleFormRef = reactive<FormInstance>({})
7474
const roleForm = reactive({})
7575
76+
const replaceUrlPlaceholders = () => {
77+
const selectedBankId = localStorage.getItem('obp-selected-bank-id')
78+
if (selectedBankId && url.value) {
79+
url.value = url.value.replace(/BANK_ID/g, selectedBankId)
80+
}
81+
}
82+
7683
const setOperationDetails = (id: string, version: string): void => {
7784
const operation = getOperationDetails(version, id, resourceDocs)
7885
@@ -93,6 +100,7 @@ const setOperationDetails = (id: string, version: string): void => {
93100
} else {
94101
url.value = operation?.specified_url
95102
}
103+
replaceUrlPlaceholders()
96104
method.value = operation?.request_verb
97105
exampleRequestBody.value = operation.example_request_body
98106
requiredRoles.value = operation.roles || []
@@ -609,6 +617,21 @@ onBeforeRouteUpdate(async (to) => {
609617
setRoleForm()
610618
})
611619
620+
const onBankSelected = (event: Event) => {
621+
const bankId = (event as CustomEvent).detail
622+
if (bankId && url.value) {
623+
url.value = url.value.replace(/BANK_ID/g, bankId)
624+
}
625+
}
626+
627+
onMounted(() => {
628+
window.addEventListener('obp-bank-selected', onBankSelected)
629+
})
630+
631+
onUnmounted(() => {
632+
window.removeEventListener('obp-bank-selected', onBankSelected)
633+
})
634+
612635
const copyToClipboard = () => {
613636
// Create a temporary text area to hold the content
614637
const textArea = document.createElement('textarea');

src/components/SvelteDropdown.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,16 @@ onBeforeUnmount(() => {
8787
8888
// Watch for prop changes and update Svelte component
8989
watch(
90-
() => props.items,
91-
(newItems) => {
90+
() => [props.items, props.label],
91+
([newItems, newLabel]) => {
9292
if (svelteComponent && containerRef.value) {
9393
// Remount with new props
9494
unmount(svelteComponent)
9595
svelteComponent = mount(Dropdown, {
9696
target: containerRef.value,
9797
props: {
98-
label: props.label,
99-
items: newItems,
98+
label: newLabel as string,
99+
items: newItems as string[],
100100
hoverColor: props.hoverColor,
101101
backgroundColor: props.backgroundColor
102102
}

src/obp/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,3 +199,11 @@ export async function getMyAPICollectionsEndpoint(collectionName: string): Promi
199199
`/obp/${OBP_API_VERSION}/my/api-collections/${collectionName}/api-collection-endpoints`
200200
)
201201
}
202+
203+
export async function getAPICollectionEndpoints(collectionId: string): Promise<any> {
204+
return await get(`obp/v6.0.0/api-collections/${collectionId}/api-collection-endpoints`)
205+
}
206+
207+
export async function getOBPBanks(): Promise<any> {
208+
return await get(`obp/v6.0.0/banks`)
209+
}

src/router/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import MessageDocsListView from '../views/MessageDocsListView.vue'
3333
import MessageDocsJsonSchemaView from '../views/MessageDocsJsonSchemaView.vue'
3434
import MessageDocsJsonSchemaListView from '../views/MessageDocsJsonSchemaListView.vue'
3535
import BodyView from '../views/BodyView.vue'
36+
import CollectionView from '../views/CollectionView.vue'
3637
import Content from '../components/Content.vue'
3738
import Preview from '../components/Preview.vue'
3839
import NotFoundView from '../views/NotFoundView.vue'
@@ -140,6 +141,21 @@ export default async function router(): Promise<any> {
140141
name: 'callback',
141142
component: isServerActive ? BodyView : InternalServerErrorView
142143
},
144+
{
145+
path: '/collections/:id',
146+
name: 'collection-view',
147+
component: isServerActive ? CollectionView : InternalServerErrorView,
148+
children: [
149+
{
150+
path: '',
151+
name: 'collection-api',
152+
components: {
153+
body: Content,
154+
preview: Preview
155+
}
156+
}
157+
]
158+
},
143159
{ path: '/api-server-error', name: 'apiServerError', component: APIServerErrorView },
144160
{ path: '/:pathMatch(.*)*', name: 'notFound', component: NotFoundView }
145161
]

0 commit comments

Comments
 (0)