diff --git a/packages/bbui/src/Form/Core/Picker.svelte b/packages/bbui/src/Form/Core/Picker.svelte index acd3c5da61..fb0ce00824 100644 --- a/packages/bbui/src/Form/Core/Picker.svelte +++ b/packages/bbui/src/Form/Core/Picker.svelte @@ -32,7 +32,6 @@ export let autocomplete = false export let sort = false export let fetchTerm = null - $: console.log(fieldText) const dispatch = createEventDispatcher() let searchTerm = null diff --git a/packages/builder/src/pages/builder/portal/account/auditLogs/_components/TimeRenderer.svelte b/packages/builder/src/pages/builder/portal/account/auditLogs/_components/TimeRenderer.svelte new file mode 100644 index 0000000000..7ec044604e --- /dev/null +++ b/packages/builder/src/pages/builder/portal/account/auditLogs/_components/TimeRenderer.svelte @@ -0,0 +1,12 @@ + + +
+ {dayjs(row.date).fromNow()} +
diff --git a/packages/builder/src/pages/builder/portal/account/auditLogs/_components/UserRenderer.svelte b/packages/builder/src/pages/builder/portal/account/auditLogs/_components/UserRenderer.svelte index 4baa24403e..c9a69b4316 100644 --- a/packages/builder/src/pages/builder/portal/account/auditLogs/_components/UserRenderer.svelte +++ b/packages/builder/src/pages/builder/portal/account/auditLogs/_components/UserRenderer.svelte @@ -3,4 +3,4 @@ export let row - + diff --git a/packages/builder/src/pages/builder/portal/account/auditLogs/index.svelte b/packages/builder/src/pages/builder/portal/account/auditLogs/index.svelte index a5d403491a..88f042d240 100644 --- a/packages/builder/src/pages/builder/portal/account/auditLogs/index.svelte +++ b/packages/builder/src/pages/builder/portal/account/auditLogs/index.svelte @@ -2,26 +2,28 @@ import { Layout, Table, - Select, Search, Multiselect, notifications, + Icon, + clickOutside, + CoreTextArea, + DatePicker, } from "@budibase/bbui" - import { licensing, users, apps } from "stores/portal" + import { licensing, users, apps, auditLogs } from "stores/portal" import LockedFeature from "../../_components/LockedFeature.svelte" import { createPaginationStore } from "helpers/pagination" - import { getContext, setContext } from "svelte" - import Portal from "svelte-portal" + import { setContext } from "svelte" import ViewDetailsRenderer from "./_components/ViewDetailsRenderer.svelte" import UserRenderer from "./_components/UserRenderer.svelte" + import TimeRenderer from "./_components/TimeRenderer.svelte" - const sidePanel = getContext("side-panel") const schema = { - name: {}, - date: {}, - user: { width: "auto" }, - app: {}, - event: {}, + name: { width: "1fr" }, + date: { width: "1.5fr" }, + user: { width: "0.5fr" }, + app: { width: "1fr" }, + event: { width: "1fr" }, view: { width: "auto", borderLeft: true, displayName: "" }, } @@ -34,18 +36,29 @@ column: "user", component: UserRenderer, }, + { + column: "date", + component: TimeRenderer, + }, ] - let searchTerm = "" - let pageInfo = createPaginationStore() - let prevSearch = undefined + let userSearchTerm = "" + let logSearchTerm = "" + let userPageInfo = createPaginationStore() + let logsPageInfo = createPaginationStore() + + let prevUserSearch = undefined + let prevLogSearch = undefined let selectedUsers = [] + let selectedApps = [] let selectedLog + let sidePanelVisible = false + let startDate, endDate let data = [ { name: "User created", - date: "2021-03-01 12:00:00", + date: "2023-02-14T10:19:52.021Z", user: "Peter Clement", app: "School Admin Panel", event: "User added", @@ -56,30 +69,61 @@ }, ] - $: fetchUsers(page, searchTerm) - $: page = $pageInfo.page + $: fetchUsers(userPage, userSearchTerm) + $: fetchLogs(logsPage, logSearchTerm) + + $: userPage = $userPageInfo.page + $: logsPage = $logsPageInfo.page + $: enrichedList = enrich($users.data || [], selectedUsers) $: sortedList = sort(enrichedList) - const fetchUsers = async (page, search) => { - if ($pageInfo.loading) { + const fetchUsers = async (userPage, search) => { + if ($userPageInfo.loading) { return } // need to remove the page if they've started searching - if (search && !prevSearch) { - pageInfo.reset() - page = undefined + if (search && !prevUserSearch) { + userPageInfo.reset() + userPage = undefined } - prevSearch = search + prevUserSearch = search try { - pageInfo.loading() - await users.search({ page, email: search }) - pageInfo.fetched($users.hasNextPage, $users.nextPage) + userPageInfo.loading() + await users.search({ userPage, email: search }) + userPageInfo.fetched($users.hasNextPage, $users.nextPage) } catch (error) { notifications.error("Error getting user list") } } + const fetchLogs = async (logsPage, search) => { + if ($logsPageInfo.loading) { + return + } + // need to remove the page if they've started searching + if (search && !prevLogSearch) { + logsPageInfo.reset() + logsPage = undefined + } + prevLogSearch = search + try { + logsPageInfo.loading() + await auditLogs.search({ + logsPage, + startDate, + endDate, + metadataSearch: search, + userIds: selectedUsers, + appIds: selectedApps, + }) + logsPageInfo.fetched($auditLogs.hasNextPage, $auditLogs.nextPage) + } catch (error) { + console.log(error) + notifications.error("Error getting audit logs") + } + } + const enrich = (list, selected) => { return list.map(item => { return { @@ -106,7 +150,21 @@ const viewDetails = detail => { selectedLog = detail - sidePanel.open() + sidePanelVisible = true + } + + const downloadLogs = async () => { + try { + await auditLogs.download({ + startDate, + endDate, + metadataSearch: logSearchTerm, + userIds: selectedUsers, + appIds: selectedApps, + }) + } catch (error) { + notifications.error(`Error downloading logs: ` + error.message) + } } setContext("auditLogs", { @@ -123,14 +181,25 @@ $licensing.goToUpgradePage() }} > +
+