| 
					
				 | 
			
			
				@@ -229,6 +229,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 								tag="div" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 								draggable=".item-draggable" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 								class="nav-dropdown-items" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								@change="columnOrderChanged" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 							> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 								<template #item="{ element: column }"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 									<button 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -298,6 +299,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 							v-bind="columnDragOptions" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 							tag="tr" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 							draggable=".item-draggable" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							@change="columnOrderChanged" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 						> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 							<template #item="{ element: column }"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 								<th 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -564,7 +566,7 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		name: Unique lowercase name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		displayName: Nice name for the column header 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		properties: The properties this column needs to show data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		sortable: Boolean for whether the order of a particular column can be changed  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		sortable: Boolean for whether the order of a particular column can be changed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		sortProperty: The property the backend will sort on if this column gets sorted, e.g. title 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		hidable: Boolean for whether a column can be hidden 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		defaultVisibility: Default visibility for a column, either "shown" or "hidden" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -577,7 +579,8 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		columnDefault: { type: Object, default: () => {} }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		columns: { type: Array, default: null }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		filters: { type: Array, default: null }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		dataAction: { type: String, default: null } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		dataAction: { type: String, default: null }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		name: { type: String, default: null } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	data() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -673,6 +676,8 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	mounted() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		const tableSettings = this.getTableSettings(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		this.orderedColumns = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				name: "select", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -702,17 +707,76 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				width: "auto", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				maxWidth: "auto" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		].sort((columnA, columnB) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// Always places select column in the first position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (columnA.name === "select") return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// Always places placeholder column in the last position 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (columnB.name === "placeholder") return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// If there are no table settings stored, use default ordering 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (!tableSettings || !tableSettings.columnOrder) return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			const indexA = tableSettings.columnOrder.indexOf(columnA.name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			const indexB = tableSettings.columnOrder.indexOf(columnA.name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// If either of the columns is not stored in the table settings, use default ordering 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (indexA === -1 || indexB === -1) return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return indexA - indexB; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		// A column will be shown if the defaultVisibility is set to shown, OR if the defaultVisibility is not set to shown and hidable is false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		this.shownColumns = this.orderedColumns 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			.filter(column => column.defaultVisibility !== "hidden") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			.filter(column => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// If table settings exist, use shownColumns from settings to determine which columns to show 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if (tableSettings && tableSettings.shownColumns) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						tableSettings.shownColumns.indexOf(column.name) !== -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// Table settings don't exist, only show if the default visibility isn't hidden 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return column.defaultVisibility !== "hidden"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			.map(column => column.name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		this.recalculateWidths(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		const pageSize = parseInt(localStorage.getItem("adminPageSize")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if (!Number.isNaN(pageSize)) this.pageSize = pageSize; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (tableSettings) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// If table settings' pageSize is an integer, use it for the pageSize 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (Number.isInteger(tableSettings?.pageSize)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.pageSize = tableSettings.pageSize; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// If table settings' columnSort exists, sort all still existing columns based on table settings' columnSort object 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (tableSettings.columnSort) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Object.entries(tableSettings.columnSort).forEach( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					([columnName, sortDirection]) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						if ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							this.columns.find( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+								column => column.name === columnName 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							this.sort[columnName] = sortDirection; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tableSettings.filter && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tableSettings.filter.appliedFilters && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tableSettings.filter.appliedFilterOperator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				const { appliedFilters, appliedFilterOperator } = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					tableSettings.filter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// Set the applied filter operator and filter operator to the value stored in table settings 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.appliedFilterOperator = this.filterOperator = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					appliedFilterOperator; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				// Set the applied filters and editing filters to the value stored in table settings, for all filters that are allowed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.appliedFilters = this.editingFilters = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					appliedFilters.filter(appliedFilter => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						this.filters.find( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							filter => appliedFilter.filter.name === filter.name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		this.resetBulkActionsPosition(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -748,7 +812,7 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		changePageSize() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			this.getData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			localStorage.setItem("adminPageSize", this.pageSize); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.storeTableSettings(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		changePage(page) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if (page < 1) return; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -767,6 +831,7 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				else if (this.sort[sortProperty] === "descending") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					delete this.sort[sortProperty]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				this.getData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				this.storeTableSettings(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		toggleColumnVisibility(column) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -783,7 +848,8 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				this.shownColumns.push(column.name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			this.recalculateWidths(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return this.getData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.getData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return this.storeTableSettings(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		toggleSelectedRow(itemIndex, event) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			const { shiftKey, ctrlKey } = event; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -977,6 +1043,7 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			this.appliedFilterOperator = this.filterOperator; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			this.getData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.storeTableSettings(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		recalculateWidths() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			let noWidthCount = 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1018,6 +1085,29 @@ export default { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				return orderedColumn; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		columnOrderChanged() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			this.storeTableSettings(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		getTableSettings() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return JSON.parse( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				localStorage.getItem(`advancedTableSettings:${this.name}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		storeTableSettings() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			localStorage.setItem( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				`advancedTableSettings:${this.name}`, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				JSON.stringify({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					pageSize: this.pageSize, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					filter: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						appliedFilters: this.appliedFilters, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						appliedFilterOperator: this.appliedFilterOperator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					columnSort: this.sort, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					columnOrder: this.orderedColumns.map(column => column.name), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					shownColumns: this.shownColumns 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 |