diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..fe76d727f1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,26 @@ +{ + "files.autoSave": "afterDelay", + "editor.defaultFormatter": "dbaeumer.vscode-eslint", + "editor.formatOnSave": true, + "eslint.format.enable": true, + "cSpell.words": [ + "depubliceren", + "Depubliceren", + "gedepubliceerd", + "Matadata", + "nextcloud", + "opencatalogi", + "organisation", + "Organisation", + "organisations", + "Organisations", + "pinia", + "Toegangs" + ], + "[javascript]": { + "editor.defaultFormatter": "dbaeumer.vscode-eslint" + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, +} diff --git a/css/main.css b/css/main.css index 19ef91a0ad..754ed28eee 100755 --- a/css/main.css +++ b/css/main.css @@ -5,7 +5,6 @@ } /* Pages */ - .pageHeader { margin-block-start: var(--app-navigation-padding); margin-inline-start: calc( @@ -16,13 +15,14 @@ } /* Lists */ - .listHeader { position: sticky; top: 0; z-index: 1000; background-color: var(--color-main-background); border-bottom: 1px solid var(--color-border); + display: flex; + align-items: center; } .searchField { @@ -37,6 +37,10 @@ } /* Detail pages */ +.detailHeader { + display: flex; + justify-content: space-between; +} .detailContainer { margin-block-start: var(--OC-margin-20); @@ -107,6 +111,11 @@ } /* Modals */ +.modalContent { + margin: var(--OC-margin-50); + text-align: center; +} + .form-group > * { margin-block-end: 10px; } @@ -127,7 +136,6 @@ } /* File drag and drop */ - .filesListDragDropNotice { width: 100%; min-height: 113px; diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..ae87405e1e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,42 @@ +version: "3.5" +volumes: + nextcloud: + apps: + db: + config: + +services: + db: + image: mariadb:10.6 + restart: always + command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW + volumes: + - db:/var/lib/mysql + environment: + - MYSQL_ROOT_PASSWORD='!ChangeMe!' + - MYSQL_PASSWORD='!ChangeMe!' + - MYSQL_DATABASE=nextcloud + - MYSQL_USER=nextcloud + + nextcloud: + user: root + container_name: nextcloud + image: nextcloud + restart: always + ports: + - 8080:80 + links: + - db + volumes: + - nextcloud:/var/www/html:rw + - ./custom-apps:/var/www/html/custom_apps + - .:/var/www/html/custom_apps/openregister + + environment: + - MYSQL_PASSWORD='!ChangeMe!' + - MYSQL_DATABASE=nextcloud + - MYSQL_USER=nextcloud + - MYSQL_HOST=db + - NEXTCLOUD_ADMIN_USER=admin + - NEXTCLOUD_ADMIN_PASSWORD=admin + - TZ=Europe/Amsterdam diff --git a/src/modals/Modals.vue b/src/modals/Modals.vue index 02ab25cf95..ce9bf3d7af 100755 --- a/src/modals/Modals.vue +++ b/src/modals/Modals.vue @@ -1,13 +1,20 @@ + + diff --git a/src/modals/register/DeleteRegister.vue b/src/modals/register/DeleteRegister.vue new file mode 100644 index 0000000000..7963ccbd15 --- /dev/null +++ b/src/modals/register/DeleteRegister.vue @@ -0,0 +1,97 @@ + + + + + + Wil je {{ registerStore.registerItem.title }} definitief verwijderen? Deze actie kan niet ongedaan worden gemaakt. + + + + Register succesvol verwijderd + + + {{ error }} + + + + + + + + {{ success ? 'Sluiten' : 'Annuleer' }} + + + + + + + Verwijderen + + + + + + diff --git a/src/modals/register/EditRegister.vue b/src/modals/register/EditRegister.vue new file mode 100644 index 0000000000..b7a642d4da --- /dev/null +++ b/src/modals/register/EditRegister.vue @@ -0,0 +1,199 @@ + + + + + + Register succesvol aangepast + + + {{ error }} + + + + + + + + + + + + + + + + {{ success ? 'Sluiten' : 'Annuleer' }} + + + + + + + + {{ registerStore.registerItem?.id ? 'Opslaan' : 'Aanmaken' }} + + + + + + diff --git a/src/store/modules/navigation.js b/src/store/modules/navigation.js index f2fd9d54b5..02ed852652 100755 --- a/src/store/modules/navigation.js +++ b/src/store/modules/navigation.js @@ -1,43 +1,41 @@ /* eslint-disable no-console */ import { defineStore } from 'pinia' -export const useNavigationStore = defineStore( - 'ui', { - state: () => ({ - // The currently active menu item, defaults to '' which triggers the dashboard - selected: 'dashboard', - // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time - modal: false, - // The currently active dialog - dialog: false, - // Any data needed in various models, dialogs, views which cannot be transferred through normal means or without writing crappy/excessive code - transferData: null, - }), - actions: { - setSelected(selected) { - this.selected = selected - console.log('Active menu item set to ' + selected) - }, - setSelectedCatalogus(selectedCatalogus) { - this.selectedCatalogus = selectedCatalogus - console.log('Active catalogus menu set to ' + selectedCatalogus) - }, - setModal(modal) { - this.modal = modal - console.log('Active modal set to ' + modal) - }, - setDialog(dialog) { - this.dialog = dialog - console.log('Active dialog set to ' + dialog) - }, - setTransferData(data) { - this.transferData = data - }, - getTransferData() { - const tempData = this.transferData - this.transferData = null - return tempData - }, +export const useNavigationStore = defineStore('ui', { + state: () => ({ + // The currently active menu item, defaults to '' which triggers the dashboard + selected: 'dashboard', + // The currently active modal, managed trough the state to ensure that only one modal can be active at the same time + modal: false, + // The currently active dialog + dialog: false, + // Any data needed in various models, dialogs, views which cannot be transferred through normal means or without writing crappy/excessive code + transferData: null, + }), + actions: { + setSelected(selected) { + this.selected = selected + console.log('Active menu item set to ' + selected) + }, + setSelectedCatalogus(selectedCatalogus) { + this.selectedCatalogus = selectedCatalogus + console.log('Active catalogus menu set to ' + selectedCatalogus) + }, + setModal(modal) { + this.modal = modal + console.log('Active modal set to ' + modal) + }, + setDialog(dialog) { + this.dialog = dialog + console.log('Active dialog set to ' + dialog) + }, + setTransferData(data) { + this.transferData = data + }, + getTransferData() { + const tempData = this.transferData + this.transferData = null + return tempData }, }, -) +}) diff --git a/src/store/modules/register.js b/src/store/modules/register.js index 7a90fd4db2..420ebcb028 100644 --- a/src/store/modules/register.js +++ b/src/store/modules/register.js @@ -2,128 +2,141 @@ import { defineStore } from 'pinia' import { Register } from '../../entities/index.js' -export const useRegisterStore = defineStore( - 'register', { - state: () => ({ - registerItem: false, - registerList: [], - }), - actions: { - setRegisterItem(registerItem) { - this.registerItem = registerItem && new Register(registerItem) - console.log('Active register item set to ' + registerItem) - }, - setRegisterList(registerList) { - this.registerList = registerList.map( - (registerItem) => new Register(registerItem), +export const useRegisterStore = defineStore('register', { + state: () => ({ + registerItem: false, + registerList: [], + }), + actions: { + setRegisterItem(registerItem) { + this.registerItem = registerItem && new Register(registerItem) + console.log('Active register item set to ' + registerItem) + }, + setRegisterList(registerList) { + this.registerList = registerList.map( + (registerItem) => new Register(registerItem), + ) + console.log('Register list set to ' + registerList.length + ' items') + }, + /* istanbul ignore next */ // ignore this for Jest until moved into a service + async refreshRegisterList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/openregister/api/registers' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch(endpoint, { + method: 'GET', + }) + .then( + (response) => { + response.json().then( + (data) => { + this.setRegisterList(data.results) + }, + ) + }, ) - console.log('Register list set to ' + registerList.length + ' items') - }, - /* istanbul ignore next */ // ignore this for Jest until moved into a service - async refreshRegisterList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/openregister/api/registers' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch(endpoint, { + .catch( + (err) => { + console.error(err) + }, + ) + }, + // New function to get a single register + async getRegister(id) { + const endpoint = `/index.php/apps/openregister/api/registers/${id}` + try { + const response = await fetch(endpoint, { method: 'GET', }) - .then( - (response) => { - response.json().then( - (data) => { - this.setRegisterList(data.results) - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - }, - ) - }, - // New function to get a single register - async getRegister(id) { - const endpoint = `/index.php/apps/openregister/api/registers/${id}` - try { - const response = await fetch(endpoint, { - method: 'GET', - }) - const data = await response.json() - this.setRegisterItem(data) - return data - } catch (err) { - console.error(err) - throw err - } - }, - // Delete a register - deleteRegister() { - if (!this.registerItem || !this.registerItem.id) { - throw new Error('No register item to delete') - } + const data = await response.json() + this.setRegisterItem(data) + return data + } catch (err) { + console.error(err) + throw err + } + }, + // Delete a register + async deleteRegister(registerItem) { + if (!registerItem.id) { + throw new Error('No register item to delete') + } - console.log('Deleting register...') + console.log('Deleting register...') - const endpoint = `/index.php/apps/openregister/api/registers/${this.registerItem.id}` + const endpoint = `/index.php/apps/openregister/api/registers/${registerItem.id}` - return fetch(endpoint, { + try { + const response = await fetch(endpoint, { method: 'DELETE', }) - .then((response) => { - this.refreshRegisterList() - }) - .catch((err) => { - console.error('Error deleting register:', err) - throw err - }) - }, - // Create or save a register from store - saveRegister() { - if (!this.registerItem) { - throw new Error('No register item to save') + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) } - console.log('Saving register...') + const responseData = await response.json() - const isNewRegister = !this.registerItem.id - const endpoint = isNewRegister - ? '/index.php/apps/openregister/api/registers' - : `/index.php/apps/openregister/api/registers/${this.registerItem.id}` - const method = isNewRegister ? 'POST' : 'PUT' + if (!responseData || typeof responseData !== 'object') { + throw new Error('Invalid response data') + } - // Create a copy of the register item and remove empty properties - const registerToSave = { ...this.registerItem } - Object.keys(registerToSave).forEach(key => { - if (registerToSave[key] === '' || (Array.isArray(registerToSave[key]) && registerToSave[key].length === 0)) { - delete registerToSave[key] - } - }) + this.refreshRegisterList() + + return { response, data: responseData } + } catch (error) { + console.error('Error deleting register:', error) + throw new Error(`Failed to delete register: ${error.message}`) + } + }, + // Create or save a register from store + async saveRegister(registerItem) { + if (!registerItem) { + throw new Error('No register item to save') + } + + console.log('Saving register...') - return fetch( + const isNewRegister = !registerItem.id + const endpoint = isNewRegister + ? '/index.php/apps/openregister/api/registers' + : `/index.php/apps/openregister/api/registers/${registerItem.id}` + const method = isNewRegister ? 'POST' : 'PUT' + + try { + const response = await fetch( endpoint, { method, headers: { 'Content-Type': 'application/json', }, - body: JSON.stringify(registerToSave), - }, + body: JSON.stringify(registerItem), + } ) - .then((response) => response.json()) - .then((data) => { - this.setRegisterItem(data) - console.log('Register saved') - // Refresh the register list - return this.refreshRegisterList() - }) - .catch((err) => { - console.error('Error saving register:', err) - throw err - }) - }, + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + + const responseData = await response.json() + + if (!responseData || typeof responseData !== 'object') { + throw new Error('Invalid response data') + } + + const data = new Register(responseData) + + this.setRegisterItem(data) + await this.refreshRegisterList() + + return { response, data } + } catch (error) { + console.error('Error saving register:', error) + throw new Error(`Failed to save register: ${error.message}`) + } }, }, -) +}) diff --git a/src/store/modules/schema.js b/src/store/modules/schema.js index 0f39e3117b..07c8e3c6cc 100644 --- a/src/store/modules/schema.js +++ b/src/store/modules/schema.js @@ -2,128 +2,126 @@ import { defineStore } from 'pinia' import { Schema } from '../../entities/index.js' -export const useSchemaStore = defineStore( - 'schema', { - state: () => ({ - schemaItem: false, - schemaList: [], - }), - actions: { - setSchemaItem(schemaItem) { - this.schemaItem = schemaItem && new Schema(schemaItem) - console.log('Active schema item set to ' + schemaItem) - }, - setSchemaList(schemaList) { - this.schemaList = schemaList.map( - (schemaItem) => new Schema(schemaItem), +export const useSchemaStore = defineStore('schema', { + state: () => ({ + schemaItem: false, + schemaList: [], + }), + actions: { + setSchemaItem(schemaItem) { + this.schemaItem = schemaItem && new Schema(schemaItem) + console.log('Active schema item set to ' + schemaItem) + }, + setSchemaList(schemaList) { + this.schemaList = schemaList.map( + (schemaItem) => new Schema(schemaItem), + ) + console.log('Schema list set to ' + schemaList.length + ' items') + }, + /* istanbul ignore next */ // ignore this for Jest until moved into a service + async refreshSchemaList(search = null) { + // @todo this might belong in a service? + let endpoint = '/index.php/apps/openregister/api/schemas' + if (search !== null && search !== '') { + endpoint = endpoint + '?_search=' + search + } + return fetch(endpoint, { + method: 'GET', + }) + .then( + (response) => { + response.json().then( + (data) => { + this.setSchemaList(data.results) + }, + ) + }, ) - console.log('Schema list set to ' + schemaList.length + ' items') - }, - /* istanbul ignore next */ // ignore this for Jest until moved into a service - async refreshSchemaList(search = null) { - // @todo this might belong in a service? - let endpoint = '/index.php/apps/openregister/api/schemas' - if (search !== null && search !== '') { - endpoint = endpoint + '?_search=' + search - } - return fetch(endpoint, { + .catch( + (err) => { + console.error(err) + }, + ) + }, + // Function to get a single schema + async getSchema(id) { + const endpoint = `/index.php/apps/openregister/api/schemas/${id}` + try { + const response = await fetch(endpoint, { method: 'GET', }) - .then( - (response) => { - response.json().then( - (data) => { - this.setSchemaList(data.results) - }, - ) - }, - ) - .catch( - (err) => { - console.error(err) - }, - ) - }, - // Function to get a single schema - async getSchema(id) { - const endpoint = `/index.php/apps/openregister/api/schemas/${id}` - try { - const response = await fetch(endpoint, { - method: 'GET', - }) - const data = await response.json() - this.setSchemaItem(data) - return data - } catch (err) { - console.error(err) - throw err - } - }, - // Delete a schema - deleteSchema() { - if (!this.schemaItem || !this.schemaItem.id) { - throw new Error('No schema item to delete') - } + const data = await response.json() + this.setSchemaItem(data) + return data + } catch (err) { + console.error(err) + throw err + } + }, + // Delete a schema + deleteSchema() { + if (!this.schemaItem || !this.schemaItem.id) { + throw new Error('No schema item to delete') + } - console.log('Deleting schema...') + console.log('Deleting schema...') - const endpoint = `/index.php/apps/openregister/api/schemas/${this.schemaItem.id}` + const endpoint = `/index.php/apps/openregister/api/schemas/${this.schemaItem.id}` - return fetch(endpoint, { - method: 'DELETE', + return fetch(endpoint, { + method: 'DELETE', + }) + .then((response) => { + this.refreshSchemaList() }) - .then((response) => { - this.refreshSchemaList() - }) - .catch((err) => { - console.error('Error deleting schema:', err) - throw err - }) - }, - // Create or save a schema from store - saveSchema() { - if (!this.schemaItem) { - throw new Error('No schema item to save') - } + .catch((err) => { + console.error('Error deleting schema:', err) + throw err + }) + }, + // Create or save a schema from store + saveSchema() { + if (!this.schemaItem) { + throw new Error('No schema item to save') + } - console.log('Saving schema...') + console.log('Saving schema...') - const isNewSchema = !this.schemaItem.id - const endpoint = isNewSchema - ? '/index.php/apps/openregister/api/schemas' - : `/index.php/apps/openregister/api/schemas/${this.schemaItem.id}` - const method = isNewSchema ? 'POST' : 'PUT' + const isNewSchema = !this.schemaItem.id + const endpoint = isNewSchema + ? '/index.php/apps/openregister/api/schemas' + : `/index.php/apps/openregister/api/schemas/${this.schemaItem.id}` + const method = isNewSchema ? 'POST' : 'PUT' - // Create a copy of the schema item and remove empty properties - const schemaToSave = { ...this.schemaItem } - Object.keys(schemaToSave).forEach(key => { - if (schemaToSave[key] === '' || (Array.isArray(schemaToSave[key]) && schemaToSave[key].length === 0)) { - delete schemaToSave[key] - } - }) + // Create a copy of the schema item and remove empty properties + const schemaToSave = { ...this.schemaItem } + Object.keys(schemaToSave).forEach(key => { + if (schemaToSave[key] === '' || (Array.isArray(schemaToSave[key]) && schemaToSave[key].length === 0)) { + delete schemaToSave[key] + } + }) - return fetch( - endpoint, - { - method, - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(schemaToSave), + return fetch( + endpoint, + { + method, + headers: { + 'Content-Type': 'application/json', }, - ) - .then((response) => response.json()) - .then((data) => { - this.setSchemaItem(data) - console.log('Schema saved') - // Refresh the schema list - return this.refreshSchemaList() - }) - .catch((err) => { - console.error('Error saving schema:', err) - throw err - }) - }, + body: JSON.stringify(schemaToSave), + }, + ) + .then((response) => response.json()) + .then((data) => { + this.setSchemaItem(data) + console.log('Schema saved') + // Refresh the schema list + return this.refreshSchemaList() + }) + .catch((err) => { + console.error('Error saving schema:', err) + throw err + }) }, }, -) +}) diff --git a/src/views/register/RegistersIndex.vue b/src/views/register/RegistersIndex.vue index 325d2b53f6..99aa432051 100644 --- a/src/views/register/RegistersIndex.vue +++ b/src/views/register/RegistersIndex.vue @@ -16,7 +16,7 @@ import { registerStore, navigationStore } from '../../store/store.js' - + Register toevoegen diff --git a/src/views/register/RegistersList.vue b/src/views/register/RegistersList.vue index 87fda8186f..970d0884df 100644 --- a/src/views/register/RegistersList.vue +++ b/src/views/register/RegistersList.vue @@ -22,7 +22,7 @@ import { registerStore, navigationStore, searchStore } from '../../store/store.j Ververs - +
+ Wil je {{ registerStore.registerItem.title }} definitief verwijderen? Deze actie kan niet ongedaan worden gemaakt. +
Register succesvol verwijderd
{{ error }}
Register succesvol aangepast