|
18 | 18 | <template> |
19 | 19 | <div> |
20 | 20 | <a-spin :spinning="fetchLoading"> |
21 | | - <!-- Add Extension Provider button: only shown when extension is registered but NSP not yet created --> |
22 | | - <a-button |
23 | | - v-if="isExtensionTab && !nsps[tabKey]" |
24 | | - :disabled="!('addNetworkServiceProvider' in $store.getters.apis)" |
25 | | - type="dashed" |
26 | | - style="width: 100%; margin-bottom: 12px;" |
27 | | - @click="handleAddExternalNetworkProvider"> |
28 | | - <template #icon><plus-outlined /></template> |
29 | | - {{ $t('label.add.external.network.provider') }} |
30 | | - </a-button> |
31 | 21 | <a-tabs |
32 | 22 | :tabPosition="device === 'mobile' ? 'top' : 'left'" |
33 | 23 | :animated="false" |
|
75 | 65 | </a-tabs> |
76 | 66 | </a-spin> |
77 | 67 |
|
78 | | - <!-- Add External Network Provider modal: selects extension (services come from extension capabilities) --> |
79 | | - <a-modal |
80 | | - :visible="showAddExtNetProviderModal" |
81 | | - :title="$t('label.add.external.network.provider')" |
82 | | - :maskClosable="false" |
83 | | - :footer="null" |
84 | | - @cancel="showAddExtNetProviderModal = false"> |
85 | | - <a-spin :spinning="extensionProviderLoading"> |
86 | | - <a-form layout="vertical"> |
87 | | - <a-form-item :label="$t('label.extension')"> |
88 | | - <a-select |
89 | | - v-model:value="extNetProviderForm.extensionId" |
90 | | - showSearch |
91 | | - optionFilterProp="label" |
92 | | - :filterOption="(input, option) => option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0"> |
93 | | - <a-select-option |
94 | | - v-for="ext in availableExtensions" |
95 | | - :key="ext.id" |
96 | | - :value="ext.id" |
97 | | - :label="ext.name"> |
98 | | - {{ ext.name }} <span style="color: #aaa">({{ ext.state }})</span> |
99 | | - </a-select-option> |
100 | | - </a-select> |
101 | | - <div v-if="availableExtensions.length === 0" style="color: #faad14; margin-top: 4px;"> |
102 | | - {{ $t('message.no.network.orchestrator.extensions') }} |
103 | | - </div> |
104 | | - <div v-else style="color: #8c8c8c; font-size: 12px; margin-top: 4px;"> |
105 | | - {{ $t('message.extension.services.from.capabilities') }} |
106 | | - </div> |
107 | | - </a-form-item> |
108 | | - <div class="action-button"> |
109 | | - <a-button @click="showAddExtNetProviderModal = false">{{ $t('label.cancel') }}</a-button> |
110 | | - <a-button type="primary" :disabled="!extNetProviderForm.extensionId" @click="handleAddExtNetProvider">{{ $t('label.ok') }}</a-button> |
111 | | - </div> |
112 | | - </a-form> |
113 | | - </a-spin> |
114 | | - </a-modal> |
115 | | - |
116 | 68 | <div v-if="showFormAction"> |
117 | 69 | <keep-alive v-if="currentAction.component"> |
118 | 70 | <a-modal |
@@ -241,12 +193,6 @@ export default { |
241 | 193 | showFormAction: false, |
242 | 194 | currentAction: {}, |
243 | 195 | tabKey: 'BaremetalDhcpProvider', |
244 | | - showAddExtNetProviderModal: false, |
245 | | - extensionProviderLoading: false, |
246 | | - availableExtensions: [], |
247 | | - extNetProviderForm: { |
248 | | - extensionId: null |
249 | | - }, |
250 | 196 | registeredExtensions: [] |
251 | 197 | } |
252 | 198 | }, |
@@ -1223,56 +1169,9 @@ export default { |
1223 | 1169 | this.form = reactive({}) |
1224 | 1170 | this.rules = reactive({}) |
1225 | 1171 | }, |
1226 | | - handleAddExternalNetworkProvider () { |
1227 | | - // Open the extension picker modal — services come from extension capabilities |
1228 | | - this.extNetProviderForm = { extensionId: null } |
1229 | | - this.extensionProviderLoading = true |
1230 | | - this.showAddExtNetProviderModal = true |
1231 | | - getAPI('listExtensions', { type: 'NetworkOrchestrator' }).then(json => { |
1232 | | - this.availableExtensions = (json.listextensionsresponse && json.listextensionsresponse.extension) || [] |
1233 | | - if (this.availableExtensions.length > 0) { |
1234 | | - this.extNetProviderForm.extensionId = this.availableExtensions[0].id |
1235 | | - } |
1236 | | - }).catch(error => { |
1237 | | - this.$notifyError(error) |
1238 | | - }).finally(() => { |
1239 | | - this.extensionProviderLoading = false |
1240 | | - }) |
1241 | | - }, |
1242 | 1172 | _updateServicesFromExtension (extensionId) { |
1243 | 1173 | // No longer needed — services are derived from extension capabilities server-side |
1244 | 1174 | }, |
1245 | | - async handleAddExtNetProvider () { |
1246 | | - if (this.extensionProviderLoading) return |
1247 | | - const extensionId = this.extNetProviderForm.extensionId |
1248 | | - if (!extensionId) { |
1249 | | - this.$message.error(this.$t('message.select.extension')) |
1250 | | - return |
1251 | | - } |
1252 | | - const ext = this.availableExtensions.find(e => e.id === extensionId) |
1253 | | - const extName = ext ? ext.name : '' |
1254 | | - if (!extName) { |
1255 | | - this.$message.error(this.$t('message.select.extension')) |
1256 | | - return |
1257 | | - } |
1258 | | -
|
1259 | | - this.extensionProviderLoading = true |
1260 | | - try { |
1261 | | - // registerExtension auto-creates the NSP (Enabled) with services from network.service.capabilities |
1262 | | - await postAPI('registerExtension', { |
1263 | | - extensionid: extensionId, |
1264 | | - resourceid: this.resource.id, |
1265 | | - resourcetype: 'PhysicalNetwork' |
1266 | | - }) |
1267 | | - this.$message.success(this.$t('label.add.external.network.provider') + ': ' + extName) |
1268 | | - this.showAddExtNetProviderModal = false |
1269 | | - this.fetchData() |
1270 | | - } catch (error) { |
1271 | | - this.$notifyError(error) |
1272 | | - } finally { |
1273 | | - this.extensionProviderLoading = false |
1274 | | - } |
1275 | | - }, |
1276 | 1175 | fetchData () { |
1277 | 1176 | if (!this.resource || !('id' in this.resource)) { |
1278 | 1177 | return |
|
0 commit comments