diff --git a/package-lock.json b/package-lock.json index 983a9997e0..330a768fc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,14 @@ "name": "@appwrite/console", "version": "0.0.1", "dependencies": { + "@analytics/google-analytics": "^1.0.5", "@aw-labs/appwrite-console": "^11.0.0", "@aw-labs/icons": "0.0.0-77", "@aw-labs/ui": "0.0.0-77", "@popperjs/core": "^2.11.6", "@sentry/svelte": "^7.19.0", "@sentry/tracing": "^7.19.0", + "analytics": "^0.8.1", "echarts": "^5.4.0", "pretty-bytes": "^6.0.0", "prismjs": "^1.29.0", @@ -29,7 +31,6 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/svelte": "^3.2.2", "@testing-library/user-event": "^14.4.3", - "@types/gtag.js": "^0.0.12", "@types/prismjs": "^1.26.0", "@typescript-eslint/eslint-plugin": "^5.41.0", "@typescript-eslint/parser": "^5.41.0", @@ -73,6 +74,76 @@ "node": ">=6.0.0" } }, + "node_modules/@analytics/cookie-utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@analytics/cookie-utils/-/cookie-utils-0.2.10.tgz", + "integrity": "sha512-k7oyW1PkMCnEdCYmHCLLXAsKavQh5ZRh5EeugBEUTlPJs8x8ajF+W1T0PYVDS26Impkea1sJR2etv/6l2pKtlg==", + "dependencies": { + "@analytics/global-storage-utils": "^0.1.5" + } + }, + "node_modules/@analytics/core": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@analytics/core/-/core-0.11.1.tgz", + "integrity": "sha512-vHuiMpeGV6jGRRoOuScUJ4CHpVd1Zu9M+fjEWgN+boMAxIwFCtRTkSbhhIP337JuEBLpMT8w37OxA4Yh3NZFZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/davidwells" + } + ], + "dependencies": { + "@analytics/global-storage-utils": "^0.1.5", + "@analytics/type-utils": "^0.6.0", + "analytics-utils": "^1.0.10" + } + }, + "node_modules/@analytics/global-storage-utils": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@analytics/global-storage-utils/-/global-storage-utils-0.1.5.tgz", + "integrity": "sha512-DzOCd0qK7PGnz/dgBYNzLmaFBkxcEHM6/CpWMY7hel1IBUldMsyet4sdRgI2Nk+Wc6B/YvqVqos68p5ntB59zA==", + "dependencies": { + "@analytics/type-utils": "^0.6.0" + } + }, + "node_modules/@analytics/google-analytics": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@analytics/google-analytics/-/google-analytics-1.0.5.tgz", + "integrity": "sha512-I/yfiCVQo8AeT72KPa6z571LJKDbLdm4ntDqOHiE2Xehw9UjKcXQWiKTHL1/nfOOiekfpLf/6rFS5P6dQ0vImw==" + }, + "node_modules/@analytics/localstorage-utils": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@analytics/localstorage-utils/-/localstorage-utils-0.1.8.tgz", + "integrity": "sha512-tU5rLEHdYRc4EmRXkWacMJSmu4SeJfQuxvthSHHRVx3hGBQ00MJRDGyDHMXcrLKQXrBpsJo6t/8YRavHLOxDPQ==", + "dependencies": { + "@analytics/global-storage-utils": "^0.1.5" + } + }, + "node_modules/@analytics/session-storage-utils": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@analytics/session-storage-utils/-/session-storage-utils-0.0.5.tgz", + "integrity": "sha512-BXRNQ73GSkkkny//a/SNCYRyrIhEJBwOTcdNkr2gq6ghXgekQGrTfVzwybZ/tAEHA0XYkkaOszelRsDPxa+UOQ==", + "dependencies": { + "@analytics/global-storage-utils": "^0.1.5" + } + }, + "node_modules/@analytics/storage-utils": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@analytics/storage-utils/-/storage-utils-0.4.0.tgz", + "integrity": "sha512-RY9nhoSQcuQxkmVUZBG3ULOwiFxi+H5N0WHn+FPUScnoM4b+tC48dWzyFxD9qKyWPah8/ndjCj6r+6wTGSl1zw==", + "dependencies": { + "@analytics/cookie-utils": "^0.2.10", + "@analytics/global-storage-utils": "^0.1.5", + "@analytics/localstorage-utils": "^0.1.8", + "@analytics/session-storage-utils": "^0.0.5", + "@analytics/type-utils": "^0.6.0" + } + }, + "node_modules/@analytics/type-utils": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@analytics/type-utils/-/type-utils-0.6.0.tgz", + "integrity": "sha512-1Yw7u/COtxx06BfwlI+kVhsa/upKYzmCNrT4c8QDeCY2KMYlnijkUjtHiPU08HxyTIVB5j6d75O0YWVIHwQS8g==" + }, "node_modules/@aw-labs/appwrite-console": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-11.0.0.tgz", @@ -1663,6 +1734,12 @@ "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", "dev": true }, + "node_modules/@types/dlv": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/dlv/-/dlv-1.1.2.tgz", + "integrity": "sha512-OyiZ3jEKu7RtGO1yp9oOdK0cTwZ/10oE9PDJ6fyN3r9T5wkyOcvr6awdugjYdqF6KVO5eUvt7jx7rk2Eylufow==", + "peer": true + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -1673,12 +1750,6 @@ "@types/node": "*" } }, - "node_modules/@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "dev": true - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -2119,6 +2190,33 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/analytics": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/analytics/-/analytics-0.8.1.tgz", + "integrity": "sha512-mXOe8zTGDfiYqw9MZsgul8HrOBmHsIwk/0xbrkGZr75yvWqAcyKfZA0WjOalwI9tzIKv8WNfHV5yhnrtQcXJpw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/davidwells" + } + ], + "dependencies": { + "@analytics/core": "^0.11.1", + "@analytics/storage-utils": "^0.4.0" + } + }, + "node_modules/analytics-utils": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/analytics-utils/-/analytics-utils-1.0.10.tgz", + "integrity": "sha512-ZKYKhip7Sf09qE85l4vZMBPR3fz6ISUTlwzkWSwJHbzLLzP5qrWQtcQlBcP9Pah7BMNSq8pqho+PX4ZKB014Yg==", + "dependencies": { + "@analytics/type-utils": "^0.6.0", + "dlv": "^1.1.3" + }, + "peerDependencies": { + "@types/dlv": "^1.0.0" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2859,6 +2957,11 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -7572,6 +7675,70 @@ "@jridgewell/trace-mapping": "^0.3.0" } }, + "@analytics/cookie-utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@analytics/cookie-utils/-/cookie-utils-0.2.10.tgz", + "integrity": "sha512-k7oyW1PkMCnEdCYmHCLLXAsKavQh5ZRh5EeugBEUTlPJs8x8ajF+W1T0PYVDS26Impkea1sJR2etv/6l2pKtlg==", + "requires": { + "@analytics/global-storage-utils": "^0.1.5" + } + }, + "@analytics/core": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@analytics/core/-/core-0.11.1.tgz", + "integrity": "sha512-vHuiMpeGV6jGRRoOuScUJ4CHpVd1Zu9M+fjEWgN+boMAxIwFCtRTkSbhhIP337JuEBLpMT8w37OxA4Yh3NZFZw==", + "requires": { + "@analytics/global-storage-utils": "^0.1.5", + "@analytics/type-utils": "^0.6.0", + "analytics-utils": "^1.0.10" + } + }, + "@analytics/global-storage-utils": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@analytics/global-storage-utils/-/global-storage-utils-0.1.5.tgz", + "integrity": "sha512-DzOCd0qK7PGnz/dgBYNzLmaFBkxcEHM6/CpWMY7hel1IBUldMsyet4sdRgI2Nk+Wc6B/YvqVqos68p5ntB59zA==", + "requires": { + "@analytics/type-utils": "^0.6.0" + } + }, + "@analytics/google-analytics": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@analytics/google-analytics/-/google-analytics-1.0.5.tgz", + "integrity": "sha512-I/yfiCVQo8AeT72KPa6z571LJKDbLdm4ntDqOHiE2Xehw9UjKcXQWiKTHL1/nfOOiekfpLf/6rFS5P6dQ0vImw==" + }, + "@analytics/localstorage-utils": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@analytics/localstorage-utils/-/localstorage-utils-0.1.8.tgz", + "integrity": "sha512-tU5rLEHdYRc4EmRXkWacMJSmu4SeJfQuxvthSHHRVx3hGBQ00MJRDGyDHMXcrLKQXrBpsJo6t/8YRavHLOxDPQ==", + "requires": { + "@analytics/global-storage-utils": "^0.1.5" + } + }, + "@analytics/session-storage-utils": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@analytics/session-storage-utils/-/session-storage-utils-0.0.5.tgz", + "integrity": "sha512-BXRNQ73GSkkkny//a/SNCYRyrIhEJBwOTcdNkr2gq6ghXgekQGrTfVzwybZ/tAEHA0XYkkaOszelRsDPxa+UOQ==", + "requires": { + "@analytics/global-storage-utils": "^0.1.5" + } + }, + "@analytics/storage-utils": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@analytics/storage-utils/-/storage-utils-0.4.0.tgz", + "integrity": "sha512-RY9nhoSQcuQxkmVUZBG3ULOwiFxi+H5N0WHn+FPUScnoM4b+tC48dWzyFxD9qKyWPah8/ndjCj6r+6wTGSl1zw==", + "requires": { + "@analytics/cookie-utils": "^0.2.10", + "@analytics/global-storage-utils": "^0.1.5", + "@analytics/localstorage-utils": "^0.1.8", + "@analytics/session-storage-utils": "^0.0.5", + "@analytics/type-utils": "^0.6.0" + } + }, + "@analytics/type-utils": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@analytics/type-utils/-/type-utils-0.6.0.tgz", + "integrity": "sha512-1Yw7u/COtxx06BfwlI+kVhsa/upKYzmCNrT4c8QDeCY2KMYlnijkUjtHiPU08HxyTIVB5j6d75O0YWVIHwQS8g==" + }, "@aw-labs/appwrite-console": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/@aw-labs/appwrite-console/-/appwrite-console-11.0.0.tgz", @@ -8843,6 +9010,12 @@ "integrity": "sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==", "dev": true }, + "@types/dlv": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/dlv/-/dlv-1.1.2.tgz", + "integrity": "sha512-OyiZ3jEKu7RtGO1yp9oOdK0cTwZ/10oE9PDJ6fyN3r9T5wkyOcvr6awdugjYdqF6KVO5eUvt7jx7rk2Eylufow==", + "peer": true + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -8853,12 +9026,6 @@ "@types/node": "*" } }, - "@types/gtag.js": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", - "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", - "dev": true - }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -9181,6 +9348,24 @@ "uri-js": "^4.2.2" } }, + "analytics": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/analytics/-/analytics-0.8.1.tgz", + "integrity": "sha512-mXOe8zTGDfiYqw9MZsgul8HrOBmHsIwk/0xbrkGZr75yvWqAcyKfZA0WjOalwI9tzIKv8WNfHV5yhnrtQcXJpw==", + "requires": { + "@analytics/core": "^0.11.1", + "@analytics/storage-utils": "^0.4.0" + } + }, + "analytics-utils": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/analytics-utils/-/analytics-utils-1.0.10.tgz", + "integrity": "sha512-ZKYKhip7Sf09qE85l4vZMBPR3fz6ISUTlwzkWSwJHbzLLzP5qrWQtcQlBcP9Pah7BMNSq8pqho+PX4ZKB014Yg==", + "requires": { + "@analytics/type-utils": "^0.6.0", + "dlv": "^1.1.3" + } + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -9760,6 +9945,11 @@ "path-type": "^4.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", diff --git a/package.json b/package.json index 0249837391..e20a05bdae 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "e2e": "playwright test tests/e2e" }, "dependencies": { + "@analytics/google-analytics": "^1.0.5", + "analytics": "^0.8.1", "@aw-labs/appwrite-console": "^11.0.0", "@aw-labs/icons": "0.0.0-77", "@aw-labs/ui": "0.0.0-77", @@ -40,7 +42,6 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/svelte": "^3.2.2", "@testing-library/user-event": "^14.4.3", - "@types/gtag.js": "^0.0.12", "@types/prismjs": "^1.26.0", "@typescript-eslint/eslint-plugin": "^5.41.0", "@typescript-eslint/parser": "^5.41.0", diff --git a/src/global.d.ts b/src/global.d.ts index 02ec2c2b89..07a7094408 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -1,7 +1,5 @@ /// -/// interface Window { - GOOGLE_ANALYTICS: string | false; VERCEL_ANALYTICS_ID: string | false; SENTRY_DSN: string | false; } diff --git a/src/lib/actions/analytics.ts b/src/lib/actions/analytics.ts index 5ba64ae040..4d3c37f1ed 100644 --- a/src/lib/actions/analytics.ts +++ b/src/lib/actions/analytics.ts @@ -1,32 +1,36 @@ -import type { Action } from 'svelte/action'; +import Analytics from 'analytics'; +import googleAnalytics from '@analytics/google-analytics'; +import { get } from 'svelte/store'; +import { page } from '$app/stores'; -export type AnalyticsActionParam = { - name: string; - action: string; - category?: string; - label?: string; - parameters?: Record; - event?: keyof HTMLElementEventMap; -}; +const analytics = Analytics({ + app: 'appwrite', + plugins: [ + googleAnalytics({ + measurementIds: [import.meta.env.VITE_GOOGLE_ANALYTICS?.toString()] + }) + ] +}); -export const event: Action> = (node, param) => { +export function trackEvent(name: string, data: object = null): void { if (!isTrackingAllowed()) { return; } - node.addEventListener(param.event ?? 'click', () => { - gtag('event', param.name, { - ...param.parameters, - action: param.action - }); - }); -}; + analytics.track(name, { ...data, path: get(page).routeId }); +} -const isTrackingAllowed = () => { - if (!('gtag' in window)) { - return false; +export function trackPageView(path: string) { + if (!isTrackingAllowed()) { + return; } + analytics.page({ + path + }); +} + +function isTrackingAllowed() { if (window.navigator?.doNotTrack) { if (navigator.doNotTrack === '1' || navigator.doNotTrack === 'yes') { return false; @@ -36,4 +40,4 @@ const isTrackingAllowed = () => { } else { return true; } -}; +} diff --git a/src/lib/components/cardContainer.svelte b/src/lib/components/cardContainer.svelte index 126e61c971..ca00145ba3 100644 --- a/src/lib/components/cardContainer.svelte +++ b/src/lib/components/cardContainer.svelte @@ -5,6 +5,7 @@ export let offset = 0; export let limit = $cardLimit; export let total = 0; + export let event: string = null; @@ -164,7 +167,9 @@ disabled={true} on:click={() => { updateSessionLength(); - }}>Update + }}> + Update + diff --git a/src/routes/console/project-[project]/auth/settings/+page.svelte b/src/routes/console/project-[project]/auth/settings/+page.svelte index f2b845303a..4f3bd59fe8 100644 --- a/src/routes/console/project-[project]/auth/settings/+page.svelte +++ b/src/routes/console/project-[project]/auth/settings/+page.svelte @@ -8,10 +8,10 @@ import { project } from '../../store'; import { authMethods, type AuthMethod } from '$lib/stores/auth-methods'; import { OAuthProviders } from '$lib/stores/oauth-providers'; - import { event } from '$lib/actions/analytics'; - import type { Provider } from '$lib/stores/oauth-providers'; import { app } from '$lib/stores/app'; import { page } from '$app/stores'; + import type { Provider } from '$lib/stores/oauth-providers'; + import { trackEvent } from '$lib/actions/analytics'; const projectId = $page.params.project; @@ -20,7 +20,7 @@ OAuthProviders.load($project); } - const authUpdate = async (box: AuthMethod) => { + async function authUpdate(box: AuthMethod) { try { await sdkForConsole.projects.updateAuthStatus(projectId, box.method, box.value); addNotification({ @@ -29,6 +29,10 @@ box.value ? 'enabled' : 'disabled' }` }); + trackEvent('submit_auth_status_update', { + method: box.method, + value: box.value + }); } catch (error) { box.value = !box.value; addNotification({ @@ -36,7 +40,7 @@ message: error.message }); } - }; + } let selectedProvider: Provider | null = null; @@ -69,14 +73,9 @@ class="card u-flex u-flex-vertical u-cross-center u-width-full-line" on:click={() => { selectedProvider = provider; - }} - use:event={{ - name: 'console_users', - action: 'click_update', - event: 'click', - parameters: { - provider: provider.name - } + trackEvent(`click_select_provider`, { + provider: provider.name.toLowerCase() + }); }}>
(selectedProvider = null)} - showModal /> + on:close={() => (selectedProvider = null)} /> {/if} diff --git a/src/routes/console/project-[project]/auth/teams/[[page]]/+page.svelte b/src/routes/console/project-[project]/auth/teams/[[page]]/+page.svelte index fec59dafbf..c1b3128d45 100644 --- a/src/routes/console/project-[project]/auth/teams/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/auth/teams/[[page]]/+page.svelte @@ -13,7 +13,6 @@ import { Empty, EmptySearch, AvatarInitials, Pagination, SearchQuery } from '$lib/components'; import Create from '../../_createTeam.svelte'; import { goto } from '$app/navigation'; - import { event } from '$lib/actions/analytics'; import { toLocaleDateTime } from '$lib/helpers/date'; import { Container } from '$lib/layout'; import { base } from '$app/paths'; @@ -33,18 +32,9 @@ - - - + {#if data.teams.total} diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/+page.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/+page.svelte index 43e53afb2c..ecf2c008f0 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/+page.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/+page.svelte @@ -11,6 +11,7 @@ import { Dependencies } from '$lib/constants'; import { invalidate } from '$app/navigation'; import DeleteTeam from './deleteTeam.svelte'; + import { trackEvent } from '$lib/actions/analytics'; let showDelete = false; let teamName: string = null; @@ -27,6 +28,7 @@ message: 'Name has been updated', type: 'success' }); + trackEvent('submit_team_update_name'); } catch (error) { addNotification({ message: error.message, @@ -68,11 +70,7 @@ - + @@ -99,7 +97,9 @@ - + diff --git a/src/routes/console/project-[project]/auth/teams/team-[team]/createMembership.svelte b/src/routes/console/project-[project]/auth/teams/team-[team]/createMembership.svelte index 2092d0f738..91e1e28b2f 100644 --- a/src/routes/console/project-[project]/auth/teams/team-[team]/createMembership.svelte +++ b/src/routes/console/project-[project]/auth/teams/team-[team]/createMembership.svelte @@ -1,5 +1,6 @@ - - - Delete All Memberships - -

- Are you sure you want to delete {$user.name}'s all memberships? -

- - - - -
diff --git a/src/routes/console/project-[project]/auth/user-[user]/deleteAllSessions.svelte b/src/routes/console/project-[project]/auth/user-[user]/deleteAllSessions.svelte index f80d82f50e..5f8144d8af 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/deleteAllSessions.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/deleteAllSessions.svelte @@ -1,6 +1,7 @@ {#if data.memberships.total} -
- -
Name - Role + Roles + Joined @@ -50,14 +46,18 @@ {membership.teamName ? membership.teamName : 'n/a'} - {membership.roles} - + {membership.roles} + + {toLocaleDateTime(membership.joined)} + + @@ -72,15 +72,14 @@ + href="https://appwrite.io/docs/server/auth?sdk=nodejs-default#usersGetMemberships"> + Documentation + {/if}

Total results: {data.memberships.total}

-
- diff --git a/src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.svelte b/src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.svelte index 44df5194b7..1a00869b76 100644 --- a/src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/auth/user-[user]/sessions/[[page]]/+page.svelte @@ -95,7 +95,6 @@ {/if}

Total results: {data.sessions.total}

-
diff --git a/src/routes/console/project-[project]/databases/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/[[page]]/+page.svelte index 09a52eda26..a11c822870 100644 --- a/src/routes/console/project-[project]/databases/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/databases/[[page]]/+page.svelte @@ -26,13 +26,16 @@
Databases -
{#if data.databases.total} - (showCreate = true)}> + (showCreate = true)} + event="database"> {#each data.databases.databases as database} diff --git a/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.svelte index a4187a6db2..7a33759a6d 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/[[page]]/+page.svelte @@ -32,7 +32,7 @@
Collections - @@ -40,18 +40,13 @@ {#if data.collections.total} (showCreate = true)}> {#each data.collections.collections as collection} - {collection.name} {#if !collection.enabled} diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte index 380dad784f..4aed513a9b 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/[[page]]/+page.svelte @@ -39,7 +39,10 @@
Documents - diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.svelte index 60b7258253..029c8c45f9 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/activity/[[page]]/+page.svelte @@ -4,6 +4,7 @@ import type { PageData } from './$types'; export let data: PageData; + const path = `/console/project-${$page.params.project}/databases/database-${$page.params.database}/collection-${$page.params.collection}/activity`; diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte index 0b7e693ad4..1b7c7501e0 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/+page.svelte @@ -30,7 +30,7 @@
Attributes - diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/deleteAttribute.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/deleteAttribute.svelte index b9497a5711..ee82e3ccee 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/deleteAttribute.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/attributes/deleteAttribute.svelte @@ -9,6 +9,7 @@ import type { Attributes } from '../store'; import { sdkForProject } from '$lib/stores/sdk'; import { Dependencies } from '$lib/constants'; + import { trackEvent } from '$lib/actions/analytics'; export let showDelete = false; export let selectedAttribute: Attributes; @@ -27,6 +28,7 @@ type: 'success', message: `Attribute has been deleted` }); + trackEvent('submit_attribute_delete'); await goto( `${base}/console/project-${$page.params.project}/databases/database-${databaseId}/collection-${$page.params.collection}/attributes` ); diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/createAttribute.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/createAttribute.svelte index c4fe7b59fb..460f2d146a 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/createAttribute.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/createAttribute.svelte @@ -8,6 +8,7 @@ import { addNotification } from '$lib/stores/notifications'; import { base } from '$app/paths'; import type { Attributes } from './store'; + import { trackEvent } from '$lib/actions/analytics'; export let showCreate = false; @@ -35,6 +36,7 @@ message: `Attribute ${key} has been created` }); showCreate = false; + trackEvent('submit_attribute_create'); } catch (error) { addNotification({ type: 'error', diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+page.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+page.svelte index 4bc625c9b6..fe3ede417c 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+page.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/+page.svelte @@ -12,6 +12,7 @@ import { Permissions } from '$lib/components/permissions'; import { invalidate } from '$app/navigation'; import { Dependencies } from '$lib/constants'; + import { trackEvent } from '$lib/actions/analytics'; let showDelete = false; let permissions = $doc?.$permissions; @@ -32,6 +33,7 @@ message: 'Permissions have been updated', type: 'success' }); + trackEvent('submit_document_update_permission'); } catch (error) { addNotification({ message: error.message, diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/delete.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/delete.svelte index e69daa4c5f..5437d30643 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/delete.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/delete.svelte @@ -2,6 +2,7 @@ import { goto } from '$app/navigation'; import { base } from '$app/paths'; import { page } from '$app/stores'; + import { trackEvent } from '$lib/actions/analytics'; import { Modal } from '$lib/components'; import { Button } from '$lib/elements/forms'; import { addNotification } from '$lib/stores/notifications'; @@ -24,6 +25,7 @@ type: 'success', message: `Document has been deleted` }); + trackEvent('submit_document_delete'); await goto( `${base}/console/project-${$page.params.project}/databases/database-${$page.params.database}/collection-${$page.params.collection}` ); diff --git a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/header.svelte b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/header.svelte index 7cdec919cc..fadc81c34a 100644 --- a/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/header.svelte +++ b/src/routes/console/project-[project]/databases/database-[database]/collection-[collection]/document-[document]/header.svelte @@ -14,11 +14,13 @@ const tabs = [ { href: path, - title: 'Overview' + title: 'Overview', + event: 'overview' }, { href: `${path}/activity`, title: 'Activity', + event: 'activity', hasChildren: true } ]; @@ -30,7 +32,7 @@ href={`/console/project-${projectId}/databases/database-${databaseId}/collection-${collectionId}`}> {$doc?.$id} - +