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 { 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: [ { 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' }, { 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); } }, });