SYNC: Merge branch 'feature/audit-logs'

This commit is contained in:
SPRINX0\prochazka
2025-06-27 13:05:26 +02:00
committed by Diflow
parent e3c6d05a0a
commit 90bbdd563b
24 changed files with 781 additions and 63 deletions

View File

@@ -60,10 +60,9 @@
installNewCloudTokenListener();
initializeAppUpdates();
installCloudListeners();
refreshPublicCloudFiles();
}
refreshPublicCloudFiles();
loadedApi = loadedApiValue;
if (!loadedApi) {

View File

@@ -18,41 +18,6 @@
testEnabled: () => getCurrentEditor() != null && hasPermission('dbops/export'),
onClick: () => getCurrentEditor().exportGrid(),
});
async function loadDataPage(props, offset, limit) {
const { display, conid, database } = props;
const select = display.getPageQuery(offset, limit);
const response = await apiCall('database-connections/sql-select', {
conid,
database,
select,
});
if (response.errorMessage) return response;
return response.rows;
}
function dataPageAvailable(props) {
const { display } = props;
const select = display.getPageQuery(0, 1);
return !!select;
}
async function loadRowCount(props) {
const { display, conid, database } = props;
const select = display.getCountQuery();
const response = await apiCall('database-connections/sql-select', {
conid,
database,
select,
});
return parseInt(response.rows[0].count);
}
</script>
<script lang="ts">
@@ -217,6 +182,42 @@
function handleSetLoadedRows(rows) {
loadedRows = rows;
}
async function loadDataPage(props, offset, limit) {
const { display, conid, database } = props;
const select = display.getPageQuery(offset, limit);
const response = await apiCall('database-connections/sql-select', {
conid,
database,
select,
auditLogSessionGroup: 'data-grid',
});
if (response.errorMessage) return response;
return response.rows;
}
function dataPageAvailable(props) {
const { display } = props;
const select = display.getPageQuery(0, 1);
return !!select;
}
async function loadRowCount(props) {
const { display, conid, database } = props;
const select = display.getCountQuery();
const response = await apiCall('database-connections/sql-select', {
conid,
database,
select,
});
return parseInt(response.rows[0].count);
}
</script>
<LoadingDataGridCore

View File

@@ -0,0 +1,33 @@
<script lang="ts">
import FontIcon from "../icons/FontIcon.svelte";
export let onClose;
</script>
<div class="chip">
<slot />
{#if onClose}
<span class="close" on:click={onClose}><FontIcon icon="icon close" /></span>
{/if}
</div>
<style>
.chip {
display: inline-block;
padding: 0.25em 0.5em;
border-radius: 1em;
background-color: var(--theme-bg-2);
color: var(--theme-text-1);
font-size: 0.875em;
cursor: pointer;
margin: 2px;
}
.chip .close {
margin-left: 0.2em;
color: var(--theme-text-2);
cursor: pointer;
}
.chip .close:hover {
color: var(--theme-font-hover);
}
</style>

View File

@@ -0,0 +1,32 @@
<script lang="ts">
import flatpickr from 'flatpickr';
import 'flatpickr/dist/flatpickr.min.css';
import 'flatpickr/dist/themes/dark.css';
import { onMount } from 'svelte';
let flatpickrInstance;
let inputElement;
export let defaultValue = ['today', 'today'];
export let onChange: (value) => void;
onMount(() => {
flatpickrInstance = flatpickr(inputElement, {
mode: 'range',
maxDate: 'today',
dateFormat: 'Y-m-d',
defaultDate: defaultValue,
onClose: selectedDates => {
console.log('Selected dates:', selectedDates);
if (selectedDates.length === 1) {
flatpickrInstance.setDate([selectedDates[0], selectedDates[0]], true);
}
onChange(selectedDates.length == 1 ? [selectedDates[0], selectedDates[0]] : selectedDates);
},
});
});
</script>
<input bind:this={inputElement} type="text" class="input1" />

View File

@@ -8,6 +8,7 @@
conid,
database,
select,
auditLogSessionGroup: 'data-form',
});
if (response.errorMessage) return response;

View File

@@ -143,6 +143,7 @@
'icon markdown': 'mdi mdi-application',
'icon preview': 'mdi mdi-file-find',
'icon eye': 'mdi mdi-eye',
'icon auditlog': 'mdi mdi-eye',
'icon check-all': 'mdi mdi-check-all',
'icon checkbox-blank': 'mdi mdi-checkbox-blank-outline',
'icon checkbox-marked': 'mdi mdi-checkbox-marked-outline',
@@ -307,6 +308,7 @@
'img filter': 'mdi mdi-filter',
'img group': 'mdi mdi-group',
'img perspective': 'mdi mdi-eye color-icon-yellow',
'img auditlog': 'mdi mdi-eye color-icon-blue',
'img parent-filter': 'mdi mdi-home-alert color-icon-yellow',
'img folder': 'mdi mdi-folder color-icon-yellow',

View File

@@ -104,7 +104,8 @@
const response = await apiCall('database-connections/sql-select', {
conid,
database,
select
select,
auditLogSessionGroup: 'lookup',
});
rows = response.rows;

View File

@@ -185,6 +185,7 @@ export async function apiCall(
cache: 'no-cache',
headers: {
'Content-Type': 'application/json',
'x-api-session-id': getApiSessionId(),
...resolveApiHeaders(),
},
body: JSON.stringify(args, serializeJsTypesReplacer),
@@ -318,6 +319,20 @@ export function refreshPublicCloudFiles(force = false) {
sessionStorage.setItem('publicCloudFilesLoaded', 'true');
}
let apiSessionIdValue = null;
function getApiSessionId() {
if (!apiSessionIdValue) {
apiSessionIdValue = uuidv1();
}
return apiSessionIdValue;
// if (!sessionStorage.getItem('apiSessionId')) {
// const sessionId = uuidv1();
// sessionStorage.setItem('apiSessionId', sessionId);
// }
// return sessionStorage.getItem('apiSessionId');
}
function enableApiLog() {
apiLogging = true;
console.log('API loggin enabled');