Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
cdff501
treat filter datetime inputs as local; convert to UTC on apply
HarshMN2345 Nov 6, 2025
e2c8613
fix: responsive layout for input fields and tables on mobile devices
AbhiVarde Nov 25, 2025
5ccfd08
fix: apply review feedback
AbhiVarde Nov 25, 2025
ff4ff0c
Pagination for list repositories
hmacr Nov 28, 2025
fe7fdeb
fix: disable free plan in selection if one already exists.
ItzNotABug Dec 2, 2025
b3b19df
Merge pull request #2662 from appwrite/disable-free-when-applicable
ItzNotABug Dec 2, 2025
3b172e7
add: column waiting logic on ai suggestions as well.
ItzNotABug Dec 2, 2025
e977a00
Merge pull request #2663 from appwrite/fix-sample-data
ItzNotABug Dec 2, 2025
fa9c9d4
feat: add quick create-organization button in org header
HarshMN2345 Dec 2, 2025
ea3216d
use stack
HarshMN2345 Dec 2, 2025
e79bffb
Fix: retry payment model while adding new payment method
lohanidamodar Dec 2, 2025
f7a5bfc
remove log
lohanidamodar Dec 2, 2025
4f386f6
remove import
lohanidamodar Dec 2, 2025
20874f5
Merge pull request #2666 from appwrite/fix-retry-payment-model
lohanidamodar Dec 3, 2025
20e9ef9
Merge branch 'main' into ser-504
hmacr Dec 3, 2025
4531063
Merge pull request #2639 from AbhiVarde/fix-2629-mobile-responsive-ta…
ItzNotABug Dec 4, 2025
d3bd71e
fix: direct url hits for wrong platform org and projects.
ItzNotABug Dec 5, 2025
2653a93
used plussm icon
HarshMN2345 Dec 5, 2025
97afec4
update SDK
hmacr Dec 5, 2025
5eac7d7
Merge pull request #2664 from appwrite/feat-SER-360-quick-org-access-…
ItzNotABug Dec 5, 2025
1ab59eb
feedback
hmacr Dec 5, 2025
76f4ec1
Merge pull request #2670 from appwrite/fix-direct-org-hits
ItzNotABug Dec 5, 2025
231613a
Hide internal OAuth providers from UI
TorstenDittmann Dec 4, 2025
1b7299e
Merge pull request #2671 from appwrite/fix-internal-oauth-providers
TorstenDittmann Dec 5, 2025
6344127
Merge pull request #2654 from appwrite/ser-504
ItzNotABug Dec 5, 2025
71db5d6
Fix bottom-nav-container z-index in database subNavigation (#2672)
Copilot Dec 6, 2025
3cd0f12
truncate long labels
HarshMN2345 Dec 6, 2025
38cf37d
changed character limit
HarshMN2345 Dec 6, 2025
4f19450
Merge pull request #2675 from appwrite/fix-SER-SER-414-truncate-long-…
ItzNotABug Dec 6, 2025
2803000
Fix: Migration redirect 404 on self-hosted instances
WhoamiI00 Dec 6, 2025
577410f
Merge pull request #2571 from appwrite/fix-SER-529-datetime-local-to-…
ItzNotABug Dec 7, 2025
44898e5
enable file upload for push notifications
HarshMN2345 Dec 7, 2025
1503e21
addressed comments
HarshMN2345 Dec 7, 2025
4e07f21
Merge pull request #2677 from WhoamiI00/fix-migration-redirect-404
ItzNotABug Dec 7, 2025
a499ae5
refactor: display "Buckets" instead of "Databases" in storage tab (#2…
floherzler Dec 8, 2025
c278a79
fix: ensure the entire $id cell is hidden if user hides (#2691)
stnguyen90 Dec 9, 2025
04a7ef0
Update src/lib/elements/forms/inputFilePicker.svelte
HarshMN2345 Dec 10, 2025
6c838e3
Merge pull request #2679 from appwrite/fix-SER-468-file-upload-for-pu…
ItzNotABug Dec 10, 2025
978bd4d
prevent squishing of organization header plus button
HarshMN2345 Dec 11, 2025
e26e9bb
Merge pull request #2697 from appwrite/fix-squished-icon-for-org-shor…
ItzNotABug Dec 11, 2025
55ad9a6
fix: states not updated.
ItzNotABug Dec 11, 2025
e714a46
Merge pull request #2698 from appwrite/fix-disabled-states
ItzNotABug Dec 11, 2025
83f360e
Merge branch 'main' into 'sync-main-studio'.
ItzNotABug Dec 11, 2025
1fbab91
lint and fixes.
ItzNotABug Dec 11, 2025
44fc77e
lint and fixes.
ItzNotABug Dec 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 51 additions & 39 deletions src/lib/components/billing/planSelection.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@
import { BillingPlan } from '$lib/constants';
import { formatCurrency } from '$lib/helpers/numbers';
import { currentPlan, organization } from '$lib/stores/organization';
import { Badge, Layout, Typography } from '@appwrite.io/pink-svelte';
import { Badge, Layout, Tooltip, Typography } from '@appwrite.io/pink-svelte';
import { LabelCard } from '..';
import type { Plan } from '$lib/sdk/billing';
import { page } from '$app/state';
import { ProfileMode, resolvedProfile } from '$lib/profiles/index.svelte';
import { InputSelect } from '$lib/elements/forms';
import { isFreePlan, isPaidPlan } from '$lib/helpers/billing';

export let disabled = false;
export let isNewOrg = false;
Expand Down Expand Up @@ -113,52 +114,63 @@
function handleTierChange(group: PlanGroup) {
billingPlan = selectedTiers[group.key] as BillingPlan;
}

function shouldShowTooltip(plan: Plan) {
if (isPaidPlan(plan.$id)) return true;
else return !anyOrgFree;
}
</script>

<Layout.Stack>
{#each groupedPlans as group (group.key)}
{@const basePlan = group.plans[0]}
<LabelCard
name="plan"
bind:group={billingPlan}
disabled={!selfService || (basePlan.$id === BillingPlan.FREE && anyOrgFree) || disabled}
tooltipShow={basePlan.$id === BillingPlan.FREE && anyOrgFree}
value={group.isGrouped ? selectedTiers[group.key] || basePlan.$id : basePlan.$id}
title={basePlan.name}>
<svelte:fragment slot="action">
{#if group.plans.some((plan) => $organization?.billingPlan === plan.$id) && !isNewOrg}
<Badge variant="secondary" size="xs" content="Current plan" />
{/if}
</svelte:fragment>

<Layout.Stack direction="column" gap="m">
<Layout.Stack direction="column" gap="xxs">
<Typography.Caption variant="400">
{basePlan.desc}
</Typography.Caption>

{#if !group.isGrouped}
<Typography.Text>
{@const isZeroPrice = (basePlan.price ?? 0) <= 0}
{@const price = formatCurrency(basePlan.price ?? 0)}
{#if resolvedProfile.id === ProfileMode.STUDIO}
{getPlanLabel(basePlan)}
{:else}
{isZeroPrice ? price : getPlanLabel(basePlan)}
{/if}
</Typography.Text>
<Tooltip disabled={shouldShowTooltip(basePlan)} maxWidth="fit-content">
<LabelCard
name="plan"
bind:group={billingPlan}
disabled={!selfService || (isFreePlan(basePlan.$id) && anyOrgFree) || disabled}
tooltipShow={isFreePlan(basePlan.$id) && anyOrgFree}
value={group.isGrouped ? selectedTiers[group.key] || basePlan.$id : basePlan.$id}
title={basePlan.name}>
<svelte:fragment slot="action">
{#if group.plans.some((plan) => $organization?.billingPlan === plan.$id) && !isNewOrg}
<Badge variant="secondary" size="xs" content="Current plan" />
{/if}
</svelte:fragment>

<Layout.Stack direction="column" gap="m">
<Layout.Stack direction="column" gap="xxs">
<Typography.Caption variant="400">
{basePlan.desc}
</Typography.Caption>

{#if !group.isGrouped}
<Typography.Text>
{@const isZeroPrice = (basePlan.price ?? 0) <= 0}
{@const price = formatCurrency(basePlan.price ?? 0)}
{#if resolvedProfile.id === ProfileMode.STUDIO}
{getPlanLabel(basePlan)}
{:else}
{isZeroPrice ? price : getPlanLabel(basePlan)}
{/if}
</Typography.Text>
{/if}
</Layout.Stack>

{#if group.isGrouped}
<InputSelect
id="tier-{group.key}"
bind:value={selectedTiers[group.key]}
on:change={() => handleTierChange(group)}
options={group.tierOptions} />
{/if}
</Layout.Stack>
</LabelCard>

{#if group.isGrouped}
<InputSelect
id="tier-{group.key}"
bind:value={selectedTiers[group.key]}
on:change={() => handleTierChange(group)}
options={group.tierOptions} />
{/if}
</Layout.Stack>
</LabelCard>
<svelte:fragment slot="tooltip">
Only 1 free organization is allowed per account.
</svelte:fragment>
</Tooltip>
{/each}

{#if $currentPlan && !currentPlanInList}
Expand Down
14 changes: 11 additions & 3 deletions src/lib/components/filePicker.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import { IconInfo, IconPlus, IconViewGrid, IconViewList } from '@appwrite.io/pink-icons-svelte';
import { showCreateBucket } from '$routes/(console)/project-[region]-[project]/storage/+page.svelte';
import { preferences } from '$lib/stores/preferences';
import { addNotification } from '$lib/stores/notifications';

export let show: boolean;
export let mimeTypeQuery: string = 'image/';
Expand Down Expand Up @@ -110,7 +111,10 @@
}
selectFile(file);
} catch (e) {
console.error(e);
addNotification({
type: 'error',
message: e.message
});
} finally {
uploading = false;
}
Expand Down Expand Up @@ -351,7 +355,9 @@
<Layout.Stack gap="l">
<Typography.Title size="s" color="--fgcolor-neutral-primary"
>{localFileBucketTitle}</Typography.Title>
<Upload.Dropzone bind:files={localFile} extensions={[allowedExtension]}>
<Upload.Dropzone
bind:files={localFile}
extensions={allowedExtension === '*' ? undefined : [allowedExtension]}>
<Layout.Stack alignItems="center" gap="s">
<Layout.Stack alignItems="center" gap="s">
<Layout.Stack
Expand All @@ -370,7 +376,9 @@
<Icon icon={IconInfo} size="s" />
</Layout.Stack>
<svelte:fragment slot="tooltip"
>{allowedExtension} files are allowed</svelte:fragment>
>{allowedExtension === '*'
? `${mimeTypeQuery} files are allowed`
: `${allowedExtension} files are allowed`}</svelte:fragment>
</Tooltip>
</Layout.Stack>
<Typography.Caption variant="400"
Expand Down
9 changes: 7 additions & 2 deletions src/lib/components/filters/content.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import type { Column } from '$lib/helpers/types';
import type { Writable } from 'svelte/store';
import { TagList } from '.';
import { toLocalDateTimeISO } from '$lib/helpers/date';
import { Icon, Layout } from '@appwrite.io/pink-svelte';
import { IconPlus } from '@appwrite.io/pink-icons-svelte';

Expand Down Expand Up @@ -79,7 +80,7 @@
value = column?.array ? [] : null;
if (column?.type === 'datetime') {
const now = new Date();
value = now.toISOString().slice(0, 16);
value = toLocalDateTimeISO(now.toISOString()).slice(0, 16);
}
// Initialize spatial data with default values
if (column?.type === 'point') {
Expand Down Expand Up @@ -108,7 +109,11 @@
if (isDistanceOperator && distanceValue !== null && value !== null) {
addFilter(columnsArray, columnId, operatorKey, value, arrayValues, distanceValue);
} else {
addFilter(columnsArray, columnId, operatorKey, value, arrayValues);
const preparedValue =
column?.type === 'datetime' && typeof value === 'string' && value
? new Date(value).toISOString()
: value;
addFilter(columnsArray, columnId, operatorKey, preparedValue, arrayValues);
}

columnId = null;
Expand Down
8 changes: 6 additions & 2 deletions src/lib/components/filters/filtersModal.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,11 @@
}

function addCondition() {
const newTag = generateTag(selectedColumn, operatorKey, value || arrayValues);
const preparedValue =
column?.type === 'datetime' && typeof value === 'string' && value
? new Date(value).toISOString()
: value;
const newTag = generateTag(selectedColumn, operatorKey, preparedValue || arrayValues);
if (localTags.some((t) => t.tag === newTag.tag && t.value === newTag.value)) {
return;
} else {
Expand All @@ -66,7 +70,7 @@
{
id: selectedColumn,
operator: operatorKey,
value: value,
value: preparedValue,
arrayValues: arrayValues
}
];
Expand Down
Loading
Loading