const deviceManufacturerFilterOptions = window?.TT_CONFIG?.DEVICE_MANUFACTURERS.map(manufacturer => ({ value: manufacturer.name, text: manufacturer.name, })); const deviceTypeFilterOptions = window?.TT_CONFIG?.DEVICE_TYPES.map(type => ({ value: type.name, text: type.name, })); Vue.component('device-view-switch', { //language=Vue template: `
`, props: ['value'], data() { return { window: window, isOverflowing: false, showDropdown: false, }; }, mounted() { this.checkOverflow(); window.addEventListener('resize', this.checkOverflow); }, beforeDestroy() { window.removeEventListener('resize', this.checkOverflow); }, methods: { checkOverflow() { this.isOverflowing = window.innerWidth < 650 }, }, }) Vue.component('DeviceTable', { //language=Vue template: ` `, data() { return { window: window, DeviceTableConfig: { key: 'DeviceTable', tableHeader: 'Device-Liste', defaultPageSize: 25, headers: [], }, } }, mounted() { this.DeviceTableConfig.headers = [ {text: 'Device Name', key: 'name', sortable: true, class: 'text-nowrap', priority: 10}, {text: 'Hersteller', key: 'devicemanufactor', filter: 'select', class: 'text-nowrap text-center', filterOptions: deviceManufacturerFilterOptions}, {text: 'Geräte Typ', key: 'devicetype', filter: 'select', class: 'text-nowrap text-center', filterOptions: deviceTypeFilterOptions, priority: 7}, {text: 'Pop/Adresse', key: 'locationText', filter: 'search', class: 'text-nowrap text-center'}, {text: 'IP-Adresse', key: 'ip', filter: 'search', class: 'text-center', priority: 8}, {text: 'Mac-Adresse', key: 'mac', filter: 'search', class: 'text-center'}, {text: 'Seriennummer', key: 'serial', filter: 'search', class: 'text-center'}, ]; if (this.window.TT_CONFIG['IS_ADMIN'] === '1') { this.DeviceTableConfig.headers = [ ...this.DeviceTableConfig.headers, {text: 'Preis', key: 'price', filter: 'numberRange', class: 'text-center', suffix: ' €'}, {text: 'max. Leistung', key: 'power', filter: 'numberRange', class: 'text-center', suffix: ' W'}, { text: 'Backup', key: 'backup', filter: 'iconSelect', filterOptions: [ {value: 'ok', text: 'Configbackup aktuell', icon: 'fa-regular fa-circle-check text-success'}, {value: 'auto', text: 'Configbackup aktuell', icon: 'fa-regular fa-circle-a text-success'}, {value: 'aged', text: 'Letztes Configbackup älter als 48 Stunden', icon: 'fa-regular fa-circle-xmark'}, {value: 'na', text: 'N/A', icon: 'fa-regular fa-ban text-warning'} ], priority: 6, sortable: false, }, { text: 'Status', key: 'zabbix_online', filter: 'iconSelect', filterOptions: [ {value: 0, text: 'Status unbekannt', icon: 'fa-regular fa-circle-xmark'}, {value: 1, text: 'Offline', icon: 'fa-regular fa-circle-xmark text-danger'}, {value: 2, text: 'Online', icon: 'fa-regular fa-circle-check text-success'}, ], priority: 5, sortable: false, }, {text: 'Aktionen', key: 'actions', class: 'text-center', sortable: false, filter: false, priority: 9}, ] } } }); Vue.component('DeviceManufacturer', { //language=Vue template: ` `, data() { return { window: window, DeviceManufacturerConfig: { key: 'DeviceManufacturer', tableHeader: 'Hersteller', defaultPageSize: 25, headers: [ {text: 'Name', key: 'name', sortable: true, class: 'text-nowrap', priority: 10}, {text: 'Erstellungsdatum', key: 'created', filter: 'date', class: 'text-center'}, {text: 'Erstellt von', key: 'creator', filter: 'search', class: 'text-center'}, {text: 'Aktionen', key: 'actions', class: 'text-center', sortable: false, filter: false, priority: 9}, ], }, } } }); Vue.component('DeviceType', { //language=Vue template: ` `, data() { return { window: window, DeviceTypeConfig: { key: 'DeviceType', tableHeader: 'Gerätetypen', defaultPageSize: 25, headers: [ {text: 'Name', key: 'name', sortable: true, class: 'text-nowrap', priority: 10}, {text: 'Hersteller', key: 'manufacturer', filter: 'search', class: 'text-center'}, {text: 'Preis', key: 'price', filter: 'numberRange', class: 'text-center', suffix: ' €'}, {text: 'max. Leistung', key: 'power', filter: 'numberRange', class: 'text-center', suffix: ' W'}, {text: 'Erstellungsdatum', key: 'created', filter: 'date', class: 'text-center'}, {text: 'Erstellt von', key: 'creator', filter: 'search', class: 'text-center'}, {text: 'Aktionen', key: 'actions', class: 'text-center', sortable: false, filter: false, priority: 9}, ], }, } } }) Vue.component('Device', { //language=Vue template: ` `, data() { return { window: window, currentView: 'DeviceTable', }; }, beforeMount() { const storedView = window.localStorage.getItem('tt-device-view'); if (storedView) { this.currentView = storedView; } }, watch: { currentView() { window.localStorage.setItem('tt-device-view', this.currentView); } }, });