From 8545649a53bbe24010d5301b67f4c352d31739d0 Mon Sep 17 00:00:00 2001
From: Alexander Kaschta <alexander.kaschta9@kit.edu>
Date: Mon, 11 Nov 2024 18:36:14 +0100
Subject: [PATCH] WIP: BCDRequestForm

---
 src/components/BCDRequestForm.vue | 77 ++++++++++++++++++++++---------
 src/locales/de.json               |  7 +--
 src/locales/en.json               |  7 +--
 3 files changed, 56 insertions(+), 35 deletions(-)

diff --git a/src/components/BCDRequestForm.vue b/src/components/BCDRequestForm.vue
index 991dc65f6..703c07ae7 100644
--- a/src/components/BCDRequestForm.vue
+++ b/src/components/BCDRequestForm.vue
@@ -46,7 +46,9 @@
               <b-form-select-option :value="null" disabled>{{ $t('system.please_select') }}</b-form-select-option>
             </template>
           </b-form-select>
-          <b-form-invalid-feedback :state="load_balancer_firewall_state">{{ $t('components.bcd_request_form.level_2_warning') }}</b-form-invalid-feedback>
+          <b-form-invalid-feedback :state="load_balancer_firewall_state">
+            {{ $t('components.bcd_request_form.level_2_warning') }}
+          </b-form-invalid-feedback>
         </b-form-group>
         <b-form-group :label="$t('components.bcd_request_form.protection_requirements_explanation')">
           <b-form-textarea :disabled="protection_requirements_select !== 10 || loading_edit_action"
@@ -70,11 +72,13 @@
                            v-model="types_of_systems_other_explanation_text"/>
         </b-form-group>
         <b-form-group :label="$t('components.bcd_request_form.load_balancing')">
-            <b-form-checkbox :disabled="types_of_systems_select !== 2 || loading_edit_action"
-                             :state="load_balancer_firewall_state"
-                             v-model="load_balancing_value">{{ $t('components.bcd_request_form.load_balancing_text') }}
-            </b-form-checkbox>
-            <b-form-invalid-feedback :state="load_balancer_firewall_state">{{ $t('components.bcd_request_form.level_2_warning') }}</b-form-invalid-feedback>
+          <b-form-checkbox :disabled="types_of_systems_select !== 2 || loading_edit_action"
+                           :state="load_balancer_firewall_state"
+                           v-model="load_balancing_value">{{ $t('components.bcd_request_form.load_balancing_text') }}
+          </b-form-checkbox>
+          <b-form-invalid-feedback :state="load_balancer_firewall_state">
+            {{ $t('components.bcd_request_form.level_2_warning') }}
+          </b-form-invalid-feedback>
         </b-form-group>
         <b-form-group :label="$t('components.bcd_request_form.name_of_bcd')"
                       :description="$t('components.bcd_request_form.name_of_bcd_description')">
@@ -123,7 +127,8 @@
                            :disabled="!access_from_internet_value || types_of_systems_select === 2 || loading_edit_action"/>
         </b-form-group>
         <b-form-group :label="$t('components.bcd_request_form.ip_address_version')">
-          <b-form-select v-model="types_of_subnets_select" :options="translated_types_of_subnets">
+          <b-form-select v-model="types_of_subnets_select" :options="translated_types_of_subnets"
+                         :disabled="!(bcd_name && bcd_name.length > 0) || loading_edit_action">
             <template #first>
               <b-form-select-option :value="null" disabled>{{ $t('system.please_select') }}</b-form-select-option>
             </template>
@@ -140,7 +145,8 @@
           </b-row>
         </b-alert>
         <b-form-group :label="$t('components.bcd_request_form.ipv4_subnet_size')">
-          <b-form-select v-model="subnet_size_select" :options="translated_subnet_sizes">
+          <b-form-select v-model="subnet_size_select" :options="translated_subnet_sizes"
+                         :disabled="!(types_of_subnets_select === 2) || loading_edit_action">
             <template #first>
               <b-form-select-option :value="null" disabled>{{ $t('system.please_select') }}</b-form-select-option>
             </template>
@@ -156,17 +162,25 @@
             </b-col>
           </b-row>
         </b-alert>
-        <b-form-group :label="$t('components.bcd_request_form.ipv4_subnet_size_explanation')">
-          <b-form-textarea/>
+        <b-form-group :label="$t('components.bcd_request_form.ipv4_subnet_size_explanation')"
+                      :disabled="subnet_size_select !== 24">
+          <b-form-textarea :placeholder="$t('components.bcd_request_form.placeholder_text')"/>
         </b-form-group>
         <b-form-group :label="$t('system.dhcp')" :description="$t('components.bcd_request_form.dhcp_wish_note')">
-          <b-form-checkbox>{{ $t('components.bcd_request_form.dhcp_wish') }}</b-form-checkbox>
+          <b-form-checkbox v-model="dhcp_wish_value" :disabled="!types_of_subnets_select || loading_edit_action">
+            {{ $t('components.bcd_request_form.dhcp_wish') }}
+          </b-form-checkbox>
         </b-form-group>
         <b-form-group :label="$t('components.bcd_request_form.dhcp_own')">
-          <b-form-checkbox>{{ $t('components.bcd_request_form.dhcp_own_question') }}</b-form-checkbox>
+          <b-form-checkbox v-model="dhcp_own_server_value" :disabled="!dhcp_wish_value || loading_edit_action">
+            {{ $t('components.bcd_request_form.dhcp_own_question') }}
+          </b-form-checkbox>
         </b-form-group>
         <b-form-group :label="$t('components.bcd_request_form.dhcp_pool')">
