@ablogcms/media 3.2.28-beta.0

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.
Files changed (69) hide show
  1. package/README.md +28 -0
  2. package/dist/acms.d.ts +10 -0
  3. package/dist/acms.mjs +1 -0
  4. package/dist/acms.mjs.map +1 -0
  5. package/dist/chunk-32U7ADG2.mjs +456 -0
  6. package/dist/chunk-32U7ADG2.mjs.map +1 -0
  7. package/dist/chunk-3SYVRD3N.mjs +37 -0
  8. package/dist/chunk-3SYVRD3N.mjs.map +1 -0
  9. package/dist/chunk-5P6HFS6L.mjs +90 -0
  10. package/dist/chunk-5P6HFS6L.mjs.map +1 -0
  11. package/dist/chunk-J5LGTIGS.mjs +10 -0
  12. package/dist/chunk-J5LGTIGS.mjs.map +1 -0
  13. package/dist/chunk-JJTHI4QP.mjs +1783 -0
  14. package/dist/chunk-JJTHI4QP.mjs.map +1 -0
  15. package/dist/chunk-KQNVYJOK.mjs +1814 -0
  16. package/dist/chunk-KQNVYJOK.mjs.map +1 -0
  17. package/dist/chunk-LAZAMWG6.mjs +231 -0
  18. package/dist/chunk-LAZAMWG6.mjs.map +1 -0
  19. package/dist/components/media-admin/media-admin-view.d.ts +22 -0
  20. package/dist/components/media-admin/media-admin.d.ts +6 -0
  21. package/dist/components/media-admin/media-admin.mjs +148 -0
  22. package/dist/components/media-admin/media-admin.mjs.map +1 -0
  23. package/dist/components/media-droparea/media-droparea.d.ts +63 -0
  24. package/dist/components/media-droparea/media-droparea.mjs +152 -0
  25. package/dist/components/media-droparea/media-droparea.mjs.map +1 -0
  26. package/dist/components/media-edit-modal/media-edit-modal.d.ts +58 -0
  27. package/dist/components/media-insert/media-insert-modal.d.ts +30 -0
  28. package/dist/components/media-insert/media-insert.d.ts +5 -0
  29. package/dist/components/media-insert/media-insert.mjs +11 -0
  30. package/dist/components/media-insert/media-insert.mjs.map +1 -0
  31. package/dist/components/media-list/media-list.d.ts +125 -0
  32. package/dist/components/media-modal/media-modal.d.ts +94 -0
  33. package/dist/components/media-modal/pdf-previewer.d.ts +8 -0
  34. package/dist/components/media-unit/media-unit.d.ts +65 -0
  35. package/dist/components/media-unit/media-unit.mjs +13 -0
  36. package/dist/components/media-unit/media-unit.mjs.map +1 -0
  37. package/dist/components/media-update/media-update-modal.d.ts +12 -0
  38. package/dist/components/media-update/media-update.d.ts +5 -0
  39. package/dist/components/media-update/media-update.mjs +10 -0
  40. package/dist/components/media-update/media-update.mjs.map +1 -0
  41. package/dist/components/media-uploader/media-uploader.d.ts +69 -0
  42. package/dist/constants/index.d.ts +19 -0
  43. package/dist/containers/media-admin.d.ts +10 -0
  44. package/dist/containers/media-insert.d.ts +17 -0
  45. package/dist/containers/media-update.d.ts +13 -0
  46. package/dist/dataview/column-type.d.ts +10 -0
  47. package/dist/dataview/column-type.mjs +75 -0
  48. package/dist/dataview/column-type.mjs.map +1 -0
  49. package/dist/events.d.ts +70 -0
  50. package/dist/media-crop-focal-OQHAYXEP.svg +1 -0
  51. package/dist/media-crop-icon-LD2QEJHL.svg +12 -0
  52. package/dist/media-focal-point-OQQ3MQM2.svg +3 -0
  53. package/dist/media-rotate-icon-HBMXAPD4.svg +7 -0
  54. package/dist/runtime.d.ts +20 -0
  55. package/dist/runtime.mjs +16 -0
  56. package/dist/runtime.mjs.map +1 -0
  57. package/dist/setup-media-unit.d.ts +2 -0
  58. package/dist/setup-media-unit.mjs +118 -0
  59. package/dist/setup-media-unit.mjs.map +1 -0
  60. package/dist/stores/actions.d.ts +64 -0
  61. package/dist/stores/reducer.d.ts +5 -0
  62. package/dist/stores/saga.d.ts +35 -0
  63. package/dist/types/config.d.ts +29 -0
  64. package/dist/types/index.d.ts +83 -0
  65. package/dist/types/index.mjs +1 -0
  66. package/dist/types/index.mjs.map +1 -0
  67. package/dist/types/transport.d.ts +76 -0
  68. package/dist/utils/index.d.ts +5 -0
  69. package/package.json +112 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ import MediaUnit from './components/media-unit/media-unit.js';
