diff --git a/package-lock.json b/package-lock.json index 3a1c153f5..befa11dd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,8 +7,8 @@ "name": "@appwrite/console", "dependencies": { "@appwrite.io/console": "^0.6.0-rc.17", - "@appwrite.io/pink": "0.4.0", - "@appwrite.io/pink-icons": "0.4.0", + "@appwrite.io/pink": "0.5.0", + "@appwrite.io/pink-icons": "0.5.0", "@popperjs/core": "^2.11.8", "@sentry/svelte": "^7.66.0", "@sentry/tracing": "^7.66.0", @@ -167,19 +167,19 @@ } }, "node_modules/@appwrite.io/pink": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@appwrite.io/pink/-/pink-0.4.0.tgz", - "integrity": "sha512-48g2MQIFaEXPXobJ77wJK73YRUkpUZSAkRNa3XJhtC0N2WSTXD3poXBAVYb2QfjGW4e5U1tM/WYC0ZQMtjEzlQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@appwrite.io/pink/-/pink-0.5.0.tgz", + "integrity": "sha512-UVnek/tigxoU0FksVT77cCx0+JTKA+43HAslqJIZFnV4kKIbQnCQiX0hrj2hhHzuAaWTCSvSQftq0SbGORDb/A==", "dependencies": { - "@appwrite.io/pink-icons": "0.4.0", + "@appwrite.io/pink-icons": "0.5.0", "normalize.css": "^8.0.1", "the-new-css-reset": "^1.11.2" } }, "node_modules/@appwrite.io/pink-icons": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@appwrite.io/pink-icons/-/pink-icons-0.4.0.tgz", - "integrity": "sha512-o1r101GRK72nBbeVL76H7NIwucrW8+vbzs41AMBPbnK+uAGhNb9ui5Na7gi6NtnBxHYnPDECg93bZhoLYlQ6XA==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@appwrite.io/pink-icons/-/pink-icons-0.5.0.tgz", + "integrity": "sha512-IHob3TsvBFZo6Ya78+MPm5bKBHzFZtoJDgmClRSOOTtr1K74mditZj4sA+5haBN/4N0L3g8QtOpR4gd2vV+T3g==" }, "node_modules/@babel/code-frame": { "version": "7.23.5", diff --git a/package.json b/package.json index 1afb8d285..ff59f21fc 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ }, "dependencies": { "@appwrite.io/console": "^0.6.0-rc.17", - "@appwrite.io/pink": "0.4.0", - "@appwrite.io/pink-icons": "0.4.0", + "@appwrite.io/pink": "0.5.0", + "@appwrite.io/pink-icons": "0.5.0", "@popperjs/core": "^2.11.8", "@sentry/svelte": "^7.66.0", "@sentry/tracing": "^7.66.0", diff --git a/src/lib/components/filePicker.svelte b/src/lib/components/filePicker.svelte new file mode 100644 index 000000000..3ec802af3 --- /dev/null +++ b/src/lib/components/filePicker.svelte @@ -0,0 +1,544 @@ + + + + + +
+ + + +
+
+ + diff --git a/src/lib/components/id.svelte b/src/lib/components/id.svelte index 46f3910f8..42aad2c8f 100644 --- a/src/lib/components/id.svelte +++ b/src/lib/components/id.svelte @@ -47,7 +47,7 @@ } - +
{/if} + + diff --git a/src/lib/elements/forms/index.ts b/src/lib/elements/forms/index.ts index 8d022c660..739ac3823 100644 --- a/src/lib/elements/forms/index.ts +++ b/src/lib/elements/forms/index.ts @@ -31,3 +31,4 @@ export { default as InputDate } from './inputDate.svelte'; export { default as InputDateRange } from './inputDateRange.svelte'; export { default as InputTime } from './inputTime.svelte'; export { default as InputDigits } from './inputDigits.svelte'; +export { default as InputFilePicker } from './inputFilePicker.svelte'; diff --git a/src/lib/elements/forms/inputFilePicker.svelte b/src/lib/elements/forms/inputFilePicker.svelte new file mode 100644 index 000000000..96e4ed104 --- /dev/null +++ b/src/lib/elements/forms/inputFilePicker.svelte @@ -0,0 +1,104 @@ + + +
+ {#if label} + + {/if} +
+
+
+
+
+
+ Select a file to upload + Select a file to upload +
+
+
+ Max file size: 1MB + +
+ + {#if value} + {@const fileSize = humanFileSize(value.sizeOriginal)} +
    +
  • +
  • +
+ {/if} +
+
+
+ +{#if show} + +{/if} diff --git a/src/lib/elements/forms/inputSearch.svelte b/src/lib/elements/forms/inputSearch.svelte index b48debce7..b4edb489a 100644 --- a/src/lib/elements/forms/inputSearch.svelte +++ b/src/lib/elements/forms/inputSearch.svelte @@ -9,6 +9,7 @@ export let disabled = false; export let autofocus = false; export let isWithEndButton = true; + export let style: string = ''; const dispatch = createEventDispatcher(); let element: HTMLInputElement; @@ -53,6 +54,7 @@ {placeholder} {disabled} {required} + {style} type="search" class="input-text" bind:this={element} diff --git a/src/lib/elements/table/table.svelte b/src/lib/elements/table/table.svelte index 81df3e41a..503235d98 100644 --- a/src/lib/elements/table/table.svelte +++ b/src/lib/elements/table/table.svelte @@ -3,12 +3,14 @@ export let noStyles = false; export let style = ''; export let transparent = false; + export let dense = false;
= (node) => { @@ -45,6 +46,7 @@ diff --git a/src/routes/console/project-[project]/messaging/+layout.svelte b/src/routes/console/project-[project]/messaging/+layout.svelte index b379323a0..3890483eb 100644 --- a/src/routes/console/project-[project]/messaging/+layout.svelte +++ b/src/routes/console/project-[project]/messaging/+layout.svelte @@ -13,6 +13,7 @@ import { topicsSearcher } from '$lib/commandCenter/searchers/topics'; import { project } from '../store'; + // TODO: finalize the commands $: $registerCommands([ { label: 'Create message', diff --git a/src/routes/console/project-[project]/messaging/create.svelte b/src/routes/console/project-[project]/messaging/create.svelte index e1f5d15bf..2fc108a12 100644 --- a/src/routes/console/project-[project]/messaging/create.svelte +++ b/src/routes/console/project-[project]/messaging/create.svelte @@ -49,6 +49,8 @@ break; case MessagingProviderType.Push: { + const file = $messageParams[MessagingProviderType.Push].file; + const fileCompoundId = `${file.bucketId}:${file.bucketId}`; const customData: Record = {}; const { data } = $messageParams[MessagingProviderType.Push]; if (data && data.length > 0) { @@ -67,7 +69,7 @@ $messageParams[$providerType].targets, customData, undefined, - undefined, + fileCompoundId, undefined, undefined, undefined, diff --git a/src/routes/console/project-[project]/messaging/message-[message]/pushMessage.svelte b/src/routes/console/project-[project]/messaging/message-[message]/pushMessage.svelte index d35aa1131..843947b85 100644 --- a/src/routes/console/project-[project]/messaging/message-[message]/pushMessage.svelte +++ b/src/routes/console/project-[project]/messaging/message-[message]/pushMessage.svelte @@ -7,6 +7,7 @@ FormItemPart, FormList, Helper, + InputFilePicker, InputText, InputTextarea, Label @@ -21,18 +22,26 @@ import { Submit, trackError, trackEvent } from '$lib/actions/analytics'; import { validateData } from '../wizard/pushFormList.svelte'; - export let message: Models.Message & { data: Record }; + /* eslint @typescript-eslint/no-explicit-any: 'off' */ + export let message: Models.Message & { data: Record }; let title = ''; let body = ''; + let file: Models.File = null; let originalCustomData: [string, string][] = [['', '']]; let customData: [string, string][] = [['', '']]; let dataError = ''; let disabled = true; - onMount(() => { + onMount(async () => { title = message.data.title; body = message.data.body; + if (message.data?.image) { + file = await sdk.forProject.storage.getFile( + message.data.image?.bucketId, + message.data.image?.fileId + ); + } const dataEntries: [string, string][] = []; Object.entries(message.data['data'] ?? {}).forEach(([key, value]) => { @@ -44,6 +53,7 @@ async function update() { try { + const fileCompoundId = file ? `${file.bucketId}:${file.$id}` : undefined; const data = customData.reduce((acc, [key, value]) => { if (key) { acc[key] = value; @@ -57,7 +67,9 @@ undefined, title, body, - data + data, + undefined, + fileCompoundId ); originalCustomData = structuredClone(customData); await invalidate(Dependencies.MESSAGING_MESSAGE); @@ -79,6 +91,8 @@ $: disabled = title === message.data.title && body === message.data.body && + file?.$id === message.data.image?.fileId && + file?.bucketId === message.data.image?.bucketId && originalCustomData.length === customData.length && originalCustomData.every( (ocd, i) => @@ -99,13 +113,20 @@ + disabled={message.status !== 'draft'} + bind:value={title} /> + disabled={message.status !== 'draft'} + bind:value={body} /> + + +