diff --git a/src/lib/elements/forms/inputTags.svelte b/src/lib/elements/forms/inputTags.svelte
index 0ad75a294..b9dc93686 100644
--- a/src/lib/elements/forms/inputTags.svelte
+++ b/src/lib/elements/forms/inputTags.svelte
@@ -88,7 +88,7 @@
export let disabled = false;
+ export let selected = false;
export let success = false;
export let warning = false;
export let danger = false;
@@ -18,6 +19,7 @@
rel={external ? 'noopener noreferrer' : ''}
class="tag"
class:is-disabled={disabled}
+ class:is-selected={selected}
class:is-success={success}
class:is-warning={warning}
class:is-danger={danger}
@@ -31,6 +33,7 @@
type={submit ? 'submit' : 'button'}
class="tag"
class:is-disabled={disabled}
+ class:is-selected={selected}
class:is-success={success}
class:is-warning={warning}
class:is-danger={danger}
@@ -41,6 +44,7 @@
;
+ path: string;
+ analyticsId: string;
+ debug?: boolean;
+};
+
+const vitalsUrl = 'https://vitals.vercel-analytics.com/v1/vitals';
+
+function getConnectionSpeed() {
+ return 'connection' in navigator &&
+ navigator['connection'] &&
+ 'effectiveType' in navigator['connection']
+ ? navigator['connection']['effectiveType']
+ : '';
+}
+
+function sendToAnalytics(metric: Metric, options: Options) {
+ const page = Object.entries(options.params).reduce(
+ (acc, [key, value]) => acc.replace(value, `[${key}]`),
+ options.path
+ );
+
+ const body = {
+ dsn: options.analyticsId,
+ id: metric.id,
+ page,
+ href: location.href,
+ event_name: metric.name,
+ value: metric.value.toString(),
+ speed: getConnectionSpeed()
+ };
+
+ if (options.debug) {
+ console.log('[Analytics]', metric.name, JSON.stringify(body, null, 2));
+ }
+
+ const blob = new Blob([new URLSearchParams(body).toString()], {
+ // This content type is necessary for `sendBeacon`
+ type: 'application/x-www-form-urlencoded'
+ });
+ if (navigator.sendBeacon) {
+ navigator.sendBeacon(vitalsUrl, blob);
+ } else
+ fetch(vitalsUrl, {
+ body: blob,
+ method: 'POST',
+ credentials: 'omit',
+ keepalive: true
+ });
+}
+
+export function webVitals(options: Options) {
+ try {
+ getFID((metric) => sendToAnalytics(metric, options));
+ getTTFB((metric) => sendToAnalytics(metric, options));
+ getLCP((metric) => sendToAnalytics(metric, options));
+ getCLS((metric) => sendToAnalytics(metric, options));
+ getFCP((metric) => sendToAnalytics(metric, options));
+ } catch (err) {
+ console.error('[Analytics]', err);
+ }
+}
diff --git a/src/lib/layout/notification.svelte b/src/lib/layout/notification.svelte
index 0cca8694d..a6d6e9c7b 100644
--- a/src/lib/layout/notification.svelte
+++ b/src/lib/layout/notification.svelte
@@ -20,7 +20,7 @@
Users Limit
- This limits new users from signing up for your project, regardless of authentication
- method. You can still create users from your Appwrite console.
+ Limit new users from signing up for your project, regardless of authentication method.
+ You can still create users and team memberships from your Appwrite console.
+ The maximum limit is 10,000 users.
@@ -135,7 +136,7 @@
- Session Length - (Coming Soon)
+ Session Length (Coming Soon)
If you reduce the limit, users who are currently logged in will be logged out of the
application.
diff --git a/src/routes/console/[project]/authentication/user/[user]/memberships/+page.svelte b/src/routes/console/[project]/authentication/user/[user]/memberships/+page.svelte
index cba74b42f..934febeec 100644
--- a/src/routes/console/[project]/authentication/user/[user]/memberships/+page.svelte
+++ b/src/routes/console/[project]/authentication/user/[user]/memberships/+page.svelte
@@ -51,14 +51,14 @@
{#each response.memberships as membership}
+ href={`${base}/console/${project}/authentication/teams/${membership.teamId}`}>
-
{membership.userName ? membership.userName : 'n/a'}
+ src={getAvatar(membership.teamName)}
+ name={membership.teamName} />
+
{membership.teamName ? membership.teamName : 'n/a'}
{membership.roles}
diff --git a/src/routes/console/[project]/storage/+page.svelte b/src/routes/console/[project]/storage/+page.svelte
index d65192ec9..930439a4b 100644
--- a/src/routes/console/[project]/storage/+page.svelte
+++ b/src/routes/console/[project]/storage/+page.svelte
@@ -31,7 +31,7 @@
Buckets
(showCreate = true)}>
- Add bucket
+ Create bucket
diff --git a/src/routes/console/[project]/storage/bucket/[bucket]/+page.svelte b/src/routes/console/[project]/storage/bucket/[bucket]/+page.svelte
index 3d8647b4e..6e248005e 100644
--- a/src/routes/console/[project]/storage/bucket/[bucket]/+page.svelte
+++ b/src/routes/console/[project]/storage/bucket/[bucket]/+page.svelte
@@ -17,7 +17,7 @@
TableCell
} from '$lib/elements/table';
import { toLocaleDate } from '$lib/helpers/date';
- import { bytesToSize } from '$lib/helpers/sizeConvertion';
+ import { calculateSize } from '$lib/helpers/sizeConvertion';
import { Container } from '$lib/layout';
import { base } from '$app/paths';
import { files } from './store';
@@ -97,7 +97,7 @@
{file.mimeType}
{bytesToSize(file.sizeOriginal)}
+ >{calculateSize(file.sizeOriginal)}
{toLocaleDate(file.$createdAt)}
@@ -132,7 +132,7 @@
{file.mimeType}
{bytesToSize(file.sizeOriginal)}
+ >{calculateSize(file.sizeOriginal)}
{toLocaleDate(file.$createdAt)}
diff --git a/src/routes/console/[project]/storage/bucket/[bucket]/_create.svelte b/src/routes/console/[project]/storage/bucket/[bucket]/_create.svelte
index 38317a0af..a0a1c4b00 100644
--- a/src/routes/console/[project]/storage/bucket/[bucket]/_create.svelte
+++ b/src/routes/console/[project]/storage/bucket/[bucket]/_create.svelte
@@ -7,7 +7,7 @@
import { page } from '$app/stores';
import { uploader } from '$lib/stores/uploader';
import { bucket } from './store';
- import { bytesToSize } from '$lib/helpers/sizeConvertion';
+ import { calculateSize } from '$lib/helpers/sizeConvertion';
export let showCreate = false;
@@ -120,7 +120,7 @@
- Max file size: {bytesToSize($bucket.maximumFileSize)}
+ Max file size: {calculateSize($bucket.maximumFileSize)}
{#if !showDropdown}
diff --git a/src/routes/console/[project]/storage/bucket/[bucket]/file/[file]/+page.svelte b/src/routes/console/[project]/storage/bucket/[bucket]/file/[file]/+page.svelte
index d8dce4d29..95b977653 100644
--- a/src/routes/console/[project]/storage/bucket/[bucket]/file/[file]/+page.svelte
+++ b/src/routes/console/[project]/storage/bucket/[bucket]/file/[file]/+page.svelte
@@ -7,7 +7,7 @@
import { toLocaleDate, toLocaleDateTime } from '$lib/helpers/date';
import { sdkForProject } from '$lib/stores/sdk';
import { addNotification } from '$lib/stores/notifications';
- import { bytesToSize } from '$lib/helpers/sizeConvertion';
+ import { calculateSize } from '$lib/helpers/sizeConvertion';
import Delete from './_deleteFile.svelte';
import { page } from '$app/stores';
import { onMount } from 'svelte';
@@ -101,7 +101,7 @@
MIME Type: {$file.mimeType}
-
Size: {bytesToSize($file.sizeOriginal)}
+
Size: {calculateSize($file.sizeOriginal)}
Created: {toLocaleDate($file.$createdAt)}
Last Updated: {toLocaleDate($file.$updatedAt)}
diff --git a/src/routes/console/[project]/storage/bucket/[bucket]/settings/+page.svelte b/src/routes/console/[project]/storage/bucket/[bucket]/settings/+page.svelte
index f43705893..e35efd599 100644
--- a/src/routes/console/[project]/storage/bucket/[bucket]/settings/+page.svelte
+++ b/src/routes/console/[project]/storage/bucket/[bucket]/settings/+page.svelte
@@ -2,27 +2,26 @@
import { Alert, CardGrid, Box } from '$lib/components';
import { Container } from '$lib/layout';
import {
+ Form,
Button,
InputText,
InputTags,
InputNumber,
InputSelect,
- InputSwitch,
- Helper
+ InputSwitch
} from '$lib/elements/forms';
import { bucket } from '../store';
import { toLocaleDateTime } from '$lib/helpers/date';
- import { sizeToBytes } from '$lib/helpers/sizeConvertion';
+ import { sizeToBytes, bytesToSize } from '$lib/helpers/sizeConvertion';
import { sdkForProject } from '$lib/stores/sdk';
import { addNotification } from '$lib/stores/notifications';
import Delete from '../_deleteBucket.svelte';
import { onMount } from 'svelte';
import { page } from '$app/stores';
+ import Pill from '$lib/elements/pill.svelte';
let showDelete = false;
- let showError: false | 'name' | 'size' = false,
- errorMessage = 'Something went wrong',
- errorType: 'error' | 'warning' | 'success' = 'error';
+
let enabled: boolean = null,
bucketName: string = null,
bucketPermissions: string = null,
@@ -32,13 +31,14 @@
encryption: boolean = null,
antivirus: boolean = null,
maxSize: number;
- let byteUnit: 'Bytes' | 'KB' | 'MB' | 'GB' = 'Bytes',
+ let byteUnit: 'Bytes' | 'KB' | 'MB' | 'GB' = 'MB',
options = [
{ label: 'Bytes', value: 'Bytes' },
{ label: 'Kilobytes', value: 'KB' },
{ label: 'Megabytes', value: 'MB' },
{ label: 'Gigabytes', value: 'GB' }
];
+ let suggestedExtensions = ['jpg', 'png', 'svg', 'gif', 'html', 'pdf', 'mp4'];
let extensions = $bucket.allowedFileExtensions;
let isExtensionsDisabled = true;
@@ -53,7 +53,7 @@
encryption ??= $bucket.encryption;
antivirus ??= $bucket.antivirus;
});
-
+ $: maxSizePlaceholder = bytesToSize($bucket.maximumFileSize, byteUnit);
$: if (bucketPermissions || bucketRead || bucketWrite) {
if (bucketPermissions !== $bucket.permission) {
arePermsDisabled = false;
@@ -73,12 +73,6 @@
} else isExtensionsDisabled = true;
}
- function addError(location: typeof showError, message: string, type: typeof errorType) {
- showError = location;
- errorMessage = message;
- errorType = type;
- }
-
async function toggleBucket() {
try {
await sdkForProject.storage.updateBucket(
@@ -105,13 +99,15 @@
try {
await sdkForProject.storage.updateBucket($bucket.$id, $bucket.name, $bucket.permission);
$bucket.name = bucketName;
- showError = false;
addNotification({
message: 'Name has been updated',
type: 'success'
});
} catch (error) {
- addError('name', error.message, 'error');
+ addNotification({
+ message: error.message,
+ type: 'error'
+ });
}
}
async function updatePermissions() {
@@ -156,7 +152,7 @@
$bucket.encryption = encryption;
$bucket.antivirus = antivirus;
addNotification({
- message: `${$bucket.name} has been updatede`,
+ message: `${$bucket.name} has been updated`,
type: 'success'
});
} catch (error) {
@@ -181,7 +177,7 @@
);
$bucket.maximumFileSize = maxSize;
addNotification({
- message: `${$bucket.name} has been updatede`,
+ message: `${$bucket.name} has been updated`,
type: 'success'
});
} catch (error) {
@@ -206,7 +202,7 @@
);
$bucket.allowedFileExtensions = extensions;
addNotification({
- message: `${$bucket.name} has been updatede`,
+ message: `${$bucket.name} has been updated`,
type: 'success'
});
} catch (error) {
@@ -220,230 +216,233 @@
{#if $bucket}
-
- {$bucket.name}
+
+
-
- Update Name
+
+
+
+
+ Update
+
+
+
-
- {
- updateName();
- }}>Update
-
-
-
- Update Permissions
-
- Assign read or write permissions at the Bucket Level or
- File Level . If Bucket Level permissions are assigned, file permissions will
- be ignored.
-
-
-
-
-
- Tip: Add role:all for wildcards access. Check out our documentation
- for more on Permissions
-
-
- {#if bucketPermissions === 'bucket'}
+
+
+
+
+