-
-
-
- {{ item.website }}
-
+
+
+
+
+
+
+
{{ item.telefoonnummer }}
+
+
+
+ KvK: {{ item.kvkNummer }}
+
-
@@ -230,6 +464,12 @@ export default {
color: var(--color-main-text);
}
+.cardHeaderActions {
+ display: flex;
+ gap: 8px;
+ align-items: center;
+}
+
.organisatieContent {
display: flex;
flex-direction: column;
@@ -285,6 +525,11 @@ export default {
color: #f57c00;
}
+.statusBadge.status-deactief {
+ background: #ffebee;
+ color: #c62828;
+}
+
.organisatieDescription {
line-height: 1.4;
}
@@ -325,13 +570,156 @@ export default {
text-decoration: underline;
}
+.contactCountRow {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding-top: 8px;
+ border-top: 1px solid var(--color-border-dark);
+}
+
.contactCount {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
color: var(--color-text-lighter);
- padding-top: 8px;
+}
+
+.viewToggleContainer {
+ display: flex;
+}
+
+.contactpersonenView {
+ padding-top: 12px;
border-top: 1px solid var(--color-border-dark);
}
-
+
+.contactpersonenHeader {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 12px;
+}
+
+.contactpersonenHeader h3 {
+ margin: 0;
+ font-size: 16px;
+ font-weight: 600;
+ color: var(--color-main-text);
+}
+
+.contactpersonenList {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+}
+
+.contactItem {
+ border: 1px solid var(--color-border);
+ border-radius: var(--border-radius-large);
+ padding: 12px;
+ background: var(--color-main-background);
+}
+
+.contactHeader {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 8px;
+}
+
+.contactName {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--color-main-text);
+}
+
+.contactDetails {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.contactDetail {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-size: 13px;
+ color: var(--color-main-text);
+}
+
+.contactLabel {
+ font-weight: 600;
+ color: var(--color-text-lighter);
+}
+
+/* Contactpersonen Table Styles */
+.contactpersonenTable {
+ margin-bottom: 16px;
+}
+
+.contactTable {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 13px;
+}
+
+.contactTable th {
+ background: var(--color-background-dark);
+ color: var(--color-text-lighter);
+ font-weight: 600;
+ text-align: left;
+ padding: 8px 12px;
+ border-bottom: 1px solid var(--color-border);
+}
+
+.contactTable td {
+ padding: 8px 12px;
+ border-bottom: 1px solid var(--color-border-light);
+ vertical-align: top;
+}
+
+.contactRow:hover {
+ background: var(--color-background-dark);
+}
+
+.contactNameCell {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ font-weight: 600;
+}
+
+.contactLink {
+ color: var(--color-primary);
+ text-decoration: none;
+}
+
+.contactLink:hover {
+ text-decoration: underline;
+}
+
+.aanspreekpuntBadge {
+ background: var(--color-primary-light);
+ color: var(--color-primary-element-text);
+ padding: 2px 6px;
+ border-radius: var(--border-radius-pill);
+ font-size: 11px;
+ font-weight: 600;
+}
+
+/* Hide table on small screens, show list */
+@media (max-width: 768px) {
+ .contactpersonenTable {
+ display: none;
+ }
+}
+
+@media (min-width: 769px) {
+ .contactpersonenList {
+ display: none;
+ }
+}
+
+
\ No newline at end of file
diff --git a/src/dialogs/Dialogs.vue b/src/dialogs/Dialogs.vue
index 9a1f187c..320f43d0 100644
--- a/src/dialogs/Dialogs.vue
+++ b/src/dialogs/Dialogs.vue
@@ -3,6 +3,7 @@
+
@@ -16,6 +17,7 @@
import { navigationStore } from '../store/store.js'
import DeleteObject from '../modals/object/DeleteObject.vue'
import DownloadObject from '../modals/object/DownloadObject.vue'
+import ChangeOrganisatieStatusDialog from '../modals/object/ChangeOrganisatieStatusDialog.vue'
import MassDeleteObject from '../modals/object/MassDeleteObject.vue'
import MassPublishObjects from '../modals/object/MassPublishObjects.vue'
import MassDepublishObjects from '../modals/object/MassDepublishObjects.vue'
@@ -28,6 +30,7 @@ export default {
components: {
DeleteObject,
DownloadObject,
+ ChangeOrganisatieStatusDialog,
MassDeleteObject,
MassPublishObjects,
MassDepublishObjects,
diff --git a/src/modals/object/ChangeOrganisatieStatusDialog.vue b/src/modals/object/ChangeOrganisatieStatusDialog.vue
new file mode 100644
index 00000000..9c4705a5
--- /dev/null
+++ b/src/modals/object/ChangeOrganisatieStatusDialog.vue
@@ -0,0 +1,164 @@
+/**
+ * ChangeOrganisatieStatusDialog.vue
+ * Dialog for changing organisatie status with confirmation
+ * @category Components
+ * @package softwarecatalog
+ * @author Ruben Linde
+ * @copyright 2024
+ * @license AGPL-3.0-or-later
+ * @version 1.0.0
+ * @link https://github.com/opencatalogi/softwarecatalog
+ */
+
+
+
+
+
+
+ Weet je zeker dat je de status van {{ getOrganisatieName() }} wilt wijzigen naar {{ navigationStore.dialogProperties?.newStatus }}?
+
+
+ Deze organisatie wordt geactiveerd en zal zichtbaar zijn voor gebruikers.
+
+
+ Deze organisatie wordt gedeactiveerd en zal niet meer zichtbaar zijn voor gebruikers.
+
+
+
+
+ Status succesvol gewijzigd naar {{ navigationStore.dialogProperties?.newStatus }}
+
+
+ {{ error }}
+
+
+
+
+
+
+
+ {{ success === null ? 'Annuleren' : 'Sluiten' }}
+
+
+
+
+
+
+
+ {{ navigationStore.dialogProperties?.action === 'activeren' ? 'Activeren' : 'Deactiveren' }}
+
+
+
+
+
+
+
+
diff --git a/src/navigation/MainMenu.vue b/src/navigation/MainMenu.vue
index cd7ebb9c..5a31c49d 100644
--- a/src/navigation/MainMenu.vue
+++ b/src/navigation/MainMenu.vue
@@ -1,63 +1,330 @@
-
-
-
-
-
-
-
-
+
+
-
+
-
-
-
-
-
-
+
+
+
-
+
+
+
diff --git a/src/views/ObjectIndex.vue b/src/views/ObjectIndex.vue
new file mode 100644
index 00000000..36d87d19
--- /dev/null
+++ b/src/views/ObjectIndex.vue
@@ -0,0 +1,351 @@
+
+
+
+
+
diff --git a/src/views/Views.vue b/src/views/Views.vue
index 3cbaba22..28acc8ab 100644
--- a/src/views/Views.vue
+++ b/src/views/Views.vue
@@ -1,37 +1,141 @@
-
-
-
+
+
+
-
-
-
+
+
+
+
+
+
+
Settings
+
Settings page would go here
+
+
+
+
+
+
diff --git a/src/views/organisaties/OrganisatieIndex.vue b/src/views/organisaties/OrganisatieIndex.vue
index e59b1b77..76c3e24c 100644
--- a/src/views/organisaties/OrganisatieIndex.vue
+++ b/src/views/organisaties/OrganisatieIndex.vue
@@ -16,22 +16,28 @@ import OrganisatieCard from '../../components/cards/OrganisatieCard.vue'
-
+
+
+
+
+
diff --git a/src/views/settings/Settings.vue b/src/views/settings/Settings.vue
index 0570ba46..f29c5f5a 100644
--- a/src/views/settings/Settings.vue
+++ b/src/views/settings/Settings.vue
@@ -71,6 +71,55 @@
:size="64"
appearance="dark" />
+
+
+
+
+
+
Catalog Location
+
Set the base URL for your catalog interface
+
+
+
+
+
+
+
+
+
+ This URL will be used for "Go to organisation" links. The system will append "/beheer" to this URL.
+
+
+
+
+
+
+
+
+
+
+ Save Catalog Location
+
+
+
+
+
+
+
+
@@ -82,8 +131,10 @@ import {
NcSelect,
NcButton,
NcLoadingIcon,
+ NcTextField,
} from '@nextcloud/vue'
import Save from 'vue-material-design-icons/ContentSave.vue'
+import Web from 'vue-material-design-icons/Web.vue'
/**
* @class Settings
@@ -106,7 +157,9 @@ export default defineComponent({
NcSelect,
NcButton,
NcLoadingIcon,
+ NcTextField,
Save,
+ Web,
},
/**
@@ -118,6 +171,7 @@ export default defineComponent({
return {
loading: true,
saving: false,
+ savingCatalogLocation: false,
loadingConfiguration: false,
configurationResults: null,
settings: {
@@ -125,10 +179,13 @@ export default defineComponent({
openRegisters: false,
availableRegisters: [],
configuration: {},
+ catalogLocation: '',
},
selectedRegister: null,
configuration: {},
schemaOptions: [],
+ catalogLocation: '',
+ originalCatalogLocation: '',
}
},
@@ -171,6 +228,15 @@ export default defineComponent({
return this.schemaOptions.filter(option => !usedSchemaIds.includes(option.value))
},
+
+ /**
+ * Check if catalog location has changed
+ *
+ * @return {boolean} True if catalog location has changed
+ */
+ catalogLocationChanged() {
+ return this.catalogLocation !== this.originalCatalogLocation
+ },
},
/**
@@ -193,6 +259,10 @@ export default defineComponent({
const data = await response.json()
this.settings = data
+ // Initialize catalog location
+ this.catalogLocation = data.catalogLocation || ''
+ this.originalCatalogLocation = this.catalogLocation
+
// Initialize configuration object
this.initializeConfiguration()
@@ -450,6 +520,52 @@ export default defineComponent({
this.loadingConfiguration = false
}
},
+
+ /**
+ * Handle catalog location input change
+ *
+ * @param {string} value - New catalog location value
+ * @return {void}
+ */
+ onCatalogLocationChange(value) {
+ this.catalogLocation = value
+ },
+
+ /**
+ * Save catalog location to backend
+ *
+ * @async
+ * @return {Promise
}
+ */
+ async saveCatalogLocation() {
+ if (!this.catalogLocationChanged) {
+ return
+ }
+
+ this.savingCatalogLocation = true
+ try {
+ const response = await fetch('/index.php/apps/softwarecatalog/api/settings/catalog-location', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ catalogLocation: this.catalogLocation,
+ }),
+ })
+
+ if (response.ok) {
+ this.originalCatalogLocation = this.catalogLocation
+ console.info('Catalog location saved successfully')
+ } else {
+ console.error('Failed to save catalog location')
+ }
+ } catch (error) {
+ console.error('Failed to save catalog location:', error)
+ } finally {
+ this.savingCatalogLocation = false
+ }
+ },
},
})
@@ -492,4 +608,20 @@ export default defineComponent({
justify-content: center;
margin: 2rem 0;
}
+
+.catalog-location-section {
+ margin-bottom: 2rem;
+ max-width: 500px;
+}
+
+.catalog-location-help {
+ margin-top: 0.5rem;
+ margin-bottom: 1rem;
+}
+
+.help-text {
+ font-size: 12px;
+ color: var(--color-text-lighter);
+ margin: 0;
+}
diff --git a/src/views/settings/SoftwareCatalogSettings.vue b/src/views/settings/SoftwareCatalogSettings.vue
index 29dc8a23..d0833492 100644
--- a/src/views/settings/SoftwareCatalogSettings.vue
+++ b/src/views/settings/SoftwareCatalogSettings.vue
@@ -11,6 +11,43 @@
+
+
+
+
+
Software Catalog Location
+
Set the base URL for your software catalog interface
+
+
+
+
+
+
+
+
+
+ This URL will be used for external links to your software catalog. The system will append "/beheer" to this URL for management interfaces.
+
+
+
+
+
@@ -30,8 +67,15 @@
+
+
diff --git a/src/views/settings/sections/ArchiMateImportExport.vue b/src/views/settings/sections/ArchiMateImportExport.vue
index b7f41eb5..ebaf0dad 100644
--- a/src/views/settings/sections/ArchiMateImportExport.vue
+++ b/src/views/settings/sections/ArchiMateImportExport.vue
@@ -14,243 +14,364 @@
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
- -->
+-->
-
-
-