@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.
- package/README.md +28 -0
- package/dist/acms.d.ts +10 -0
- package/dist/acms.mjs +1 -0
- package/dist/acms.mjs.map +1 -0
- package/dist/chunk-32U7ADG2.mjs +456 -0
- package/dist/chunk-32U7ADG2.mjs.map +1 -0
- package/dist/chunk-3SYVRD3N.mjs +37 -0
- package/dist/chunk-3SYVRD3N.mjs.map +1 -0
- package/dist/chunk-5P6HFS6L.mjs +90 -0
- package/dist/chunk-5P6HFS6L.mjs.map +1 -0
- package/dist/chunk-J5LGTIGS.mjs +10 -0
- package/dist/chunk-J5LGTIGS.mjs.map +1 -0
- package/dist/chunk-JJTHI4QP.mjs +1783 -0
- package/dist/chunk-JJTHI4QP.mjs.map +1 -0
- package/dist/chunk-KQNVYJOK.mjs +1814 -0
- package/dist/chunk-KQNVYJOK.mjs.map +1 -0
- package/dist/chunk-LAZAMWG6.mjs +231 -0
- package/dist/chunk-LAZAMWG6.mjs.map +1 -0
- package/dist/components/media-admin/media-admin-view.d.ts +22 -0
- package/dist/components/media-admin/media-admin.d.ts +6 -0
- package/dist/components/media-admin/media-admin.mjs +148 -0
- package/dist/components/media-admin/media-admin.mjs.map +1 -0
- package/dist/components/media-droparea/media-droparea.d.ts +63 -0
- package/dist/components/media-droparea/media-droparea.mjs +152 -0
- package/dist/components/media-droparea/media-droparea.mjs.map +1 -0
- package/dist/components/media-edit-modal/media-edit-modal.d.ts +58 -0
- package/dist/components/media-insert/media-insert-modal.d.ts +30 -0
- package/dist/components/media-insert/media-insert.d.ts +5 -0
- package/dist/components/media-insert/media-insert.mjs +11 -0
- package/dist/components/media-insert/media-insert.mjs.map +1 -0
- package/dist/components/media-list/media-list.d.ts +125 -0
- package/dist/components/media-modal/media-modal.d.ts +94 -0
- package/dist/components/media-modal/pdf-previewer.d.ts +8 -0
- package/dist/components/media-unit/media-unit.d.ts +65 -0
- package/dist/components/media-unit/media-unit.mjs +13 -0
- package/dist/components/media-unit/media-unit.mjs.map +1 -0
- package/dist/components/media-update/media-update-modal.d.ts +12 -0
- package/dist/components/media-update/media-update.d.ts +5 -0
- package/dist/components/media-update/media-update.mjs +10 -0
- package/dist/components/media-update/media-update.mjs.map +1 -0
- package/dist/components/media-uploader/media-uploader.d.ts +69 -0
- package/dist/constants/index.d.ts +19 -0
- package/dist/containers/media-admin.d.ts +10 -0
- package/dist/containers/media-insert.d.ts +17 -0
- package/dist/containers/media-update.d.ts +13 -0
- package/dist/dataview/column-type.d.ts +10 -0
- package/dist/dataview/column-type.mjs +75 -0
- package/dist/dataview/column-type.mjs.map +1 -0
- package/dist/events.d.ts +70 -0
- package/dist/media-crop-focal-OQHAYXEP.svg +1 -0
- package/dist/media-crop-icon-LD2QEJHL.svg +12 -0
- package/dist/media-focal-point-OQQ3MQM2.svg +3 -0
- package/dist/media-rotate-icon-HBMXAPD4.svg +7 -0
- package/dist/runtime.d.ts +20 -0
- package/dist/runtime.mjs +16 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/setup-media-unit.d.ts +2 -0
- package/dist/setup-media-unit.mjs +118 -0
- package/dist/setup-media-unit.mjs.map +1 -0
- package/dist/stores/actions.d.ts +64 -0
- package/dist/stores/reducer.d.ts +5 -0
- package/dist/stores/saga.d.ts +35 -0
- package/dist/types/config.d.ts +29 -0
- package/dist/types/index.d.ts +83 -0
- package/dist/types/index.mjs +1 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/types/transport.d.ts +76 -0
- package/dist/utils/index.d.ts +5 -0
- package/package.json +112 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MediaList,
|
|
3
|
+
MediaUploader
|
|
4
|
+
} from "../../chunk-KQNVYJOK.mjs";
|
|
5
|
+
import {
|
|
6
|
+
MediaModal,
|
|
7
|
+
actions_exports,
|
|
8
|
+
reducer_default,
|
|
9
|
+
rootSaga
|
|
10
|
+
} from "../../chunk-JJTHI4QP.mjs";
|
|
11
|
+
import {
|
|
12
|
+
getMediaFillStore
|
|
13
|
+
} from "../../chunk-3SYVRD3N.mjs";
|
|
14
|
+
import "../../chunk-J5LGTIGS.mjs";
|
|
15
|
+
|
|
16
|
+
// src/components/media-admin/media-admin.tsx
|
|
17
|
+
import { applyMiddleware, legacy_createStore as createStore } from "redux";
|
|
18
|
+
import { Provider } from "react-redux";
|
|
19
|
+
import createSagaMiddleware from "redux-saga";
|
|
20
|
+
import { SlotFillProvider } from "@ablogcms/components/slot-fill";
|
|
21
|
+
|
|
22
|
+
// src/containers/media-admin.tsx
|
|
23
|
+
import { connect } from "react-redux";
|
|
24
|
+
import { bindActionCreators } from "redux";
|
|
25
|
+
|
|
26
|
+
// src/components/media-admin/media-admin-view.tsx
|
|
27
|
+
import { Component, createRef } from "react";
|
|
28
|
+
import { Tabs, TabPanel } from "@ablogcms/components/tabs";
|
|
29
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
30
|
+
var MediaAdminView = class extends Component {
|
|
31
|
+
uploaderRef;
|
|
32
|
+
constructor(props) {
|
|
33
|
+
super(props);
|
|
34
|
+
const params = new URLSearchParams(window.location.hash.replace("#", ""));
|
|
35
|
+
if (params.has("label")) {
|
|
36
|
+
props.actions.setLabel(params.get("label"));
|
|
37
|
+
}
|
|
38
|
+
this.state = {
|
|
39
|
+
isMediaModalOpen: false
|
|
40
|
+
};
|
|
41
|
+
this.uploaderRef = createRef();
|
|
42
|
+
}
|
|
43
|
+
defaultTabIndex() {
|
|
44
|
+
const params = new URLSearchParams(window.location.hash.replace("#", ""));
|
|
45
|
+
const { tab } = this.props;
|
|
46
|
+
if (params.get("upload") === "true") {
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
if (tab === "upload") {
|
|
50
|
+
return 1;
|
|
51
|
+
}
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
componentDidMount() {
|
|
55
|
+
this.props.actions.setFormToken(window.csrfToken);
|
|
56
|
+
}
|
|
57
|
+
componentDidUpdate(prevProps) {
|
|
58
|
+
if (prevProps.item !== this.props.item && this.props.item !== null) {
|
|
59
|
+
this.setState({ isMediaModalOpen: true });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
handleMediaModalClose() {
|
|
63
|
+
this.setState({ isMediaModalOpen: false });
|
|
64
|
+
}
|
|
65
|
+
handleAfterMediaModalClose() {
|
|
66
|
+
this.props.actions.setItem(null);
|
|
67
|
+
}
|
|
68
|
+
handleTabChange() {
|
|
69
|
+
if (this.uploaderRef.current) {
|
|
70
|
+
this.uploaderRef.current.removeUploadedItems();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
render() {
|
|
74
|
+
const { isMediaModalOpen } = this.state;
|
|
75
|
+
const {
|
|
76
|
+
items,
|
|
77
|
+
actions,
|
|
78
|
+
item,
|
|
79
|
+
largeSize,
|
|
80
|
+
formToken,
|
|
81
|
+
archives,
|
|
82
|
+
extensions,
|
|
83
|
+
mode,
|
|
84
|
+
lastPage,
|
|
85
|
+
config,
|
|
86
|
+
tags,
|
|
87
|
+
total,
|
|
88
|
+
selectedTags
|
|
89
|
+
} = this.props;
|
|
90
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
91
|
+
/* @__PURE__ */ jsxs(Tabs, { defaultIndex: this.defaultTabIndex(), onChange: this.handleTabChange.bind(this), children: [
|
|
92
|
+
/* @__PURE__ */ jsx(TabPanel, { label: ACMS.i18n("media.media_list"), id: "media-list", children: /* @__PURE__ */ jsx(
|
|
93
|
+
MediaList,
|
|
94
|
+
{
|
|
95
|
+
items,
|
|
96
|
+
actions,
|
|
97
|
+
mode,
|
|
98
|
+
lastPage,
|
|
99
|
+
config,
|
|
100
|
+
archives,
|
|
101
|
+
tags,
|
|
102
|
+
extensions,
|
|
103
|
+
total,
|
|
104
|
+
selectedTags
|
|
105
|
+
}
|
|
106
|
+
) }),
|
|
107
|
+
/* @__PURE__ */ jsx(TabPanel, { label: ACMS.i18n("media.upload"), id: "media-upload", children: /* @__PURE__ */ jsx(MediaUploader, { ref: this.uploaderRef, config, actions, largeSize, tags }) })
|
|
108
|
+
] }),
|
|
109
|
+
/* @__PURE__ */ jsx(
|
|
110
|
+
MediaModal,
|
|
111
|
+
{
|
|
112
|
+
isOpen: isMediaModalOpen,
|
|
113
|
+
onClose: this.handleMediaModalClose.bind(this),
|
|
114
|
+
item,
|
|
115
|
+
actions,
|
|
116
|
+
formToken,
|
|
117
|
+
tags,
|
|
118
|
+
onAfterClose: this.handleAfterMediaModalClose.bind(this)
|
|
119
|
+
}
|
|
120
|
+
)
|
|
121
|
+
] });
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
// src/containers/media-admin.tsx
|
|
126
|
+
function mapStateToProps(state) {
|
|
127
|
+
return state;
|
|
128
|
+
}
|
|
129
|
+
function mapDispatchToProps(dispatch) {
|
|
130
|
+
return {
|
|
131
|
+
actions: bindActionCreators(actions_exports, dispatch)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
var media_admin_default = connect(mapStateToProps, mapDispatchToProps)(MediaAdminView);
|
|
135
|
+
|
|
136
|
+
// src/components/media-admin/media-admin.tsx
|
|
137
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
138
|
+
var sagaMiddleware = createSagaMiddleware();
|
|
139
|
+
var store = createStore(reducer_default, applyMiddleware(sagaMiddleware));
|
|
140
|
+
sagaMiddleware.run(rootSaga);
|
|
141
|
+
function MediaAdmin({ mode = "edit" }) {
|
|
142
|
+
return /* @__PURE__ */ jsx2(SlotFillProvider, { store: getMediaFillStore(), children: /* @__PURE__ */ jsx2(Provider, { store, children: /* @__PURE__ */ jsx2(media_admin_default, { mode }) }) });
|
|
143
|
+
}
|
|
144
|
+
var media_admin_default2 = MediaAdmin;
|
|
145
|
+
export {
|
|
146
|
+
media_admin_default2 as default
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=media-admin.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-admin/media-admin.tsx","../../../src/containers/media-admin.tsx","../../../src/components/media-admin/media-admin-view.tsx"],"sourcesContent":["import { applyMiddleware, legacy_createStore as createStore } from 'redux';\nimport { Provider } from 'react-redux';\nimport createSagaMiddleware from 'redux-saga';\nimport { SlotFillProvider } from '@ablogcms/components/slot-fill';\n\nimport MediaAdminContainer from '../../containers/media-admin';\nimport reducer from '../../stores/reducer';\nimport saga from '../../stores/saga';\nimport { getMediaFillStore } from '../../runtime';\n\nconst sagaMiddleware = createSagaMiddleware();\nconst store = createStore(reducer, applyMiddleware(sagaMiddleware));\n\nsagaMiddleware.run(saga);\n\ninterface MediaAdminProps {\n mode?: React.ComponentProps<typeof MediaAdminContainer>['mode'];\n}\n\n// MediaAdmin は MediaModal(media.edit-modal.* Slot 群)を開く 8 経路の 1 つ。SlotFillProvider を\n// 巻いておかないと Slot が throw する。store は起動時注入(configureMediaRuntime)で、未注入時は\n// SlotFillProvider がローカルストアへフォールバックする。\nfunction MediaAdmin({ mode = 'edit' }: MediaAdminProps) {\n return (\n <SlotFillProvider store={getMediaFillStore()}>\n <Provider store={store}>\n <MediaAdminContainer mode={mode} />\n </Provider>\n </SlotFillProvider>\n );\n}\n\nexport default MediaAdmin;\n","import { connect } from 'react-redux';\nimport { Dispatch, bindActionCreators } from 'redux';\nimport * as actions from '../stores/actions';\nimport MediaAdminView from '../components/media-admin/media-admin-view';\nimport { MediaStateProps } from '../types';\n\nfunction mapStateToProps(state: MediaStateProps) {\n return state;\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n return {\n actions: bindActionCreators(actions, dispatch),\n };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(MediaAdminView);\n","import { Component, createRef } from 'react';\n\nimport { Tabs, TabPanel } from '@ablogcms/components/tabs';\nimport MediaList from '../media-list/media-list';\nimport MediaModal from '../media-modal/media-modal';\nimport MediaUploader from '../media-uploader/media-uploader';\nimport { MediaStateProps } from '../../types';\n\ninterface MediaAdminViewProps extends MediaStateProps {\n mode: 'edit' | 'insert';\n tab?: 'upload' | 'select';\n}\n\ninterface MediaAdminViewState {\n isMediaModalOpen: boolean;\n}\n\nexport default class MediaAdminView extends Component<MediaAdminViewProps, MediaAdminViewState> {\n uploaderRef: React.RefObject<InstanceType<typeof MediaUploader> | null>;\n\n constructor(props: MediaAdminViewProps) {\n super(props);\n const params = new URLSearchParams(window.location.hash.replace('#', ''));\n // e.g http://acms.org/bid/1/admin/media_index/#label=aaa,bbb&upload=true\n if (params.has('label')) {\n props.actions.setLabel(params.get('label') as string);\n }\n this.state = {\n isMediaModalOpen: false,\n };\n this.uploaderRef = createRef<InstanceType<typeof MediaUploader>>();\n }\n\n defaultTabIndex() {\n const params = new URLSearchParams(window.location.hash.replace('#', ''));\n const { tab } = this.props;\n if (params.get('upload') === 'true') {\n return 1;\n }\n\n if (tab === 'upload') {\n return 1;\n }\n return 0;\n }\n\n componentDidMount() {\n this.props.actions.setFormToken(window.csrfToken);\n }\n\n componentDidUpdate(prevProps: MediaAdminViewProps) {\n if (prevProps.item !== this.props.item && this.props.item !== null) {\n this.setState({ isMediaModalOpen: true });\n }\n }\n\n handleMediaModalClose() {\n this.setState({ isMediaModalOpen: false });\n }\n\n handleAfterMediaModalClose() {\n this.props.actions.setItem(null);\n }\n\n handleTabChange() {\n if (this.uploaderRef.current) {\n // タブ切り替え時にアップロード済みアイテムを削除\n this.uploaderRef.current.removeUploadedItems();\n }\n }\n\n render() {\n const { isMediaModalOpen } = this.state;\n const {\n items,\n actions,\n item,\n largeSize,\n formToken,\n archives,\n extensions,\n mode,\n lastPage,\n config,\n tags,\n total,\n selectedTags,\n } = this.props;\n\n return (\n <div>\n <Tabs defaultIndex={this.defaultTabIndex()} onChange={this.handleTabChange.bind(this)}>\n <TabPanel label={ACMS.i18n('media.media_list')} id=\"media-list\">\n <MediaList\n items={items}\n actions={actions}\n mode={mode}\n lastPage={lastPage}\n config={config}\n archives={archives}\n tags={tags}\n extensions={extensions}\n total={total}\n selectedTags={selectedTags}\n />\n </TabPanel>\n <TabPanel label={ACMS.i18n('media.upload')} id=\"media-upload\">\n <MediaUploader ref={this.uploaderRef} config={config} actions={actions} largeSize={largeSize} tags={tags} />\n </TabPanel>\n </Tabs>\n <MediaModal\n isOpen={isMediaModalOpen}\n onClose={this.handleMediaModalClose.bind(this)}\n item={item}\n actions={actions}\n formToken={formToken}\n tags={tags}\n onAfterClose={this.handleAfterMediaModalClose.bind(this)}\n />\n </div>\n );\n }\n}\n"],"mappings":"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","names":["jsx","media_admin_default"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Component } from 'react';
|
|
2
|
+
import type { ExtendedFile } from '@ablogcms/lib/read-files';
|
|
3
|
+
import { MediaItem, MediaType } from '../../types/index.js';
|
|
4
|
+
type AcceptMediaType = Extract<MediaType, 'image' | 'file'> | 'all';
|
|
5
|
+
type MediaDropAreaProps = {
|
|
6
|
+
/**
|
|
7
|
+
* メディアID
|
|
8
|
+
*/
|
|
9
|
+
mid?: number;
|
|
10
|
+
/**
|
|
11
|
+
* サムネイル画像のパス
|
|
12
|
+
*/
|
|
13
|
+
thumbnail: string;
|
|
14
|
+
/**
|
|
15
|
+
* キャプション
|
|
16
|
+
*/
|
|
17
|
+
caption: string;
|
|
18
|
+
/**
|
|
19
|
+
* 幅
|
|
20
|
+
*/
|
|
21
|
+
width: React.CSSProperties['width'];
|
|
22
|
+
/**
|
|
23
|
+
* 高さ
|
|
24
|
+
*/
|
|
25
|
+
height: React.CSSProperties['height'];
|
|
26
|
+
/**
|
|
27
|
+
* メディアタイプ
|
|
28
|
+
*/
|
|
29
|
+
mediaType?: MediaType;
|
|
30
|
+
/**
|
|
31
|
+
* 受け付けるメディアタイプ
|
|
32
|
+
*/
|
|
33
|
+
accept?: AcceptMediaType;
|
|
34
|
+
/**
|
|
35
|
+
* メディアの変更時のコールバック
|
|
36
|
+
*/
|
|
37
|
+
onChange: (media: MediaItem | null) => void;
|
|
38
|
+
/**
|
|
39
|
+
* エラー時のコールバック
|
|
40
|
+
*/
|
|
41
|
+
onError: () => void;
|
|
42
|
+
};
|
|
43
|
+
interface MediaDropAreaState {
|
|
44
|
+
isInsertModalOpen: boolean;
|
|
45
|
+
isUpdateModalOpen: boolean;
|
|
46
|
+
files: File[];
|
|
47
|
+
}
|
|
48
|
+
export default class MediaDropArea extends Component<MediaDropAreaProps, MediaDropAreaState> {
|
|
49
|
+
static defaultProps: {
|
|
50
|
+
accept: string;
|
|
51
|
+
};
|
|
52
|
+
constructor(props: MediaDropAreaProps);
|
|
53
|
+
onComplete: (files: ExtendedFile[]) => void;
|
|
54
|
+
uploadFile: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
55
|
+
onInsert: (items: MediaItem[]) => void;
|
|
56
|
+
onClose: () => void;
|
|
57
|
+
onUpdateModalClose: () => void;
|
|
58
|
+
onUpdateModalUpdate: (item: MediaItem) => void;
|
|
59
|
+
handleRemove: () => void;
|
|
60
|
+
openEditModal: () => void;
|
|
61
|
+
render(): import("react").JSX.Element;
|
|
62
|
+
}
|
|
63
|
+
export {};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import {
|
|
2
|
+
media_update_default
|
|
3
|
+
} from "../../chunk-5P6HFS6L.mjs";
|
|
4
|
+
import {
|
|
5
|
+
media_insert_default
|
|
6
|
+
} from "../../chunk-LAZAMWG6.mjs";
|
|
7
|
+
import "../../chunk-KQNVYJOK.mjs";
|
|
8
|
+
import "../../chunk-JJTHI4QP.mjs";
|
|
9
|
+
import "../../chunk-3SYVRD3N.mjs";
|
|
10
|
+
import "../../chunk-J5LGTIGS.mjs";
|
|
11
|
+
|
|
12
|
+
// src/components/media-droparea/media-droparea.tsx
|
|
13
|
+
import { Component } from "react";
|
|
14
|
+
import { DropZone, DropZoneFileSelector, DropZoneText } from "@ablogcms/components/drop-zone";
|
|
15
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
16
|
+
var MediaDropArea = class extends Component {
|
|
17
|
+
static defaultProps = {
|
|
18
|
+
accept: "image"
|
|
19
|
+
};
|
|
20
|
+
constructor(props) {
|
|
21
|
+
super(props);
|
|
22
|
+
this.state = {
|
|
23
|
+
isInsertModalOpen: false,
|
|
24
|
+
isUpdateModalOpen: false,
|
|
25
|
+
files: []
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
onComplete = (files) => {
|
|
29
|
+
this.setState({
|
|
30
|
+
files: files.map((item) => item.file),
|
|
31
|
+
isInsertModalOpen: true
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
uploadFile = (e) => {
|
|
35
|
+
if (e.target.files instanceof FileList) {
|
|
36
|
+
this.setState({
|
|
37
|
+
files: Array.from(e.target.files),
|
|
38
|
+
isInsertModalOpen: true
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
onInsert = (items) => {
|
|
43
|
+
const { accept = "image" } = this.props;
|
|
44
|
+
const [item] = items;
|
|
45
|
+
const fileOrImage = item.media_type === "image" || item.media_type === "svg" ? "image" : "file";
|
|
46
|
+
if (accept !== "all" && accept !== fileOrImage) {
|
|
47
|
+
this.props.onError();
|
|
48
|
+
this.setState({
|
|
49
|
+
isInsertModalOpen: false
|
|
50
|
+
});
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.setState({
|
|
54
|
+
isInsertModalOpen: false
|
|
55
|
+
});
|
|
56
|
+
this.props.onChange(item);
|
|
57
|
+
};
|
|
58
|
+
onClose = () => {
|
|
59
|
+
this.setState({
|
|
60
|
+
isInsertModalOpen: false
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
onUpdateModalClose = () => {
|
|
64
|
+
this.setState({
|
|
65
|
+
isUpdateModalOpen: false
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
onUpdateModalUpdate = (item) => {
|
|
69
|
+
this.setState({
|
|
70
|
+
isUpdateModalOpen: false
|
|
71
|
+
});
|
|
72
|
+
this.props.onChange(item);
|
|
73
|
+
};
|
|
74
|
+
handleRemove = () => {
|
|
75
|
+
this.props.onChange(null);
|
|
76
|
+
};
|
|
77
|
+
openEditModal = () => {
|
|
78
|
+
this.setState({
|
|
79
|
+
isUpdateModalOpen: true
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
render() {
|
|
83
|
+
const { isInsertModalOpen, isUpdateModalOpen, files } = this.state;
|
|
84
|
+
const { mediaType, accept = "image", caption, width, height, mid, thumbnail } = this.props;
|
|
85
|
+
const style = {};
|
|
86
|
+
if (width) {
|
|
87
|
+
style.width = width;
|
|
88
|
+
}
|
|
89
|
+
if (height) {
|
|
90
|
+
style.height = height;
|
|
91
|
+
}
|
|
92
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
93
|
+
/* @__PURE__ */ jsx(DropZone, { onComplete: this.onComplete, children: /* @__PURE__ */ jsxs("div", { children: [
|
|
94
|
+
mid === void 0 && /* @__PURE__ */ jsxs("div", { className: "acms-admin-media-unit-droparea", style, children: [
|
|
95
|
+
/* @__PURE__ */ jsx(DropZoneText, { children: ACMS.i18n("media.add_new_media") }),
|
|
96
|
+
/* @__PURE__ */ jsx(DropZoneFileSelector, { onChange: this.uploadFile, disabled: isInsertModalOpen }),
|
|
97
|
+
/* @__PURE__ */ jsx(DropZoneText, { children: ACMS.i18n("media.drop_file") })
|
|
98
|
+
] }),
|
|
99
|
+
mid != null && mid > 0 && /* @__PURE__ */ jsxs("div", { className: "acms-admin-media-unit-preview-wrap", children: [
|
|
100
|
+
/* @__PURE__ */ jsx("div", { className: "acms-admin-media-unit-preview-overlay" }),
|
|
101
|
+
/* @__PURE__ */ jsx(
|
|
102
|
+
"button",
|
|
103
|
+
{
|
|
104
|
+
type: "button",
|
|
105
|
+
className: "acms-admin-media-unit-preview-remove-btn",
|
|
106
|
+
onClick: this.handleRemove,
|
|
107
|
+
"aria-label": ACMS.i18n("media.clear_button_label")
|
|
108
|
+
}
|
|
109
|
+
),
|
|
110
|
+
(mediaType === "image" || mediaType === "svg") && /* @__PURE__ */ jsx("img", { className: "acms-admin-media-field-preview", src: `${thumbnail}`, alt: "" }),
|
|
111
|
+
mediaType === "file" && /* @__PURE__ */ jsxs("div", { className: "acms-admin-media-unit-file-icon-wrap", children: [
|
|
112
|
+
/* @__PURE__ */ jsx("img", { className: "acms-admin-media-unit-file-icon", src: `${thumbnail}`, alt: "" }),
|
|
113
|
+
/* @__PURE__ */ jsx("p", { className: "acms-admin-media-unit-file-caption", children: caption })
|
|
114
|
+
] }),
|
|
115
|
+
/* @__PURE__ */ jsx(
|
|
116
|
+
"button",
|
|
117
|
+
{
|
|
118
|
+
type: "button",
|
|
119
|
+
className: "acms-admin-media-edit-btn acms-admin-media-unit-preview-edit-btn",
|
|
120
|
+
onClick: () => this.openEditModal(),
|
|
121
|
+
children: ACMS.i18n("media.edit")
|
|
122
|
+
}
|
|
123
|
+
)
|
|
124
|
+
] })
|
|
125
|
+
] }) }),
|
|
126
|
+
/* @__PURE__ */ jsx(
|
|
127
|
+
media_insert_default,
|
|
128
|
+
{
|
|
129
|
+
isOpen: isInsertModalOpen,
|
|
130
|
+
onInsert: this.onInsert,
|
|
131
|
+
files,
|
|
132
|
+
onClose: this.onClose,
|
|
133
|
+
tab: "upload",
|
|
134
|
+
filetype: accept
|
|
135
|
+
}
|
|
136
|
+
),
|
|
137
|
+
mid != null && mid > 0 && /* @__PURE__ */ jsx(
|
|
138
|
+
media_update_default,
|
|
139
|
+
{
|
|
140
|
+
isOpen: isUpdateModalOpen,
|
|
141
|
+
mid,
|
|
142
|
+
onClose: this.onUpdateModalClose,
|
|
143
|
+
onUpdate: this.onUpdateModalUpdate
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
] });
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
export {
|
|
150
|
+
MediaDropArea as default
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=media-droparea.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-droparea/media-droparea.tsx"],"sourcesContent":["import { CSSProperties, Component } from 'react';\nimport type { ExtendedFile } from '@ablogcms/lib/read-files';\nimport { DropZone, DropZoneFileSelector, DropZoneText } from '@ablogcms/components/drop-zone';\nimport MediaInsert from '../media-insert/media-insert';\nimport MediaUpdate from '../media-update/media-update';\nimport { MediaItem, MediaType } from '../../types';\n\ntype AcceptMediaType = Extract<MediaType, 'image' | 'file'> | 'all';\ntype MediaDropAreaProps = {\n /**\n * メディアID\n */\n mid?: number;\n\n /**\n * サムネイル画像のパス\n */\n thumbnail: string;\n\n /**\n * キャプション\n */\n caption: string;\n\n /**\n * 幅\n */\n width: React.CSSProperties['width'];\n\n /**\n * 高さ\n */\n height: React.CSSProperties['height'];\n\n /**\n * メディアタイプ\n */\n mediaType?: MediaType;\n\n /**\n * 受け付けるメディアタイプ\n */\n accept?: AcceptMediaType;\n\n /**\n * メディアの変更時のコールバック\n */\n onChange: (media: MediaItem | null) => void;\n\n /**\n * エラー時のコールバック\n */\n onError: () => void;\n};\n\ninterface MediaDropAreaState {\n isInsertModalOpen: boolean;\n isUpdateModalOpen: boolean;\n files: File[];\n}\n\nexport default class MediaDropArea extends Component<MediaDropAreaProps, MediaDropAreaState> {\n static defaultProps = {\n accept: 'image',\n };\n\n constructor(props: MediaDropAreaProps) {\n super(props);\n this.state = {\n isInsertModalOpen: false,\n isUpdateModalOpen: false,\n files: [],\n };\n }\n\n onComplete = (files: ExtendedFile[]) => {\n this.setState({\n files: files.map((item) => item.file),\n isInsertModalOpen: true,\n });\n };\n\n uploadFile = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files instanceof FileList) {\n this.setState({\n files: Array.from(e.target.files),\n isInsertModalOpen: true,\n });\n }\n };\n\n onInsert = (items: MediaItem[]) => {\n const { accept = 'image' } = this.props;\n const [item] = items;\n const fileOrImage = item.media_type === 'image' || item.media_type === 'svg' ? 'image' : 'file';\n if (accept !== 'all' && accept !== fileOrImage) {\n this.props.onError();\n this.setState({\n isInsertModalOpen: false,\n });\n return;\n }\n this.setState({\n isInsertModalOpen: false,\n });\n this.props.onChange(item);\n };\n\n onClose = () => {\n this.setState({\n isInsertModalOpen: false,\n });\n };\n\n onUpdateModalClose = () => {\n this.setState({\n isUpdateModalOpen: false,\n });\n };\n\n onUpdateModalUpdate = (item: MediaItem) => {\n this.setState({\n isUpdateModalOpen: false,\n });\n this.props.onChange(item);\n };\n\n handleRemove = () => {\n this.props.onChange(null);\n };\n\n openEditModal = () => {\n this.setState({\n isUpdateModalOpen: true,\n });\n };\n\n render() {\n const { isInsertModalOpen, isUpdateModalOpen, files } = this.state;\n const { mediaType, accept = 'image', caption, width, height, mid, thumbnail } = this.props;\n\n const style: CSSProperties = {};\n\n if (width) {\n style.width = width;\n }\n if (height) {\n style.height = height;\n }\n\n return (\n <>\n <DropZone onComplete={this.onComplete}>\n <div>\n {mid === undefined && (\n <div className=\"acms-admin-media-unit-droparea\" style={style}>\n <DropZoneText>{ACMS.i18n('media.add_new_media')}</DropZoneText>\n <DropZoneFileSelector onChange={this.uploadFile} disabled={isInsertModalOpen} />\n <DropZoneText>{ACMS.i18n('media.drop_file')}</DropZoneText>\n </div>\n )}\n {mid != null && mid > 0 && (\n <div className=\"acms-admin-media-unit-preview-wrap\">\n <div className=\"acms-admin-media-unit-preview-overlay\" />\n <button\n type=\"button\"\n className=\"acms-admin-media-unit-preview-remove-btn\"\n onClick={this.handleRemove}\n aria-label={ACMS.i18n('media.clear_button_label')}\n />\n {(mediaType === 'image' || mediaType === 'svg') && (\n <img className=\"acms-admin-media-field-preview\" src={`${thumbnail}`} alt=\"\" />\n )}\n {mediaType === 'file' && (\n <div className=\"acms-admin-media-unit-file-icon-wrap\">\n <img className=\"acms-admin-media-unit-file-icon\" src={`${thumbnail}`} alt=\"\" />\n <p className=\"acms-admin-media-unit-file-caption\">{caption}</p>\n </div>\n )}\n <button\n type=\"button\"\n className=\"acms-admin-media-edit-btn acms-admin-media-unit-preview-edit-btn\"\n onClick={() => this.openEditModal()}\n >\n {ACMS.i18n('media.edit')}\n </button>\n </div>\n )}\n </div>\n </DropZone>\n <MediaInsert\n isOpen={isInsertModalOpen}\n onInsert={this.onInsert}\n files={files}\n onClose={this.onClose}\n tab=\"upload\"\n filetype={accept}\n />\n {mid != null && mid > 0 && (\n <MediaUpdate\n isOpen={isUpdateModalOpen}\n mid={mid}\n onClose={this.onUpdateModalClose}\n onUpdate={this.onUpdateModalUpdate}\n />\n )}\n </>\n );\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Component } from 'react';
|
|
2
|
+
import { DragEndEvent, Modifier } from '@dnd-kit/core';
|
|
3
|
+
import { Transform } from '@dnd-kit/utilities';
|
|
4
|
+
import Cropper from 'cropperjs';
|
|
5
|
+
import { ExtendedFile } from '@ablogcms/lib/read-files';
|
|
6
|
+
|
|
7
|
+
import { FocalPoint } from '../../types/index.js';
|
|
8
|
+
interface MediaEditModalProps {
|
|
9
|
+
onClose: () => void;
|
|
10
|
+
onCrop: (blob: Blob | null, focalPoint: FocalPoint) => void;
|
|
11
|
+
isOpen: boolean;
|
|
12
|
+
src: string;
|
|
13
|
+
focalPoint: FocalPoint;
|
|
14
|
+
mediaCropSizes: [number, number][];
|
|
15
|
+
title?: string;
|
|
16
|
+
width: number;
|
|
17
|
+
height: number;
|
|
18
|
+
original?: string;
|
|
19
|
+
container?: HTMLElement;
|
|
20
|
+
}
|
|
21
|
+
interface MediaEditModalState {
|
|
22
|
+
upload: boolean;
|
|
23
|
+
blob?: Blob | null;
|
|
24
|
+
cropWidth: number;
|
|
25
|
+
cropHeight: number;
|
|
26
|
+
useFocalPoint: boolean;
|
|
27
|
+
focalPoint: FocalPoint;
|
|
28
|
+
zoom: number;
|
|
29
|
+
ratio: number;
|
|
30
|
+
src: string;
|
|
31
|
+
timeout: ReturnType<typeof setTimeout> | null;
|
|
32
|
+
isCropListOpen: boolean;
|
|
33
|
+
}
|
|
34
|
+
export default class MediaEditModal extends Component<MediaEditModalProps, MediaEditModalState> {
|
|
35
|
+
image: HTMLImageElement | null;
|
|
36
|
+
cropper: Cropper | null;
|
|
37
|
+
constructor(props: MediaEditModalProps);
|
|
38
|
+
componentWillUnmount(): void;
|
|
39
|
+
setImageRef(node: HTMLImageElement | null): void;
|
|
40
|
+
handleAfterOpen(): void;
|
|
41
|
+
handleAfterClose(): void;
|
|
42
|
+
onCancel(): void;
|
|
43
|
+
onCrop(): void;
|
|
44
|
+
onUploadImg(files: ExtendedFile[]): void;
|
|
45
|
+
useOriginalImg(): void;
|
|
46
|
+
changeAspectRatio(ratioProp: number): void;
|
|
47
|
+
rotate(rotate: number): void;
|
|
48
|
+
toggleFocalPoint(): void;
|
|
49
|
+
handleFocalDragEnd: (event: DragEndEvent) => void;
|
|
50
|
+
focalPointToTransform: (focalPoint: FocalPoint) => Transform;
|
|
51
|
+
hoverOnCropList: () => void;
|
|
52
|
+
leaveFromCropList: () => void;
|
|
53
|
+
toggleCropList: (e: React.MouseEvent<HTMLButtonElement>) => void;
|
|
54
|
+
restrictToCanvas: Modifier;
|
|
55
|
+
getImgWidth(width: number, height: number): string;
|
|
56
|
+
render(): import("react").JSX.Element;
|
|
57
|
+
}
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Component } from 'react';
|
|
2
|
+
import Modal from '@ablogcms/components/modal';
|
|
3
|
+
import MediaUploader from '../media-uploader/media-uploader.js';
|
|
4
|
+
import { MediaStateProps, MediaItem, MediaViewFileType } from '../../types/index.js';
|
|
5
|
+
interface MediaInsertModalProps extends MediaStateProps, Pick<React.ComponentProps<typeof Modal>, 'onClose' | 'isOpen' | 'container'> {
|
|
6
|
+
tab?: 'upload' | 'select';
|
|
7
|
+
mode?: 'edit' | 'insert';
|
|
8
|
+
radioMode?: boolean;
|
|
9
|
+
filetype?: MediaViewFileType;
|
|
10
|
+
files?: File[];
|
|
11
|
+
onInsert: (items: MediaItem[]) => void;
|
|
12
|
+
}
|
|
13
|
+
interface MediaInsertModalState {
|
|
14
|
+
tabIndex: number;
|
|
15
|
+
isMediaModalOpen: boolean;
|
|
16
|
+
}
|
|
17
|
+
export default class MediaInsertModal extends Component<MediaInsertModalProps, MediaInsertModalState> {
|
|
18
|
+
uploaderRef: React.RefObject<InstanceType<typeof MediaUploader> | null>;
|
|
19
|
+
constructor(props: MediaInsertModalProps);
|
|
20
|
+
defaultTabIndex(): 0 | 1;
|
|
21
|
+
handleAfterOpen(): void;
|
|
22
|
+
componentDidUpdate(prevProps: MediaInsertModalProps): void;
|
|
23
|
+
handleMediaModalClose(): void;
|
|
24
|
+
handleAfterMediaModalClose(): void;
|
|
25
|
+
insertMedia(): void;
|
|
26
|
+
upsert(): void;
|
|
27
|
+
handleTabChange(tabIndex: number): void;
|
|
28
|
+
render(): import("react").JSX.Element;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import MediaInsertContainer from '../../containers/media-insert.js';
|
|
2
|
+
interface MediaInsertProps extends React.ComponentProps<typeof MediaInsertContainer> {
|
|
3
|
+
}
|
|
4
|
+
declare function MediaInsert({ mode, tab, radioMode, filetype, files, onInsert, onClose, isOpen, container, }: MediaInsertProps): import("react").JSX.Element;
|
|
5
|
+
export default MediaInsert;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
media_insert_default
|
|
3
|
+
} from "../../chunk-LAZAMWG6.mjs";
|
|
4
|
+
import "../../chunk-KQNVYJOK.mjs";
|
|
5
|
+
import "../../chunk-JJTHI4QP.mjs";
|
|
6
|
+
import "../../chunk-3SYVRD3N.mjs";
|
|
7
|
+
import "../../chunk-J5LGTIGS.mjs";
|
|
8
|
+
export {
|
|
9
|
+
media_insert_default as default
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=media-insert.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
|
|
2
|
+
import { Component } from 'react';
|
|
3
|
+
import { Menu } from '@ablogcms/components/dropdown-menu';
|
|
4
|
+
import * as actions from '../../stores/actions.js';
|
|
5
|
+
import { MediaItem, MediaAjaxConfig, MediaViewFileType, MediaTag } from '../../types/index.js';
|
|
6
|
+
/** Slot `media.list.bulk-actions`(HOOKS.md 参照)の fillProps */
|
|
7
|
+
export interface MediaListBulkActionsFillProps {
|
|
8
|
+
selectedItems: MediaItem[];
|
|
9
|
+
}
|
|
10
|
+
interface MediaListProps {
|
|
11
|
+
actions: typeof actions;
|
|
12
|
+
items: MediaItem[];
|
|
13
|
+
archives: string[];
|
|
14
|
+
tags: string[];
|
|
15
|
+
extensions?: string[];
|
|
16
|
+
selectedTags: string[];
|
|
17
|
+
config: Required<MediaAjaxConfig>;
|
|
18
|
+
lastPage: number;
|
|
19
|
+
mode: string;
|
|
20
|
+
total: number;
|
|
21
|
+
filetype?: 'all' | 'image' | 'file';
|
|
22
|
+
radioMode?: boolean;
|
|
23
|
+
}
|
|
24
|
+
interface Menu {
|
|
25
|
+
image: boolean;
|
|
26
|
+
id: boolean;
|
|
27
|
+
filename: boolean;
|
|
28
|
+
tag: boolean;
|
|
29
|
+
last_modified: boolean;
|
|
30
|
+
upload_datetime: boolean;
|
|
31
|
+
imagesize: boolean;
|
|
32
|
+
filesize: boolean;
|
|
33
|
+
blogname: boolean;
|
|
34
|
+
}
|
|
35
|
+
type SortDirection = 'asc' | 'desc';
|
|
36
|
+
interface OrderActive {
|
|
37
|
+
media_title: SortDirection;
|
|
38
|
+
media_last_modified: SortDirection;
|
|
39
|
+
media_datetime?: SortDirection;
|
|
40
|
+
media_path: SortDirection;
|
|
41
|
+
media_size: SortDirection;
|
|
42
|
+
media_filesize: SortDirection;
|
|
43
|
+
}
|
|
44
|
+
type DisplayStyle = 'table' | 'list';
|
|
45
|
+
interface MediaListState {
|
|
46
|
+
order: OrderActive;
|
|
47
|
+
menu: Menu;
|
|
48
|
+
scale: number;
|
|
49
|
+
filterMenuOpened: boolean;
|
|
50
|
+
editMode: string;
|
|
51
|
+
year: string;
|
|
52
|
+
month: string;
|
|
53
|
+
toggleAll: boolean;
|
|
54
|
+
orderActive: keyof OrderActive;
|
|
55
|
+
search: string;
|
|
56
|
+
labels: MediaTag[];
|
|
57
|
+
selectedLabels: MediaTag[];
|
|
58
|
+
style: DisplayStyle;
|
|
59
|
+
oldItemId: MediaItem['media_id'] | null;
|
|
60
|
+
items: MediaItem[];
|
|
61
|
+
limit: number;
|
|
62
|
+
displayPage: number;
|
|
63
|
+
filteredOptions: MediaTag[];
|
|
64
|
+
fileext: string;
|
|
65
|
+
owner: boolean;
|
|
66
|
+
blogAxis: boolean;
|
|
67
|
+
filetype: MediaViewFileType;
|
|
68
|
+
}
|
|
69
|
+
export default class MediaList extends Component<MediaListProps, MediaListState> {
|
|
70
|
+
listRef: React.RefObject<HTMLFormElement | null>;
|
|
71
|
+
static defaultProps: {
|
|
72
|
+
radioMode: boolean;
|
|
73
|
+
filetype: string;
|
|
74
|
+
extensions: never[];
|
|
75
|
+
};
|
|
76
|
+
constructor(props: MediaListProps);
|
|
77
|
+
getOrderSelectBtnLabel(): string;
|
|
78
|
+
setItem(item: MediaItem): boolean;
|
|
79
|
+
toggleCheck(item: MediaItem): void;
|
|
80
|
+
toggleCheckFrom(fromItemId: MediaItem['media_id'], toItem: MediaItem): void;
|
|
81
|
+
toggleAllCheck(): void;
|
|
82
|
+
removeImgs(): Promise<void>;
|
|
83
|
+
setOrder(target: keyof OrderActive): void;
|
|
84
|
+
checkOrder(orderActive: keyof OrderActive): void;
|
|
85
|
+
checkAscDesc(ascdesc: 'asc' | 'desc'): void;
|
|
86
|
+
getOrder(): string;
|
|
87
|
+
fetchMediaList(config?: MediaAjaxConfig): void;
|
|
88
|
+
getIsSorted(th: keyof OrderActive): false | SortDirection;
|
|
89
|
+
getNextSortDirection(th: keyof OrderActive): SortDirection;
|
|
90
|
+
changeStyle(style: DisplayStyle): void;
|
|
91
|
+
getCheckedItemsLength(): number;
|
|
92
|
+
/**
|
|
93
|
+
* チェック済みかつ「実際にチェックボックスが描画される」アイテムのみを返す。
|
|
94
|
+
* `mode === 'edit'` のとき `!media_editable` の行はチェックボックス自体が描画されない
|
|
95
|
+
* (テーブル行の描画条件 `mode !== 'edit' || item.media_editable` と同じ判定)が、
|
|
96
|
+
* `toggleAllCheck()`(全選択)は編集可否を見ずに `checked` を立てるため、`props.items` の
|
|
97
|
+
* `checked` だけを見ると実際にフォーム送信される対象より多く数えてしまう。
|
|
98
|
+
* `media.delete.before`/`.success` の `mediaIds` と Slot `media.list.bulk-actions` の
|
|
99
|
+
* `selectedItems` は、実削除対象(フォームのチェックボックス)と一致させるためこちらを使う。
|
|
100
|
+
*/
|
|
101
|
+
getSelectedItems(): MediaItem[];
|
|
102
|
+
onLabelChange(labels: readonly MediaTag[]): void;
|
|
103
|
+
getFilteredOptions(tags: string[]): void;
|
|
104
|
+
onChangeDisplayNumber(e: React.ChangeEvent<HTMLSelectElement>): void;
|
|
105
|
+
onKeywordInput(e: React.FormEvent<HTMLInputElement>): void;
|
|
106
|
+
getArchives(archives: string[]): {
|
|
107
|
+
years: string[];
|
|
108
|
+
months: string[];
|
|
109
|
+
};
|
|
110
|
+
onDateChange(value: string, type: 'year' | 'month'): void;
|
|
111
|
+
onAddedLabelsChange(labels: readonly MediaTag[]): void;
|
|
112
|
+
addLabelToItems(): Promise<void>;
|
|
113
|
+
getFileStyle: (item: MediaItem) => React.CSSProperties;
|
|
114
|
+
getImageStyle: (item: MediaItem) => React.CSSProperties;
|
|
115
|
+
rowClick(e: React.MouseEvent<HTMLTableRowElement>, item: MediaItem): void;
|
|
116
|
+
componentDidUpdate(prevProps: MediaListProps): void;
|
|
117
|
+
componentDidMount(): void;
|
|
118
|
+
loadImg(url: string): Promise<HTMLImageElement>;
|
|
119
|
+
setItems(items: MediaItem[]): void;
|
|
120
|
+
scaleChanged: (scale: number | number[]) => void;
|
|
121
|
+
getOptions: () => MediaTag[];
|
|
122
|
+
toggleMenu(menuItem: keyof Menu): void;
|
|
123
|
+
render(): import("react").JSX.Element;
|
|
124
|
+
}
|
|
125
|
+
export {};
|