@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,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 {};