2
+ export default function setupMediaUnit(context: HTMLElement, options?: Partial<React.ComponentPropsWithoutRef<typeof MediaUnit>>): () => void;
@@ -0,0 +1,118 @@
1
+ import {
2
+ MediaUnit
3
+ } from "./chunk-32U7ADG2.mjs";
4
+ import "./chunk-5P6HFS6L.mjs";
5
+ import "./chunk-LAZAMWG6.mjs";
6
+ import "./chunk-KQNVYJOK.mjs";
7
+ import "./chunk-JJTHI4QP.mjs";
8
+ import "./chunk-3SYVRD3N.mjs";
9
+ import "./chunk-J5LGTIGS.mjs";
10
+
11
+ // src/setup-media-unit.tsx
12
+ import { emit } from "@ablogcms/events";
13
+ import { render } from "@ablogcms/utils/react";
14
+ import { triggerEvent } from "@ablogcms/utils";
15
+ import { jsx } from "react/jsx-runtime";
16
+ function setupMediaUnit(context, options = {}) {
17
+ const elements = context.querySelectorAll(".js-media-unit");
18
+ if (elements.length === 0) {
19
+ return () => {
20
+ };
21
+ }
22
+ const roots = [];
23
+ elements.forEach((element) => {
24
+ element.classList.add("done");
25
+ const {
26
+ id = "",
27
+ primaryImageId = "",
28
+ mediaSizes,
29
+ multiUpload,
30
+ mediaDir = "",
31
+ active = ACMS.Config.mediaLibrary,
32
+ enlarged,
33
+ primary,
34
+ thumbnail,
35
+ type,
36
+ pdf,
37
+ pdfIcon,
38
+ caption,
39
+ text,
40
+ alt,
41
+ mid,
42
+ link,
43
+ landscape,
44
+ lang,
45
+ name,
46
+ nolink,
47
+ overrideLink = "",
48
+ overrideAlt = "",
49
+ overrideCaption = ""
50
+ } = element.dataset;
51
+ const items = [];
52
+ if (mid) {
53
+ const thumbnailPath = type === "file" ? thumbnail : `${mediaDir}${thumbnail}`;
54
+ const item = {
55
+ media_caption: caption,
56
+ media_text: text,
57
+ media_alt: alt,
58
+ media_id: Number(mid),
59
+ media_link: link,
60
+ media_landscape: landscape,
61
+ media_thumbnail: thumbnailPath,
62
+ media_type: type,
63
+ media_pdf: pdf,
64
+ media_title: name
65
+ };
66
+ items.push(item);
67
+ }
68
+ let mediaSizesFiltered = [];
69
+ if (mediaSizes) {
70
+ mediaSizesFiltered = JSON.parse(mediaSizes).filter((obj) => {
71
+ if (Object.keys(obj).length === 0) {
72
+ return false;
73
+ }
74
+ return true;
75
+ });
76
+ }
77
+ const root = render(
78
+ /* @__PURE__ */ jsx(
79
+ MediaUnit,
80
+ {
81
+ items,
82
+ id,
83
+ primaryImageId,
84
+ mediaSizes: mediaSizesFiltered,
85
+ active,
86
+ lang,
87
+ primary,
88
+ multiUpload: multiUpload === "false" ? "false" : "true",
89
+ usePdfIcon: pdfIcon,
90
+ enlarged,
91
+ hasLink: nolink,
92
+ overrideLink,
93
+ overrideAlt,
94
+ overrideCaption,
95
+ ...options,
96
+ onChange: (mediaItems) => {
97
+ if (options.onChange) {
98
+ options.onChange(mediaItems);
99
+ }
100
+ void emit("media-unit.change", { target: element, mediaItems });
101
+ triggerEvent(element, "acms.media-unit.change", { bubbles: true, detail: { mediaItems } });
102
+ }
103
+ }
104
+ ),
105
+ element
106
+ );
107
+ roots.push(root);
108
+ });
109
+ return () => {
110
+ roots.forEach((root) => {
111
+ root.unmount();
112
+ });
113
+ };
114
+ }
115
+ export {
116
+ setupMediaUnit as default
117
+ };
118
+ //# sourceMappingURL=setup-media-unit.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/setup-media-unit.tsx"],"sourcesContent":["import { emit } from '@ablogcms/events';\nimport { render } from '@ablogcms/utils/react';\nimport { triggerEvent } from '@ablogcms/utils';\nimport { MediaItem } from './types';\nimport MediaUnit from './components/media-unit/media-unit';\n\nexport default function setupMediaUnit(\n context: HTMLElement,\n options: Partial<React.ComponentPropsWithoutRef<typeof MediaUnit>> = {}\n) {\n const elements = context.querySelectorAll<HTMLElement>('.js-media-unit');\n if (elements.length === 0) {\n return () => {};\n }\n const roots: ReturnType<typeof render>[] = [];\n elements.forEach((element) => {\n element.classList.add('done');\n const {\n id = '',\n primaryImageId = '',\n mediaSizes,\n multiUpload,\n mediaDir = '',\n active = ACMS.Config.mediaLibrary,\n enlarged,\n primary,\n thumbnail,\n type,\n pdf,\n pdfIcon,\n caption,\n text,\n alt,\n mid,\n link,\n landscape,\n lang,\n name,\n nolink,\n overrideLink = '',\n overrideAlt = '',\n overrideCaption = '',\n } = element.dataset;\n const items: MediaItem[] = [];\n if (mid) {\n const thumbnailPath = type === 'file' ? thumbnail : `${mediaDir}${thumbnail}`;\n const item = {\n media_caption: caption,\n media_text: text,\n media_alt: alt,\n media_id: Number(mid),\n media_link: link,\n media_landscape: landscape,\n media_thumbnail: thumbnailPath,\n media_type: type,\n media_pdf: pdf,\n media_title: name,\n } as MediaItem;\n items.push(item);\n }\n let mediaSizesFiltered = [];\n if (mediaSizes) {\n mediaSizesFiltered = JSON.parse(mediaSizes).filter((obj: object) => {\n if (Object.keys(obj).length === 0) {\n return false;\n }\n return true;\n });\n }\n const root = render(\n <MediaUnit\n items={items}\n id={id}\n primaryImageId={primaryImageId}\n mediaSizes={mediaSizesFiltered}\n active={active as 'on' | 'off'}\n lang={lang}\n primary={primary as 'true' | 'false'}\n multiUpload={multiUpload === 'false' ? 'false' : 'true'}\n usePdfIcon={pdfIcon as 'yes' | 'no'}\n enlarged={enlarged as 'true' | 'false'}\n hasLink={nolink as 'true' | 'false'}\n overrideLink={overrideLink}\n overrideAlt={overrideAlt}\n overrideCaption={overrideCaption}\n {...options}\n onChange={(mediaItems) => {\n if (options.onChange) {\n options.onChange(mediaItems);\n }\n void emit('media-unit.change', { target: element, mediaItems });\n triggerEvent(element, 'acms.media-unit.change', { bubbles: true, detail: { mediaItems } });\n }}\n />,\n element\n );\n roots.push(root);\n });\n\n return () => {\n roots.forEach((root) => {\n root.unmount();\n });\n };\n}\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,oBAAoB;AAoEvB;AAhES,SAAR,eACL,SACA,UAAqE,CAAC,GACtE;AACA,QAAM,WAAW,QAAQ,iBAA8B,gBAAgB;AACvE,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACA,QAAM,QAAqC,CAAC;AAC5C,WAAS,QAAQ,CAAC,YAAY;AAC5B,YAAQ,UAAU,IAAI,MAAM;AAC5B,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,iBAAiB;AAAA,MACjB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,SAAS,KAAK,OAAO;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB;AAAA,IACpB,IAAI,QAAQ;AACZ,UAAM,QAAqB,CAAC;AAC5B,QAAI,KAAK;AACP,YAAM,gBAAgB,SAAS,SAAS,YAAY,GAAG,QAAQ,GAAG,SAAS;AAC3E,YAAM,OAAO;AAAA,QACX,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU,OAAO,GAAG;AAAA,QACpB,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,aAAa;AAAA,MACf;AACA,YAAM,KAAK,IAAI;AAAA,IACjB;AACA,QAAI,qBAAqB,CAAC;AAC1B,QAAI,YAAY;AACd,2BAAqB,KAAK,MAAM,UAAU,EAAE,OAAO,CAAC,QAAgB;AAClE,YAAI,OAAO,KAAK,GAAG,EAAE,WAAW,GAAG;AACjC,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AACA,UAAM,OAAO;AAAA,MACX;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa,gBAAgB,UAAU,UAAU;AAAA,UACjD,YAAY;AAAA,UACZ;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACC,GAAG;AAAA,UACJ,UAAU,CAAC,eAAe;AACxB,gBAAI,QAAQ,UAAU;AACpB,sBAAQ,SAAS,UAAU;AAAA,YAC7B;AACA,iBAAK,KAAK,qBAAqB,EAAE,QAAQ,SAAS,WAAW,CAAC;AAC9D,yBAAa,SAAS,0BAA0B,EAAE,SAAS,MAAM,QAAQ,EAAE,WAAW,EAAE,CAAC;AAAA,UAC3F;AAAA;AAAA,MACF;AAAA,MACA;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB,CAAC;AAED,SAAO,MAAM;AACX,UAAM,QAAQ,CAAC,SAAS;AACtB,WAAK,QAAQ;AAAA,IACf,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -0,0 +1,64 @@
1
+ import { MediaAjaxConfig, MediaItem } from '../types/index.js';
2
+ export declare const fetchTagList: () => {
3
+ type: "FETCHTAGLIST";
4
+ };
5
+ export declare const fetchMediaList: (config?: MediaAjaxConfig) => {
6
+ type: "FETCHMEDIALIST";
7
+ config: MediaAjaxConfig | undefined;
8
+ };
9
+ export declare const setMediaList: (items: MediaItem[]) => {
10
+ type: "SETMEDIALIST";
11
+ items: MediaItem[];
12
+ };
13
+ export declare const setMediaConfig: (config: Partial<MediaAjaxConfig>) => {
14
+ type: "SETMEDIACONFIG";
15
+ config: Partial<MediaAjaxConfig>;
16
+ };
17
+ export declare const setMediaLastPage: (page: number) => {
18
+ type: "SETMEDIALASTPAGE";
19
+ page: number;
20
+ };
21
+ export declare const setMediaLargeSize: (largeSize: number) => {
22
+ type: "SETMEDIALARGESIZE";
23
+ largeSize: number;
24
+ };
25
+ export declare const setFormToken: (formToken: string) => {
26
+ type: "SETFORMTOKEN";
27
+ formToken: string;
28
+ };
29
+ export declare const setItem: (item: MediaItem | null) => {
30
+ type: "SETITEM";
31
+ item: MediaItem | null;
32
+ };
33
+ export declare const updateMediaList: (item: MediaItem) => {
34
+ type: "UPDATEMEDIALIST";
35
+ item: MediaItem;
36
+ };
37
+ export declare const setLabel: (label: string) => {
38
+ type: "SETLABEL";
39
+ label: string;
40
+ };
41
+ export declare const setMediaArchives: (archives: string[]) => {
42
+ type: "SETMEDIAARCHIVES";
43
+ archives: string[];
44
+ };
45
+ export declare const setMediaTags: (tags: string[]) => {
46
+ type: "SETMEDIATAGS";
47
+ tags: string[];
48
+ };
49
+ export declare const setMediaTotal: (total: number) => {
50
+ type: "SETMEDIATOTAL";
51
+ total: number;
52
+ };
53
+ export declare const setLoading: (loading: boolean) => {
54
+ type: "SETLOADING";
55
+ loading: boolean;
56
+ };
57
+ export declare const setSelectedTags: (tags: string[]) => {
58
+ type: "SETSELECTEDTAGS";
59
+ tags: string[];
60
+ };
61
+ export declare const setMediaExtensions: (extensions: string[]) => {
62
+ type: "SETMEDIAEXTENSIONS";
63
+ extensions: string[];
64
+ };
@@ -0,0 +1,5 @@
1
+ import * as actions from './actions.js';
2
+ import { MediaStateProps } from '../types/index.js';
3
+ type Action = ReturnType<(typeof actions)[keyof typeof actions]>;
4
+ declare const _default: (state: MediaStateProps | undefined, action: Action) => MediaStateProps;
5
+ export default _default;
@@ -0,0 +1,35 @@
1
+ import { fetchMediaList as fetchMediaListAction } from './actions.js';
2
+ import { MediaListApiResponse, MediaStateProps } from '../types/index.js';
3
+ export declare function fetchTagList(): Generator<import("redux-saga/effects").CallEffect<string[]> | import("redux-saga/effects").PutEffect<{
4
+ type: "SETMEDIATAGS";
5
+ tags: string[];
6
+ }>, void, string[]>;
7
+ export declare function fetchMediaList({ config }: ReturnType<typeof fetchMediaListAction>): Generator<import("redux-saga/effects").PutEffect<{
8
+ type: "SETMEDIATAGS";
9
+ tags: string[];
10
+ }> | import("redux-saga/effects").SelectEffect | import("redux-saga/effects").PutEffect<{
11
+ type: "SETLOADING";
12
+ loading: boolean;
13
+ }> | import("redux-saga/effects").CallEffect<MediaListApiResponse> | import("redux-saga/effects").PutEffect<{
14
+ type: "SETMEDIALIST";
15
+ items: import("../types/index.js").MediaItem[];
16
+ }> | import("redux-saga/effects").PutEffect<{
17
+ type: "SETMEDIALASTPAGE";
18
+ page: number;
19
+ }> | import("redux-saga/effects").PutEffect<{
20
+ type: "SETMEDIATOTAL";
21
+ total: number;
22
+ }> | import("redux-saga/effects").PutEffect<{
23
+ type: "SETMEDIALARGESIZE";
24
+ largeSize: number;
25
+ }> | import("redux-saga/effects").PutEffect<{
26
+ type: "SETMEDIAARCHIVES";
27
+ archives: string[];
28
+ }> | import("redux-saga/effects").PutEffect<{
29
+ type: "SETMEDIAEXTENSIONS";
30
+ extensions: string[];
31
+ }> | import("redux-saga/effects").PutEffect<{
32
+ type: "SETMEDIACONFIG";
33
+ config: Partial<import("../types/index.js").MediaAjaxConfig>;
34
+ }>, void, MediaStateProps & MediaListApiResponse>;
35
+ export default function rootSaga(): Generator<import("redux-saga/effects").ForkEffect<never>, void, unknown>;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `@ablogcms/media` が参照する CMS 環境設定値の契約(`ACMS.Config.*` 相当)。
3
+ *
4
+ * 型としては注入可能にしているが、現時点では一部の参照箇所(`ACMS.Config` を呼び出しの都度
5
+ * 再読込することに依存する箇所など)は意図的に直接参照のフォールバックを残している。
6
+ * 詳細は `packages/frontend/media/README.md`「ACMS 実行契約」を参照。
7
+ */
8
+ export interface MediaConfig {
9
+ /** 現在のブログID(一覧・タグ URL 組み立てに使用) */
10
+ bid?: string;
11
+ /** サイト軸のブログID(media-list の blogAxis フィルタ表示判定に使用) */
12
+ sbid?: string;
13
+ /** サイトルート(アイコン画像パス等の組み立てに使用) */
14
+ root?: string;
15
+ /** 大容量画像のリサイズ設定(`{type}:{px}` 形式) */
16
+ lgImg?: string;
17
+ /** クライアント側リサイズの有効・無効 */
18
+ mediaClientResize?: 'on' | 'off';
19
+ /** 一度にアップロードできる件数の上限 */
20
+ mediaUploadLimit?: number | string;
21
+ /** アップロードの同時実行数 */
22
+ mediaUploadConcurrency?: number | string;
23
+ /** メディア一覧・モーダルで alt / caption 欄を表示するか */
24
+ mediaShowAltAndCaptionOnModal?: boolean;
25
+ /** メディアライブラリ機能の有効・無効 */
26
+ mediaLibrary?: 'on' | 'off';
27
+ /** トリミングの切り抜きサイズ選択肢 */
28
+ mediaCropSizes?: [number, number][];
29
+ }
@@ -0,0 +1,83 @@
1
+ import * as actions from '../stores/actions.js';
2
+ export type { MediaTransport, MediaListApiResponse, MediaDetailApiResponse, MediaFailureApiResponse, MediaSubmitApiResponse, MediaUploadOptions, MediaUploadProgressEvent, } from './transport.js';
3
+ export type { MediaConfig } from './config.js';
4
+ export type MediaType = 'image' | 'file' | 'svg';
5
+ export type MediaViewFileType = 'all' | 'image' | 'file';
6
+ export type MediaItem = {
7
+ media_status: string;
8
+ media_pdf_page: string;
9
+ media_title: string;
10
+ media_thumbnail: string;
11
+ media_label: string;
12
+ media_last_modified: string;
13
+ media_datetime: string;
14
+ media_id: number;
15
+ media_bid: string;
16
+ media_blog_name: string;
17
+ media_user_id: string;
18
+ media_user_name: string;
19
+ media_last_update_user_id: string;
20
+ media_last_update_user_name: string;
21
+ media_size: string;
22
+ media_filesize: number;
23
+ media_path: string;
24
+ media_root_path: string;
25
+ media_pdf: string;
26
+ media_original: string;
27
+ media_edited: string;
28
+ media_permalink: string;
29
+ media_type: MediaType;
30
+ media_ext: string;
31
+ media_caption: string;
32
+ media_link: string;
33
+ media_alt: string;
34
+ media_text: string;
35
+ media_focal_point: string;
36
+ media_landscape?: 'horizontal' | 'vertical';
37
+ media_editable: boolean;
38
+ media_icon: string;
39
+ media_icon_width?: string;
40
+ media_icon_height?: string;
41
+ checked: boolean;
42
+ width?: number;
43
+ height?: number;
44
+ };
45
+ export interface MediaAjaxConfig {
46
+ page?: number;
47
+ tag?: string;
48
+ keyword?: string;
49
+ order?: string;
50
+ limit?: number;
51
+ date?: string;
52
+ filetype?: MediaViewFileType;
53
+ fileext?: string;
54
+ year?: string;
55
+ month?: string;
56
+ owner?: boolean;
57
+ blogAxis?: boolean;
58
+ }
59
+ export interface MediaStateProps {
60
+ items: MediaItem[];
61
+ tags: string[];
62
+ extensions: string[];
63
+ actions: typeof actions;
64
+ item: MediaItem | null;
65
+ largeSize: number;
66
+ formToken: string;
67
+ archives: string[];
68
+ label: string;
69
+ lastPage: number;
70
+ total: number;
71
+ config: Required<MediaAjaxConfig>;
72
+ selectedTags: string[];
73
+ loading: boolean;
74
+ }
75
+ export interface MediaTag {
76
+ value: string;
77
+ label: string;
78
+ }
79
+ export type FocalPoint = [number, number];
80
+ export interface FocalPointCoordinates {
81
+ x: number;
82
+ y: number;
83
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,76 @@
1
+ import type { FetchResponse } from '@ablogcms/fetch-client';
2
+ import type { MediaAjaxConfig, MediaItem } from './index.js';
3
+ /**
4
+ * `stores/saga.ts` の FETCHMEDIALIST に対応するレスポンス(ajax/edit/media.json)。
5
+ */
6
+ export interface MediaListApiResponse {
7
+ items: MediaItem[];
8
+ pageAmount: number;
9
+ total: number;
10
+ largeSize: number;
11
+ archives: string[];
12
+ tags: string[];
13
+ extensions: string[];
14
+ }
15
+ /**
16
+ * ajax/edit/media-edit.json の単体取得レスポンス(media-list の setItem / media-update-modal に対応)。
17
+ */
18
+ export interface MediaDetailApiResponse {
19
+ status: string;
20
+ item?: MediaItem;
21
+ message?: string;
22
+ }
23
+ /**
24
+ * ACMS_POST_Media_* 系ハンドラの失敗レスポンス(JSON body 直下に status: 'failure' を持つ)。
25
+ */
26
+ export interface MediaFailureApiResponse {
27
+ status: 'failure';
28
+ message?: string;
29
+ }
30
+ /** update / uploadAsNew / upload の成功時は MediaItem がそのまま返る(envelope なし) */
31
+ export type MediaSubmitApiResponse = MediaItem | MediaFailureApiResponse;
32
+ export interface MediaUploadProgressEvent {
33
+ loaded: number;
34
+ total: number;
35
+ }
36
+ export interface MediaUploadOptions {
37
+ onUploadProgress?: (event: MediaUploadProgressEvent) => void;
38
+ }
39
+ /**
40
+ * `@ablogcms/media` が必要とするデータ取得・送信の契約。
41
+ *
42
+ * このパッケージ自体は CMS バックエンドの知識(URL・クエリ・認証ヘッダ等)を持たず、
43
+ * 呼び出し側(a-blog cms コア側の `createAcmsMediaTransport()` 等)が実装した
44
+ * MediaTransport を実行時に注入して使う(WordPress Gutenberg の `mediaUpload` 注入と同型)。
45
+ *
46
+ * 各メソッドは実装移設前の呼び出し箇所と URL・クエリ・HTTP メソッド・ボディが一致するように
47
+ * 実装すること(`packages/frontend/media/README.md` 参照)。
48
+ */
49
+ export interface MediaTransport {
50
+ /** ajax/edit/media.json 一覧取得。stores/saga.ts の FETCHMEDIALIST に対応 */
51
+ fetchMediaList(query: Required<MediaAjaxConfig>): Promise<MediaListApiResponse>;
52
+ /** ajax/edit/media-tag.json(cache パラメータなし)。stores/saga.ts の FETCHTAGLIST に対応 */
53
+ fetchTagList(): Promise<string[]>;
54
+ /**
55
+ * ajax/edit/media-tag.json(cache パラメータあり)。
56
+ * `tags` 省略時は media-update-modal 相当(tags クエリなし)、
57
+ * 配列指定時(空配列含む)は media-list の絞り込み相当(tags クエリを常に送る)。
58
+ */
59
+ fetchMediaTags(tags?: string[]): Promise<string[]>;
60
+ /** ajax/edit/media-edit.json?_mid=。media-update-modal / media-list の単体取得に対応 */
61
+ fetchMediaDetail(mediaId: number): Promise<MediaDetailApiResponse>;
62
+ /** ACMS_POST_Media_Update。media-modal の update() に対応 */
63
+ updateMedia(mediaId: number, formData: FormData): Promise<MediaSubmitApiResponse>;
64
+ /** ACMS_POST_Media_UpdateAsNew。media-modal の uploadAsNew() に対応 */
65
+ updateMediaAsNew(mediaId: number, formData: FormData): Promise<MediaSubmitApiResponse>;
66
+ /** ACMS_POST_Media_Index_Delete。media-list の removeImgs() に対応 */
67
+ deleteMedia(formData: FormData): Promise<unknown>;
68
+ /** ACMS_POST_Media_Index_Tags。media-list の addLabelToItems() に対応 */
69
+ addTagsToMedia(formData: FormData): Promise<unknown>;
70
+ /**
71
+ * ACMS_POST_Media_Upload。media-uploader の upload() に対応。
72
+ * 既存の `xhrUpload` と同じ envelope(`FetchResponse<T>`)をそのまま返す
73
+ * (呼び出し側の `res && res.data` の存在チェック・失敗判定ロジックを変えないため)。
74
+ */
75
+ uploadMedia(formData: FormData, options?: MediaUploadOptions): Promise<FetchResponse<MediaSubmitApiResponse>>;
76
+ }
@@ -0,0 +1,5 @@
1
+ import { Transform } from '@dnd-kit/utilities';
2
+ import { FocalPoint, FocalPointCoordinates, MediaItem } from '../types/index.js';
3
+ export declare function getFocalPoint(media: MediaItem): FocalPoint;
4
+ export declare function coordinatesToTransform(focalPointCoordinates: FocalPointCoordinates, canvas: Cropper.CanvasData): Transform;
5
+ export declare function focalPointToCoordinates(focalPoint: [number, number], canvas: Cropper.CanvasData): FocalPointCoordinates;
package/package.json ADDED
@@ -0,0 +1,112 @@
1
+ {
2
+ "name": "@ablogcms/media",
3
+ "version": "3.2.28-beta.0",
4
+ "type": "module",
5
+ "description": "メディアライブラリの React 実装一式",
6
+ "license": "MIT",
7
+ "homepage": "https://www.a-blogcms.jp",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+ssh://git@bitbucket.org:appleple/ablogcms.git",
11
+ "directory": "packages/frontend/media"
12
+ },
13
+ "sideEffects": [
14
+ "**/*.css"
15
+ ],
16
+ "dependencies": {
17
+ "@dnd-kit/core": "^6.3.1",
18
+ "@dnd-kit/utilities": "^3.2.2",
19
+ "@tanstack/react-table": "^8.20.5",
20
+ "classnames": "^2.5.1",
21
+ "cropperjs": "^1.6.2",
22
+ "dayjs": "^1.11.13",
23
+ "dompurify": "^3.1.6",
24
+ "heic-to": "^1.2.2",
25
+ "rc-slider": "^11.1.5",
26
+ "react-redux": "^9.2.0",
27
+ "redux": "^5.0.1",
28
+ "redux-saga": "^1.3.0",
29
+ "@ablogcms/notify": "3.2.28-beta.0",
30
+ "@ablogcms/events": "3.2.28-beta.0",
31
+ "@ablogcms/components": "3.2.28-beta.0",
32
+ "@ablogcms/fetch-client": "3.2.28-beta.0",
33
+ "@ablogcms/utils": "3.2.28-beta.0",
34
+ "@ablogcms/pending": "3.2.28-beta.0",
35
+ "@ablogcms/lib": "3.2.28-beta.0",
36
+ "@ablogcms/types": "3.2.28-beta.0"
37
+ },
38
+ "devDependencies": {
39
+ "@testing-library/react": "^16.3.2",
40
+ "vitest": "^4.1.9"
41
+ },
42
+ "peerDependencies": {
43
+ "react": "^19",
44
+ "@types/react": "^19.2.17"
45
+ },
46
+ "peerDependenciesMeta": {
47
+ "@types/react": {
48
+ "optional": true
49
+ }
50
+ },
51
+ "exports": {
52
+ "./acms": {
53
+ "types": "./dist/acms.d.ts",
54
+ "import": "./dist/acms.mjs",
55
+ "default": "./dist/acms.mjs"
56
+ },
57
+ "./types": {
58
+ "types": "./dist/types/index.d.ts",
59
+ "import": "./dist/types/index.mjs",
60
+ "default": "./dist/types/index.mjs"
61
+ },
62
+ "./runtime": {
63
+ "types": "./dist/runtime.d.ts",
64
+ "import": "./dist/runtime.mjs",
65
+ "default": "./dist/runtime.mjs"
66
+ },
67
+ "./dataview/column-type": {
68
+ "types": "./dist/dataview/column-type.d.ts",
69
+ "import": "./dist/dataview/column-type.mjs",
70
+ "default": "./dist/dataview/column-type.mjs"
71
+ },
72
+ "./setup-media-unit": {
73
+ "types": "./dist/setup-media-unit.d.ts",
74
+ "import": "./dist/setup-media-unit.mjs",
75
+ "default": "./dist/setup-media-unit.mjs"
76
+ },
77
+ "./components/media-admin/media-admin": {
78
+ "types": "./dist/components/media-admin/media-admin.d.ts",
79
+ "import": "./dist/components/media-admin/media-admin.mjs",
80
+ "default": "./dist/components/media-admin/media-admin.mjs"
81
+ },
82
+ "./components/media-insert/media-insert": {
83
+ "types": "./dist/components/media-insert/media-insert.d.ts",
84
+ "import": "./dist/components/media-insert/media-insert.mjs",
85
+ "default": "./dist/components/media-insert/media-insert.mjs"
86
+ },
87
+ "./components/media-update/media-update": {
88
+ "types": "./dist/components/media-update/media-update.d.ts",
89
+ "import": "./dist/components/media-update/media-update.mjs",
90
+ "default": "./dist/components/media-update/media-update.mjs"
91
+ },
92
+ "./components/media-droparea/media-droparea": {
93
+ "types": "./dist/components/media-droparea/media-droparea.d.ts",
94
+ "import": "./dist/components/media-droparea/media-droparea.mjs",
95
+ "default": "./dist/components/media-droparea/media-droparea.mjs"
96
+ },
97
+ "./components/media-unit/media-unit": {
98
+ "types": "./dist/components/media-unit/media-unit.d.ts",
99
+ "import": "./dist/components/media-unit/media-unit.mjs",
100
+ "default": "./dist/components/media-unit/media-unit.mjs"
101
+ }
102
+ },
103
+ "publishConfig": {
104
+ "access": "public"
105
+ },
106
+ "files": [
107
+ "dist"
108
+ ],
109
+ "scripts": {
110
+ "build": "node ../../../tools/build-package.mjs"
111
+ }
112
+ }