@orthacms/media-admin 0.12.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/components/MediaAltDrill/index.d.ts +9 -0
- package/dist/lib/components/MediaAltDrill/index.d.ts.map +1 -0
- package/dist/lib/components/MediaAltDrill/index.js +60 -0
- package/dist/lib/components/MediaAltSignal/index.d.ts +8 -0
- package/dist/lib/components/MediaAltSignal/index.d.ts.map +1 -0
- package/dist/lib/components/MediaAltSignal/index.js +35 -0
- package/dist/lib/components/MediaStorageWidget/index.js +2 -2
- package/dist/lib/hooks/useMediaInsights/index.d.ts +8 -0
- package/dist/lib/hooks/useMediaInsights/index.d.ts.map +1 -1
- package/dist/lib/hooks/useMediaInsights/index.js +20 -1
- package/dist/lib/infrastructure/httpMediaInsightsGateway/index.d.ts.map +1 -1
- package/dist/lib/infrastructure/httpMediaInsightsGateway/index.js +9 -0
- package/dist/lib/infrastructure/mediaInsightsGateway/index.d.ts +17 -0
- package/dist/lib/infrastructure/mediaInsightsGateway/index.d.ts.map +1 -1
- package/dist/lib/utils/mediaPlugin/index.d.ts.map +1 -1
- package/dist/lib/utils/mediaPlugin/index.js +19 -12
- package/package.json +10 -10
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The images behind "Images missing alt text", the oldest upload first, with
|
|
3
|
+
* who uploaded each — and the way to the library, where alt text is written.
|
|
4
|
+
*
|
|
5
|
+
* The library has no "missing alt text" filter of its own to land on, so the
|
|
6
|
+
* button opens the library as it is rather than claiming a filtered view.
|
|
7
|
+
*/
|
|
8
|
+
export declare function MediaAltDrill(): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/MediaAltDrill/index.tsx"],"names":[],"mappings":"AAyCA;;;;;;GAMG;AACH,wBAAgB,aAAa,gCAiD5B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Link } from 'react-router-dom';
|
|
3
|
+
import { defineMessages, useIntl } from 'react-intl';
|
|
4
|
+
import { ArrowRight } from 'lucide-react';
|
|
5
|
+
import { Button } from '@orthacms/design-system';
|
|
6
|
+
import { DrillRecordRow, SignalDrill } from '@orthacms/insights-admin';
|
|
7
|
+
import { useMediaAltMissing } from '../../hooks/useMediaInsights';
|
|
8
|
+
/** Intl descriptors for the alt-text panel, co-located here. */
|
|
9
|
+
const messages = defineMessages({
|
|
10
|
+
title: {
|
|
11
|
+
id: 'media.insights.drill.alt.title',
|
|
12
|
+
defaultMessage: 'Images missing alt text'
|
|
13
|
+
},
|
|
14
|
+
description: {
|
|
15
|
+
id: 'media.insights.drill.alt.description',
|
|
16
|
+
defaultMessage: 'Images in the library with no alt text, the oldest upload first.'
|
|
17
|
+
},
|
|
18
|
+
heading: {
|
|
19
|
+
id: 'media.insights.drill.alt.heading',
|
|
20
|
+
defaultMessage: 'Images missing alt text · {count, number} {count, plural, one {image} other {images}}'
|
|
21
|
+
},
|
|
22
|
+
meta: {
|
|
23
|
+
id: 'media.insights.drill.alt.meta',
|
|
24
|
+
defaultMessage: 'Uploaded {date}'
|
|
25
|
+
},
|
|
26
|
+
uploadedBy: {
|
|
27
|
+
id: 'media.insights.drill.alt.uploadedBy',
|
|
28
|
+
defaultMessage: 'Uploaded by {name}'
|
|
29
|
+
},
|
|
30
|
+
open: {
|
|
31
|
+
id: 'media.insights.drill.alt.open',
|
|
32
|
+
defaultMessage: 'Open Media Library'
|
|
33
|
+
},
|
|
34
|
+
empty: {
|
|
35
|
+
id: 'media.insights.drill.alt.empty',
|
|
36
|
+
defaultMessage: 'Every image has alt text.'
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* The images behind "Images missing alt text", the oldest upload first, with
|
|
41
|
+
* who uploaded each — and the way to the library, where alt text is written.
|
|
42
|
+
*
|
|
43
|
+
* The library has no "missing alt text" filter of its own to land on, so the
|
|
44
|
+
* button opens the library as it is rather than claiming a filtered view.
|
|
45
|
+
*/
|
|
46
|
+
export function MediaAltDrill() {
|
|
47
|
+
const intl = useIntl();
|
|
48
|
+
const { data, isPending, isError } = useMediaAltMissing();
|
|
49
|
+
return (_jsx(SignalDrill, { title: intl.formatMessage(messages.title), count: data?.total, heading: data
|
|
50
|
+
? intl.formatMessage(messages.heading, {
|
|
51
|
+
count: data.total
|
|
52
|
+
})
|
|
53
|
+
: undefined, shown: data?.assets.length, description: intl.formatMessage(messages.description), isPending: isPending, isError: isError, isEmpty: !!data && data.total === 0, emptyMessage: intl.formatMessage(messages.empty), actions: _jsx(Button, { asChild: true, variant: "outline", size: "sm", children: _jsxs(Link, { to: "../media", children: [_jsx(ArrowRight, { "aria-hidden": "true" }), intl.formatMessage(messages.open)] }) }), children: data?.assets.map((asset) => (_jsx(DrillRecordRow, { title: asset.name, meta: intl.formatMessage(messages.meta, {
|
|
54
|
+
date: intl.formatDate(asset.createdAt, {
|
|
55
|
+
day: 'numeric',
|
|
56
|
+
month: 'short',
|
|
57
|
+
year: 'numeric'
|
|
58
|
+
})
|
|
59
|
+
}), personId: asset.uploadedBy, personLabel: (name) => intl.formatMessage(messages.uploadedBy, { name }) }, asset.id))) }));
|
|
60
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type InsightsSignalRowProps } from '@orthacms/insights-admin';
|
|
2
|
+
/**
|
|
3
|
+
* Images with no alt text — accessibility debt somebody can pick up, as a
|
|
4
|
+
* count, with the share of the library it is. The headline is the missing
|
|
5
|
+
* count rather than a coverage score: "23 images need alt text" is a job.
|
|
6
|
+
*/
|
|
7
|
+
export declare function MediaAltSignal({ onOpen, isOpen }: InsightsSignalRowProps): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/MediaAltSignal/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,sBAAsB,EAC9B,MAAM,0BAA0B,CAAC;AAmBlC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,sBAAsB,+BAyBxE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { defineMessages, useIntl } from 'react-intl';
|
|
3
|
+
import { Eye } from 'lucide-react';
|
|
4
|
+
import { SignalRow } from '@orthacms/insights-admin';
|
|
5
|
+
import { useMediaAltCoverage } from '../../hooks/useMediaInsights';
|
|
6
|
+
/** Intl descriptors for the alt-text line, co-located here. */
|
|
7
|
+
const messages = defineMessages({
|
|
8
|
+
title: {
|
|
9
|
+
id: 'media.insights.signal.alt.title',
|
|
10
|
+
defaultMessage: 'Images missing alt text'
|
|
11
|
+
},
|
|
12
|
+
hint: {
|
|
13
|
+
id: 'media.insights.signal.alt.hint',
|
|
14
|
+
defaultMessage: 'In Media Library · {percent}% of {images, number} images'
|
|
15
|
+
},
|
|
16
|
+
noImages: {
|
|
17
|
+
id: 'media.insights.signal.alt.noImages',
|
|
18
|
+
defaultMessage: 'No images in Media Library yet'
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Images with no alt text — accessibility debt somebody can pick up, as a
|
|
23
|
+
* count, with the share of the library it is. The headline is the missing
|
|
24
|
+
* count rather than a coverage score: "23 images need alt text" is a job.
|
|
25
|
+
*/
|
|
26
|
+
export function MediaAltSignal({ onOpen, isOpen }) {
|
|
27
|
+
const intl = useIntl();
|
|
28
|
+
const { data, isPending, isError } = useMediaAltCoverage();
|
|
29
|
+
const images = data?.images ?? 0;
|
|
30
|
+
const missing = data?.missing ?? 0;
|
|
31
|
+
const percent = images > 0 ? Math.round((missing / images) * 100) : 0;
|
|
32
|
+
return (_jsx(SignalRow, { icon: Eye, tone: "warn", count: missing, title: intl.formatMessage(messages.title), hint: images > 0
|
|
33
|
+
? intl.formatMessage(messages.hint, { percent, images })
|
|
34
|
+
: intl.formatMessage(messages.noImages), isPending: isPending, isError: isError, onOpen: onOpen, isOpen: isOpen }));
|
|
35
|
+
}
|
|
@@ -7,11 +7,11 @@ import { formatBytes } from '../../utils/formatBytes';
|
|
|
7
7
|
const messages = defineMessages({
|
|
8
8
|
title: {
|
|
9
9
|
id: 'media.insights.storageBreakdown.title',
|
|
10
|
-
defaultMessage:
|
|
10
|
+
defaultMessage: 'Storage'
|
|
11
11
|
},
|
|
12
12
|
description: {
|
|
13
13
|
id: 'media.insights.storageBreakdown.description',
|
|
14
|
-
defaultMessage: '{bytes}
|
|
14
|
+
defaultMessage: '{bytes} · {count, number} assets'
|
|
15
15
|
},
|
|
16
16
|
tip: {
|
|
17
17
|
id: 'media.insights.storageBreakdown.tip',
|
|
@@ -11,6 +11,7 @@ export declare const mediaInsightsKeys: {
|
|
|
11
11
|
storage: (workspaceId: string) => readonly ["media-insights", string, "storage"];
|
|
12
12
|
uploads: (workspaceId: string, days: number) => readonly ["media-insights", string, "uploads", number];
|
|
13
13
|
alt: (workspaceId: string) => readonly ["media-insights", string, "alt"];
|
|
14
|
+
altMissing: (workspaceId: string) => readonly ["media-insights", string, "alt-missing"];
|
|
14
15
|
};
|
|
15
16
|
/**
|
|
16
17
|
* Loads assets and bytes per media kind.
|
|
@@ -29,4 +30,11 @@ export declare function useMediaUploads(): import("@tanstack/react-query").UseQu
|
|
|
29
30
|
* whenever someone narrowed the range.
|
|
30
31
|
*/
|
|
31
32
|
export declare function useMediaAltCoverage(): import("@tanstack/react-query").UseQueryResult<NoInfer<import("../../infrastructure/mediaInsightsGateway").MediaAltCoverage>, Error>;
|
|
33
|
+
/** How many images the alt-text drill-down lists. */
|
|
34
|
+
export declare const ALT_DRILL_LIMIT = 20;
|
|
35
|
+
/**
|
|
36
|
+
* Loads the images missing alt text, oldest upload first — the drill-down
|
|
37
|
+
* behind the Needs-attention line. Mounted only while its panel is open.
|
|
38
|
+
*/
|
|
39
|
+
export declare function useMediaAltMissing(): import("@tanstack/react-query").UseQueryResult<NoInfer<import("../../infrastructure/mediaInsightsGateway").MediaAltMissing>, Error>;
|
|
32
40
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/hooks/useMediaInsights/index.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;uBACP,MAAM;2BACF,MAAM;2BAEN,MAAM,QAAQ,MAAM;uBAExB,MAAM;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/hooks/useMediaInsights/index.ts"],"names":[],"mappings":"AAUA;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB;uBACP,MAAM;2BACF,MAAM;2BAEN,MAAM,QAAQ,MAAM;uBAExB,MAAM;8BAEC,MAAM;CAEnC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,eAAe,qIAgB9B;AAED,uEAAuE;AACvE,wBAAgB,eAAe,qIAiB9B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,yIAgBlC;AAED,qDAAqD;AACrD,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC;;;GAGG;AACH,wBAAgB,kBAAkB,wIAYjC"}
|
|
@@ -18,7 +18,8 @@ export const mediaInsightsKeys = {
|
|
|
18
18
|
all: (workspaceId) => ['media-insights', workspaceId],
|
|
19
19
|
storage: (workspaceId) => ['media-insights', workspaceId, 'storage'],
|
|
20
20
|
uploads: (workspaceId, days) => ['media-insights', workspaceId, 'uploads', days],
|
|
21
|
-
alt: (workspaceId) => ['media-insights', workspaceId, 'alt']
|
|
21
|
+
alt: (workspaceId) => ['media-insights', workspaceId, 'alt'],
|
|
22
|
+
altMissing: (workspaceId) => ['media-insights', workspaceId, 'alt-missing']
|
|
22
23
|
};
|
|
23
24
|
/**
|
|
24
25
|
* Loads assets and bytes per media kind.
|
|
@@ -83,3 +84,21 @@ export function useMediaAltCoverage() {
|
|
|
83
84
|
enabled: canRead
|
|
84
85
|
});
|
|
85
86
|
}
|
|
87
|
+
/** How many images the alt-text drill-down lists. */
|
|
88
|
+
export const ALT_DRILL_LIMIT = 20;
|
|
89
|
+
/**
|
|
90
|
+
* Loads the images missing alt text, oldest upload first — the drill-down
|
|
91
|
+
* behind the Needs-attention line. Mounted only while its panel is open.
|
|
92
|
+
*/
|
|
93
|
+
export function useMediaAltMissing() {
|
|
94
|
+
const workspace = useCurrentWorkspace();
|
|
95
|
+
const canRead = useHasPermission(MEDIA_READ);
|
|
96
|
+
return useQuery({
|
|
97
|
+
queryKey: mediaInsightsKeys.altMissing(workspace.id),
|
|
98
|
+
queryFn: () => httpMediaInsightsGateway.altMissing(ALT_DRILL_LIMIT),
|
|
99
|
+
staleTime: STALE_TIME.Standard,
|
|
100
|
+
// One retry, as every Insights read (`[insights:I-16]`).
|
|
101
|
+
retry: 1,
|
|
102
|
+
enabled: canRead
|
|
103
|
+
});
|
|
104
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/httpMediaInsightsGateway/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/httpMediaInsightsGateway/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGR,oBAAoB,EAGvB,MAAM,yBAAyB,CAAC;AAEjC;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,oBA8CtC,CAAC"}
|
|
@@ -31,5 +31,14 @@ export const httpMediaInsightsGateway = {
|
|
|
31
31
|
catch (error) {
|
|
32
32
|
throw toApiError(error);
|
|
33
33
|
}
|
|
34
|
+
},
|
|
35
|
+
async altMissing(limit) {
|
|
36
|
+
try {
|
|
37
|
+
const { data } = await apiClient.get('/insights/media/alt/missing', { params: { limit } });
|
|
38
|
+
return data;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
throw toApiError(error);
|
|
42
|
+
}
|
|
34
43
|
}
|
|
35
44
|
};
|
|
@@ -35,6 +35,21 @@ export type MediaAltCoverage = {
|
|
|
35
35
|
* The port over the media Insights endpoints — one method per widget, mirroring
|
|
36
36
|
* one route per widget. {@link httpMediaInsightsGateway} is the implementation.
|
|
37
37
|
*/
|
|
38
|
+
/** One image with no alt text. */
|
|
39
|
+
export type MediaAltMissingAsset = {
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
folderId: string | null;
|
|
43
|
+
/** Who uploaded it — resolved against the workspace roster. */
|
|
44
|
+
uploadedBy: string;
|
|
45
|
+
/** ISO upload timestamp. */
|
|
46
|
+
createdAt: string;
|
|
47
|
+
};
|
|
48
|
+
/** The images behind the "missing alt text" figure, oldest upload first. */
|
|
49
|
+
export type MediaAltMissing = {
|
|
50
|
+
total: number;
|
|
51
|
+
assets: MediaAltMissingAsset[];
|
|
52
|
+
};
|
|
38
53
|
export type MediaInsightsGateway = {
|
|
39
54
|
/** `GET /insights/media/storage` — assets and bytes per kind. */
|
|
40
55
|
storage(): Promise<MediaStorage>;
|
|
@@ -42,5 +57,7 @@ export type MediaInsightsGateway = {
|
|
|
42
57
|
uploads(days: number): Promise<MediaUploads>;
|
|
43
58
|
/** `GET /insights/media/alt` — alt-text coverage across images. */
|
|
44
59
|
altCoverage(): Promise<MediaAltCoverage>;
|
|
60
|
+
/** `GET /insights/media/alt/missing` — the images, oldest upload first. */
|
|
61
|
+
altMissing(limit: number): Promise<MediaAltMissing>;
|
|
45
62
|
};
|
|
46
63
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/mediaInsightsGateway/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG;IACzB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,YAAY,GAAG;IACvB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,YAAY,GAAG;IACvB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,iEAAiE;IACjE,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IACjC,+DAA+D;IAC/D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,mEAAmE;IACnE,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/infrastructure/mediaInsightsGateway/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sCAAsC;AACtC,MAAM,MAAM,cAAc,GAAG;IACzB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,YAAY,GAAG;IACvB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,uCAAuC;AACvC,MAAM,MAAM,YAAY,GAAG;IACvB,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,WAAW,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,kCAAkC;AAClC,MAAM,MAAM,oBAAoB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,iEAAiE;IACjE,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IACjC,+DAA+D;IAC/D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,mEAAmE;IACnE,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,2EAA2E;IAC3E,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACvD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/mediaPlugin/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/mediaPlugin/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AA2C7D;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,gBAAgB,CAuJ9C"}
|
|
@@ -4,12 +4,13 @@ import { lazyPage } from '@orthacms/utils-admin';
|
|
|
4
4
|
import { WORKSPACE_ROUTE_SLOT, WORKSPACE_NAV_SLOT } from '@orthacms/workspaces-admin';
|
|
5
5
|
import { CONTENT_FIELD_TYPE, ENTRY_FIELD_CONTROL_SLOT, ENTRY_PRESAVE_SLOT } from '@orthacms/content-admin';
|
|
6
6
|
import { WYSIWYG_MEDIA_SLOT } from '@orthacms/wysiwyg-admin';
|
|
7
|
-
import { INSIGHTS_SECTION_IDS, INSIGHTS_WIDGET_SLOT } from '@orthacms/insights-admin';
|
|
7
|
+
import { INSIGHTS_SECTION_IDS, INSIGHTS_SIGNAL_SLOT, INSIGHTS_WIDGET_SLOT } from '@orthacms/insights-admin';
|
|
8
8
|
import { Image, Upload } from 'lucide-react';
|
|
9
9
|
import { MediaStorageStat } from '../../components/MediaStorageStat';
|
|
10
10
|
import { MediaStorageWidget } from '../../components/MediaStorageWidget';
|
|
11
11
|
import { MediaUploadsWidget } from '../../components/MediaUploadsWidget';
|
|
12
|
-
import {
|
|
12
|
+
import { MediaAltSignal } from '../../components/MediaAltSignal';
|
|
13
|
+
import { MediaAltDrill } from '../../components/MediaAltDrill';
|
|
13
14
|
import { MediaFieldInput } from '../../components/MediaFieldInput';
|
|
14
15
|
import { MediaLibraryPageSkeleton } from '../../components/MediaLibrarySkeleton';
|
|
15
16
|
import { WysiwygLibrarySource } from '../../components/WysiwygLibrarySource';
|
|
@@ -52,31 +53,37 @@ export function MediaPlugin() {
|
|
|
52
53
|
id: 'insights.media.storageBreakdown',
|
|
53
54
|
section: INSIGHTS_SECTION_IDS.Reach,
|
|
54
55
|
order: 10,
|
|
55
|
-
size: '
|
|
56
|
+
size: 'md',
|
|
56
57
|
permission: MEDIA_READ,
|
|
57
58
|
titleId: 'media.insights.storageBreakdown.title',
|
|
58
|
-
defaultTitle:
|
|
59
|
+
defaultTitle: 'Storage',
|
|
59
60
|
Component: MediaStorageWidget
|
|
60
61
|
},
|
|
61
62
|
{
|
|
62
63
|
id: 'insights.media.uploads',
|
|
63
64
|
section: INSIGHTS_SECTION_IDS.Reach,
|
|
64
65
|
order: 20,
|
|
65
|
-
size: '
|
|
66
|
+
size: 'md',
|
|
66
67
|
permission: MEDIA_READ,
|
|
67
68
|
titleId: 'media.insights.uploads.title',
|
|
68
69
|
defaultTitle: 'Uploads',
|
|
69
70
|
Component: MediaUploadsWidget
|
|
70
|
-
}
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
// The alt-text debt is a Needs-attention line now, opening the
|
|
76
|
+
// images behind it, rather than a card of its own.
|
|
77
|
+
slot: INSIGHTS_SIGNAL_SLOT,
|
|
78
|
+
items: [
|
|
71
79
|
{
|
|
72
|
-
id: '
|
|
73
|
-
|
|
74
|
-
order: 30,
|
|
75
|
-
size: 'sm',
|
|
80
|
+
id: 'media.alt',
|
|
81
|
+
order: 40,
|
|
76
82
|
permission: MEDIA_READ,
|
|
77
|
-
titleId: 'media.insights.alt.title',
|
|
83
|
+
titleId: 'media.insights.signal.alt.title',
|
|
78
84
|
defaultTitle: 'Images missing alt text',
|
|
79
|
-
Component:
|
|
85
|
+
Component: MediaAltSignal,
|
|
86
|
+
Drill: MediaAltDrill
|
|
80
87
|
}
|
|
81
88
|
]
|
|
82
89
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orthacms/media-admin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.1",
|
|
4
4
|
"description": "@orthacms/media-admin — part of Ortha CMS.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://orthacms.com",
|
|
@@ -25,15 +25,15 @@
|
|
|
25
25
|
"dist"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@orthacms/bootstrap-admin": "^0.
|
|
29
|
-
"@orthacms/content-admin": "^0.
|
|
30
|
-
"@orthacms/content-domain": "^0.
|
|
31
|
-
"@orthacms/design-system": "^0.
|
|
32
|
-
"@orthacms/identity-admin": "^0.
|
|
33
|
-
"@orthacms/insights-admin": "^0.
|
|
34
|
-
"@orthacms/utils-admin": "^0.
|
|
35
|
-
"@orthacms/workspaces-admin": "^0.
|
|
36
|
-
"@orthacms/wysiwyg-admin": "^0.
|
|
28
|
+
"@orthacms/bootstrap-admin": "^0.13.1",
|
|
29
|
+
"@orthacms/content-admin": "^0.13.1",
|
|
30
|
+
"@orthacms/content-domain": "^0.13.1",
|
|
31
|
+
"@orthacms/design-system": "^0.13.1",
|
|
32
|
+
"@orthacms/identity-admin": "^0.13.1",
|
|
33
|
+
"@orthacms/insights-admin": "^0.13.1",
|
|
34
|
+
"@orthacms/utils-admin": "^0.13.1",
|
|
35
|
+
"@orthacms/workspaces-admin": "^0.13.1",
|
|
36
|
+
"@orthacms/wysiwyg-admin": "^0.13.1",
|
|
37
37
|
"@tanstack/react-query": "^5.0.0",
|
|
38
38
|
"lucide-react": "^1.17.0",
|
|
39
39
|
"react-intl": "^7.0.0",
|