-          <b-form-checkbox>{{ $t('components.bcd_request_form.dhcp_pool_wish') }}</b-form-checkbox>
+          <b-form-checkbox v-model="dhcp_pool_wish_value"
+                           :disabled="dhcp_own_server_value || !dhcp_wish_value || loading_edit_action">
+            {{ $t('components.bcd_request_form.dhcp_pool_wish') }}
+          </b-form-checkbox>
         </b-form-group>
         <b-form-group :label="$t('components.bcd_request_form.dhcp_pool_size')">
           <b-form-select v-model="dhcp_pool_size_select" :options="translated_dhcp_pool_size">
@@ -196,7 +210,7 @@
           </a></b-form-checkbox>
         </b-form-group>
         <b-form-group :label="$t('components.bcd_request_form.additional_comments')">
-          <b-form-textarea/>
+          <b-form-textarea :placeholder="$t('components.bcd_request_form.placeholder_text')"/>
         </b-form-group>
       </b-form>
     </b-overlay>
@@ -206,6 +220,7 @@
 <script>
 import Typeahead from '@/components/Typeahead.vue'
 import OUService from '@/api-services/ou.service'
+import ipaddress from '@/util/ipaddress'
 
 export default {
   name: 'BCDRequestForm',
@@ -226,13 +241,10 @@ export default {
       access_to_internet_value: null,
       access_from_internet_value: null,
       access_from_internet_explanation_value: null,
+      dhcp_pool_wish_value: null,
       dhcp_pool_size_select: null,
-      dhcp_pool_size_options: [
-        { value: 2, translation_key: 'components.bcd_request_form.dhcp_pool_sizes.size_2' },
-        { value: 3, translation_key: 'components.bcd_request_form.dhcp_pool_sizes.size_3' },
-        { value: 4, translation_key: 'components.bcd_request_form.dhcp_pool_sizes.size_4' },
-        { value: 5, translation_key: 'components.bcd_request_form.dhcp_pool_sizes.size_5' }
-      ],
+      dhcp_own_server_value: null,
+      dhcp_wish_value: null,
       protection_requirements_select: null,
       protection_requirements_explanation_text: null,
       protection_requirements_options: [
@@ -268,7 +280,21 @@ export default {
   },
   computed: {
     translated_dhcp_pool_size() {
-      return this.translateOptions(this.dhcp_pool_size_options)
+      // Calculate the number of ipv4 addresses
+      const subnet_size = ipaddress.ipv4_subnet_size(this.subnet_size_select ?? 29)
+
+      const dhcp_pool_size_options = []
+
+      for (let dhcp_pool_size = 2; dhcp_pool_size <= subnet_size - 5; dhcp_pool_size++) {
+        // Generate the entries dynamically
+        dhcp_pool_size_options.push({
+          value: dhcp_pool_size,
+          translation_key: 'components.bcd_request_form.dhcp_pool_address_count',
+          translation_args: { number: dhcp_pool_size }
+        })
+      }
+
+      return this.translateOptions(dhcp_pool_size_options)
     },
     translated_protection_requirements() {
       return this.translateOptions(this.protection_requirements_options)
@@ -362,8 +388,13 @@ export default {
         // Check if the item is an object to apply translations to
         if (typeof copy_element === 'object') {
           if (Object.hasOwn(copy_element, 'translation_key')) {
-            // Generate the text of the item dynamically
-            copy_element.text = this.$t(copy_element.translation_key)
+            if (Object.hasOwn(copy_element, 'translation_args')) {
+              // Generate the text of the item dynamically
+              copy_element.text = this.$t(copy_element.translation_key, copy_element.translation_args)
+            } else {
+              // Generate the text of the item dynamically
+              copy_element.text = this.$t(copy_element.translation_key)
+            }
           }
         }
       }
diff --git a/src/locales/de.json b/src/locales/de.json
index 11ebcd73c..2f0e329f1 100644
--- a/src/locales/de.json
+++ b/src/locales/de.json
@@ -38,12 +38,7 @@
       "dhcp_own_question": "Wird ein eigener DHCP-Server betrieben?",
       "dhcp_pool": "DHCP-Pool",
       "dhcp_pool_size": "Wie groß soll der DHCP-Pool sein?",
-      "dhcp_pool_sizes": {
-        "size_2": "2 Adressen",
-        "size_3": "3 Adressen",
-        "size_4": "4 Adressen",
-        "size_5": "5 Adressen"
-      },
+      "dhcp_pool_address_count": "{number} Adressen",
       "dhcp_pool_wish": "Wird zusätzlich ein DHCP-Pool gewünscht?",
       "dhcp_wish": "Wird DHCP gewünscht?",
       "dhcp_wish_note": "Statische Zuordnungen sind möglich.",
diff --git a/src/locales/en.json b/src/locales/en.json
index 810778e36..c23eaf05a 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -38,12 +38,7 @@
       "dhcp_own_question": "Do you operate your own DHCP server?",
       "dhcp_pool": "DHCP-Pool",
       "dhcp_pool_size": "How large should the DHCP pool be?",
-      "dhcp_pool_sizes": {
-        "size_2": "2 addresses",
-        "size_3": "3 addresses",
-        "size_4": "4 addresses",
-        "size_5": "5 addresses"
-      },
+      "dhcp_pool_address_count": "{number} addresses",
       "dhcp_pool_wish": "Is a DHCP pool also desired?",
       "dhcp_wish": "Is DHCP wished?",
       "dhcp_wish_note": "Static assignments are possible.",
-- 
GitLab