mirror of
https://github.com/immich-app/immich.git
synced 2026-07-07 13:07:04 -07:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3f350d971b | |||
| 05310bda32 | |||
| 7fdea5af2c | |||
| e9afd8c492 | |||
| 8de420493e |
@@ -23019,7 +23019,6 @@
|
||||
"slug": {
|
||||
"description": "Custom URL slug",
|
||||
"nullable": true,
|
||||
"pattern": "^[^\\/]*$",
|
||||
"type": "string"
|
||||
},
|
||||
"type": {
|
||||
@@ -23066,7 +23065,6 @@
|
||||
"slug": {
|
||||
"description": "Custom URL slug",
|
||||
"nullable": true,
|
||||
"pattern": "^[^\\/]*$",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
@@ -23147,7 +23145,6 @@
|
||||
"slug": {
|
||||
"description": "Custom URL slug",
|
||||
"nullable": true,
|
||||
"pattern": "^[^\\/]*$",
|
||||
"type": "string"
|
||||
},
|
||||
"type": {
|
||||
|
||||
@@ -163,19 +163,26 @@
|
||||
"description": "Filter by distance to a coordinate",
|
||||
"properties": {
|
||||
"latitude": {
|
||||
"type": "string",
|
||||
"type": "number",
|
||||
"title": "Latitude",
|
||||
"description": "GPS latitude of a coordinate which the asset must be close to"
|
||||
"description": "GPS latitude of a coordinate which the asset must be close to",
|
||||
"minimum": -90,
|
||||
"maximum": 90,
|
||||
"precision": 0.000001
|
||||
},
|
||||
"longitude": {
|
||||
"type": "string",
|
||||
"type": "number",
|
||||
"title": "Longitude",
|
||||
"description": "GPS longitude of a coordinate which the asset must be close to"
|
||||
"description": "GPS longitude of a coordinate which the asset must be close to",
|
||||
"minimum": -180,
|
||||
"maximum": 180,
|
||||
"precision": 0.000001
|
||||
},
|
||||
"radius": {
|
||||
"type": "number",
|
||||
"title": "Maximum distance",
|
||||
"description": "How close in kilometres the asset must be to the given point"
|
||||
"description": "How close in kilometres the asset must be to the given point",
|
||||
"minimum": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,10 +96,10 @@ const methods = wrapper<Manifest>({
|
||||
return { workflow: { continue: false } };
|
||||
}
|
||||
|
||||
const configLat = Number.parseFloat(config.coordinate?.latitude ?? '');
|
||||
const configLon = Number.parseFloat(config.coordinate?.longitude ?? '');
|
||||
const configLat = config.coordinate?.latitude;
|
||||
const configLon = config.coordinate?.longitude;
|
||||
|
||||
if (Number.isNaN(configLat) || Number.isNaN(configLat)) {
|
||||
if (configLat === undefined || configLon === undefined) {
|
||||
return { workflow: { continue: true } };
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,9 @@ const JsonSchemaPropertySchema = z
|
||||
description: z.string().describe('Description'),
|
||||
default: z.any().optional().describe('Default value'),
|
||||
enum: z.array(z.string()).optional().describe('Valid choices for enum types'),
|
||||
minimum: z.number().optional().describe('Minimum value for number types'),
|
||||
maximum: z.number().optional().describe('Maximum value for number types'),
|
||||
precision: z.number().default(1).optional().describe('Smallest interval (granularity) for number types'),
|
||||
array: z.boolean().optional().describe('Type is an array type'),
|
||||
required: z.array(z.string()).optional().describe('A list of required properties'),
|
||||
uiHint: z
|
||||
|
||||
@@ -18,12 +18,6 @@ const SharedLinkSearchSchema = z
|
||||
})
|
||||
.meta({ id: 'SharedLinkSearchDto' });
|
||||
|
||||
const SharedLinkSlugSchema = z
|
||||
.string()
|
||||
.regex(/^[^\/]*$/, 'forward slash "/" is not allowed')
|
||||
.nullable()
|
||||
.describe('Custom URL slug');
|
||||
|
||||
const SharedLinkCreateSchema = z
|
||||
.object({
|
||||
type: SharedLinkTypeSchema,
|
||||
@@ -31,7 +25,7 @@ const SharedLinkCreateSchema = z
|
||||
albumId: z.uuidv4().optional().describe('Album ID (for album sharing)'),
|
||||
description: z.string().nullable().optional().describe('Link description'),
|
||||
password: z.string().nullable().optional().describe('Link password'),
|
||||
slug: SharedLinkSlugSchema.optional(),
|
||||
slug: z.string().nullable().optional().describe('Custom URL slug'),
|
||||
expiresAt: isoDatetimeToDate.nullable().describe('Expiration date').default(null).optional(),
|
||||
allowUpload: z.boolean().optional().describe('Allow uploads'),
|
||||
allowDownload: z.boolean().default(true).optional().describe('Allow downloads'),
|
||||
@@ -43,7 +37,7 @@ const SharedLinkEditSchema = z
|
||||
.object({
|
||||
description: z.string().nullable().optional().describe('Link description'),
|
||||
password: z.string().nullable().optional().describe('Link password'),
|
||||
slug: SharedLinkSlugSchema.optional(),
|
||||
slug: z.string().nullable().optional().describe('Custom URL slug'),
|
||||
expiresAt: isoDatetimeToDate.nullish().describe('Expiration date'),
|
||||
allowUpload: z.boolean().optional().describe('Allow uploads'),
|
||||
allowDownload: z.boolean().optional().describe('Allow downloads'),
|
||||
@@ -72,7 +66,7 @@ const SharedLinkResponseSchema = z
|
||||
allowUpload: z.boolean().describe('Allow uploads'),
|
||||
allowDownload: z.boolean().describe('Allow downloads'),
|
||||
showMetadata: z.boolean().describe('Show metadata'),
|
||||
slug: SharedLinkSlugSchema,
|
||||
slug: z.string().nullable().describe('Custom URL slug'),
|
||||
})
|
||||
.describe('Shared link response')
|
||||
.meta({ id: 'SharedLinkResponseDto' });
|
||||
|
||||
@@ -100,7 +100,7 @@
|
||||
</Field>
|
||||
{:else if schema.type === 'number'}
|
||||
<Field {label} {description}>
|
||||
<NumberInput bind:value={getNumber, setValue} />
|
||||
<NumberInput bind:value={getNumber, setValue} step={schema.precision} min={schema.minimum} max={schema.maximum} />
|
||||
</Field>
|
||||
{:else if schema.type === 'string'}
|
||||
<Field {label} {description}>
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
|
||||
<div class="mt-4 flex flex-col gap-4">
|
||||
<div>
|
||||
<Field label={$t('custom_url')} description={$t('shared_link_custom_url_description')} invalid={slug.includes('/')}>
|
||||
<Input bind:value={slug} pattern="[^\/]*" autocomplete="off" />
|
||||
<Field label={$t('custom_url')} description={$t('shared_link_custom_url_description')}>
|
||||
<Input bind:value={slug} autocomplete="off" />
|
||||
</Field>
|
||||
{#if slug}
|
||||
<Text size="tiny" color="muted" class="pt-2 break-all">/s/{encodeURIComponent(slug)}</Text>
|
||||
|
||||
@@ -93,6 +93,9 @@ export type JSONSchemaProperty = {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
default?: any;
|
||||
enum?: string[];
|
||||
minimum?: number;
|
||||
maximum?: number;
|
||||
precision?: number;
|
||||
array?: boolean;
|
||||
properties?: Record<string, JSONSchemaProperty>;
|
||||
required?: string[];
|
||||
|
||||
Reference in New Issue
Block a user