@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,1783 @@
1
+ import {
2
+ getMediaTransport
3
+ } from "./chunk-3SYVRD3N.mjs";
4
+ import {
5
+ __export
6
+ } from "./chunk-J5LGTIGS.mjs";
7
+
8
+ // src/stores/actions.ts
9
+ var actions_exports = {};
10
+ __export(actions_exports, {
11
+ fetchMediaList: () => fetchMediaList,
12
+ fetchTagList: () => fetchTagList,
13
+ setFormToken: () => setFormToken,
14
+ setItem: () => setItem,
15
+ setLabel: () => setLabel,
16
+ setLoading: () => setLoading,
17
+ setMediaArchives: () => setMediaArchives,
18
+ setMediaConfig: () => setMediaConfig,
19
+ setMediaExtensions: () => setMediaExtensions,
20
+ setMediaLargeSize: () => setMediaLargeSize,
21
+ setMediaLastPage: () => setMediaLastPage,
22
+ setMediaList: () => setMediaList,
23
+ setMediaTags: () => setMediaTags,
24
+ setMediaTotal: () => setMediaTotal,
25
+ setSelectedTags: () => setSelectedTags,
26
+ updateMediaList: () => updateMediaList
27
+ });
28
+
29
+ // src/constants/index.ts
30
+ var FETCHMEDIALIST = "FETCHMEDIALIST";
31
+ var FETCHTAGLIST = "FETCHTAGLIST";
32
+ var SETMEDIALIST = "SETMEDIALIST";
33
+ var SETMEDIALASTPAGE = "SETMEDIALASTPAGE";
34
+ var SETMEDIACONFIG = "SETMEDIACONFIG";
35
+ var SETITEM = "SETITEM";
36
+ var UPDATEMEDIALIST = "UPDATEMEDIALIST";
37
+ var SETMEDIALARGESIZE = "SETMEDIALARGESIZE";
38
+ var SETFORMTOKEN = "SETFORMTOKEN";
39
+ var SETLABEL = "SETLABEL";
40
+ var SETMEDIAARCHIVES = "SETMEDIAARCHIVES";
41
+ var SETMEDIATAGS = "SETMEDIATAGS";
42
+ var SETMEDIATOTAL = "SETMEDIATOTAL";
43
+ var SETLOADING = "SETLOADING";
44
+ var SETSELECTEDTAGS = "SETSELECTEDTAGS";
45
+ var SETMEDIAEXTENSIONS = "SETMEDIAEXTENSIONS";
46
+
47
+ // src/stores/actions.ts
48
+ var fetchTagList = () => ({ type: FETCHTAGLIST });
49
+ var fetchMediaList = (config) => ({ type: FETCHMEDIALIST, config });
50
+ var setMediaList = (items) => ({ type: SETMEDIALIST, items });
51
+ var setMediaConfig = (config) => ({ type: SETMEDIACONFIG, config });
52
+ var setMediaLastPage = (page) => ({ type: SETMEDIALASTPAGE, page });
53
+ var setMediaLargeSize = (largeSize) => ({ type: SETMEDIALARGESIZE, largeSize });
54
+ var setFormToken = (formToken) => ({ type: SETFORMTOKEN, formToken });
55
+ var setItem = (item) => ({ type: SETITEM, item });
56
+ var updateMediaList = (item) => ({ type: UPDATEMEDIALIST, item });
57
+ var setLabel = (label) => ({ type: SETLABEL, label });
58
+ var setMediaArchives = (archives) => ({ type: SETMEDIAARCHIVES, archives });
59
+ var setMediaTags = (tags) => ({ type: SETMEDIATAGS, tags });
60
+ var setMediaTotal = (total) => ({ type: SETMEDIATOTAL, total });
61
+ var setLoading = (loading) => ({ type: SETLOADING, loading });
62
+ var setSelectedTags = (tags) => ({ type: SETSELECTEDTAGS, tags });
63
+ var setMediaExtensions = (extensions) => ({ type: SETMEDIAEXTENSIONS, extensions });
64
+
65
+ // src/stores/reducer.ts
66
+ var initialState = {
67
+ items: [],
68
+ archives: [],
69
+ tags: [],
70
+ extensions: [],
71
+ selectedTags: [],
72
+ item: null,
73
+ lastPage: 1,
74
+ largeSize: 0,
75
+ total: 0,
76
+ config: {
77
+ limit: 20,
78
+ page: 1,
79
+ order: "upload_date-desc",
80
+ keyword: "",
81
+ tag: "",
82
+ date: "",
83
+ filetype: "all",
84
+ fileext: "all",
85
+ year: "",
86
+ month: "",
87
+ owner: false,
88
+ blogAxis: false
89
+ },
90
+ formToken: "",
91
+ label: "",
92
+ loading: false,
93
+ actions: actions_exports
94
+ // upload: false,
95
+ // mode: 'edit',
96
+ // tab: 'select',
97
+ };
98
+ var reducer_default = (state = initialState, action) => {
99
+ switch (action.type) {
100
+ case SETMEDIALIST:
101
+ const { items } = action;
102
+ return { ...state, items };
103
+ case SETMEDIALASTPAGE:
104
+ return { ...state, lastPage: action.page };
105
+ case SETMEDIACONFIG:
106
+ return { ...state, config: { ...state.config, ...action.config } };
107
+ case SETMEDIATAGS:
108
+ return { ...state, tags: action.tags };
109
+ case SETMEDIAARCHIVES:
110
+ return { ...state, archives: action.archives };
111
+ case SETITEM:
112
+ return { ...state, item: action.item };
113
+ case UPDATEMEDIALIST:
114
+ const index = state.items.findIndex((item) => {
115
+ if (item.media_id === action.item.media_id) {
116
+ return true;
117
+ }
118
+ return false;
119
+ });
120
+ return {
121
+ ...state,
122
+ items: [...state.items.slice(0, index), action.item, ...state.items.slice(index + 1)]
123
+ };
124
+ case SETMEDIALARGESIZE:
125
+ return { ...state, largeSize: action.largeSize };
126
+ case SETFORMTOKEN:
127
+ return { ...state, formToken: action.formToken };
128
+ case SETLABEL:
129
+ return { ...state, label: action.label };
130
+ case SETMEDIATOTAL:
131
+ return { ...state, total: action.total };
132
+ case SETLOADING:
133
+ return { ...state, loading: action.loading };
134
+ case SETSELECTEDTAGS:
135
+ return { ...state, selectedTags: action.tags };
136
+ case SETMEDIAEXTENSIONS:
137
+ return { ...state, extensions: action.extensions };
138
+ default:
139
+ return state;
140
+ }
141
+ };
142
+
143
+ // src/stores/saga.ts
144
+ import { call, put, takeEvery, select } from "redux-saga/effects";
145
+ function* fetchTagList2() {
146
+ const transport = getMediaTransport();
147
+ const data = yield call([transport, transport.fetchTagList]);
148
+ yield put(setMediaTags(data));
149
+ }
150
+ function* fetchMediaList2({ config = {} }) {
151
+ const transport = getMediaTransport();
152
+ const state = yield select();
153
+ const setting = { ...state.config, ...config };
154
+ yield put(setLoading(true));
155
+ yield put(setLoading(false));
156
+ const data = yield call([transport, transport.fetchMediaList], setting);
157
+ const { items } = data;
158
+ const newItems = items.map((item) => {
159
+ const find = state.items.find((stateItem) => {
160
+ if (item.media_id === stateItem.media_id) {
161
+ return true;
162
+ }
163
+ return false;
164
+ });
165
+ if (find) {
166
+ return { ...item, checked: find.checked };
167
+ }
168
+ return item;
169
+ });
170
+ yield put(setMediaList(newItems));
171
+ yield put(setMediaLastPage(data.pageAmount));
172
+ yield put(setMediaTotal(data.total));
173
+ yield put(setMediaLargeSize(data.largeSize));
174
+ yield put(setMediaArchives(data.archives));
175
+ yield put(setMediaTags(data.tags));
176
+ yield put(setMediaExtensions(data.extensions));
177
+ if (config) {
178
+ yield put(setMediaConfig(config));
179
+ }
180
+ }
181
+ function* rootSaga() {
182
+ yield takeEvery(FETCHMEDIALIST, fetchMediaList2);
183
+ yield takeEvery(FETCHTAGLIST, fetchTagList2);
184
+ }
185
+
186
+ // src/components/media-modal/media-modal.tsx
187
+ import { Component as Component2, createRef } from "react";
188
+ import DOMPurify from "dompurify";
189
+ import { emit } from "@ablogcms/events";
190
+ import { pending } from "@ablogcms/pending";
191
+ import ResizeImage from "@ablogcms/lib/resize-image-util";
192
+ import { formatBytes, dataURItoBlob, triggerEvent } from "@ablogcms/utils";
193
+ import CopyToClipboard from "@ablogcms/components/copy-to-clipboard";
194
+ import { Tabs, TabPanel } from "@ablogcms/components/tabs";
195
+ import Modal2, { ModalBody as ModalBody2, ModalFooter as ModalFooter2, ModalHeader as ModalHeader2 } from "@ablogcms/components/modal";
196
+ import { Table, TableBody, TableRow, TableHead, TableCell } from "@ablogcms/components/table";
197
+ import { CreatableSelect } from "@ablogcms/components/rich-select";
198
+ import { HStack as HStack2 } from "@ablogcms/components/stack";
199
+ import VisuallyHidden from "@ablogcms/components/visually-hidden";
200
+ import { AutoResizeTextarea } from "@ablogcms/components/textarea";
201
+ import { Slot } from "@ablogcms/components/slot-fill";
202
+
203
+ // src/components/media-edit-modal/media-edit-modal.tsx
204
+ import { Component } from "react";
205
+ import { DndContext, getClientRect, useDraggable } from "@dnd-kit/core";
206
+ import { CSS } from "@dnd-kit/utilities";
207
+ import Cropper from "cropperjs";
208
+ import classnames from "classnames";
209
+ import { calcHeightFromRatio, calcVhToPx, calcWidthFromRatio } from "@ablogcms/utils";
210
+ import { DropZone } from "@ablogcms/components/drop-zone";
211
+ import Modal, { ModalBody, ModalFooter, ModalHeader } from "@ablogcms/components/modal";
212
+ import "cropperjs/dist/cropper.css";
213
+ import { HStack } from "@ablogcms/components/stack";
214
+
215
+ // src/assets/images/media-rotate-icon.svg
216
+ var media_rotate_icon_default = "./media-rotate-icon-HBMXAPD4.svg";
217
+
218
+ // src/assets/images/media-focal-point.svg
219
+ var media_focal_point_default = "./media-focal-point-OQQ3MQM2.svg";
220
+
221
+ // src/assets/images/media-crop-icon.svg
222
+ var media_crop_icon_default = "./media-crop-icon-LD2QEJHL.svg";
223
+
224
+ // src/assets/images/media-crop-focal.svg
225
+ var media_crop_focal_default = "./media-crop-focal-OQHAYXEP.svg";
226
+
227
+ // src/utils/index.ts
228
+ function getFocalPoint(media) {
229
+ return media.media_focal_point ? media.media_focal_point.split(",").map((str) => parseFloat(str)) : [50, 50];
230
+ }
231
+ function coordinatesToTransform(focalPointCoordinates, canvas) {
232
+ const { x, y } = focalPointCoordinates;
233
+ return {
234
+ x: x - canvas.width / 2,
235
+ y: y - canvas.height / 2,
236
+ scaleX: 1,
237
+ scaleY: 1
238
+ };
239
+ }
240
+ function focalPointToCoordinates(focalPoint, canvas) {
241
+ const [x, y] = focalPoint;
242
+ const percentX = x / 100;
243
+ const percentY = y / 100;
244
+ return {
245
+ x: canvas.width * percentX,
246
+ y: canvas.height * percentY
247
+ };
248
+ }
249
+
250
+ // src/components/media-edit-modal/media-edit-modal.tsx
251
+ import { jsx, jsxs } from "react/jsx-runtime";
252
+ var MAX_HEIGHT_VH = 55;
253
+ function restrictToBoundingRect(transform, rect, boundingRect) {
254
+ const value = {
255
+ ...transform
256
+ };
257
+ if (rect.top + transform.y <= boundingRect.top) {
258
+ value.y = boundingRect.top - rect.top;
259
+ } else if (rect.bottom + transform.y >= boundingRect.top + boundingRect.height) {
260
+ value.y = boundingRect.top + boundingRect.height - rect.bottom;
261
+ }
262
+ if (rect.left + transform.x <= boundingRect.left) {
263
+ value.x = boundingRect.left - rect.left;
264
+ } else if (rect.right + transform.x >= boundingRect.left + boundingRect.width) {
265
+ value.x = boundingRect.left + boundingRect.width - rect.right;
266
+ }
267
+ return value;
268
+ }
269
+ function DraggableFocalPoint({ children, focalPointTransform }) {
270
+ const { attributes, listeners, setNodeRef, transform } = useDraggable({
271
+ id: "focal-point"
272
+ });
273
+ const style = {
274
+ transform: CSS.Translate.toString(transform),
275
+ position: "absolute",
276
+ left: `calc(50% + ${focalPointTransform.x}px)`,
277
+ top: `calc(50% + ${focalPointTransform.y}px)`
278
+ };
279
+ return /* @__PURE__ */ jsx(
280
+ "button",
281
+ {
282
+ type: "button",
283
+ ref: setNodeRef,
284
+ className: "acms-admin-focal-point-btn",
285
+ style,
286
+ ...listeners,
287
+ ...attributes,
288
+ "aria-label": ACMS.i18n("media.focal_point_button_label"),
289
+ children
290
+ }
291
+ );
292
+ }
293
+ var MediaEditModal = class extends Component {
294
+ image;
295
+ cropper;
296
+ constructor(props) {
297
+ super(props);
298
+ this.state = {
299
+ blob: null,
300
+ upload: false,
301
+ cropWidth: 0,
302
+ cropHeight: 0,
303
+ zoom: 1,
304
+ ratio: 0,
305
+ src: "",
306
+ useFocalPoint: false,
307
+ focalPoint: props.focalPoint,
308
+ timeout: null,
309
+ isCropListOpen: false
310
+ };
311
+ this.cropper = null;
312
+ this.image = null;
313
+ }
314
+ componentWillUnmount() {
315
+ if (this.cropper) {
316
+ this.cropper.destroy();
317
+ }
318
+ }
319
+ setImageRef(node) {
320
+ this.image = node;
321
+ if (node !== null && this.cropper === null) {
322
+ this.cropper = new Cropper(node, {
323
+ autoCrop: false,
324
+ zoomable: false,
325
+ responsive: true,
326
+ viewMode: 2,
327
+ crop: (e) => {
328
+ const data = e.detail;
329
+ if (data.width || data.height) {
330
+ this.setState({
331
+ cropWidth: data.width,
332
+ cropHeight: data.height
333
+ });
334
+ } else {
335
+ this.setState({
336
+ cropWidth: 0,
337
+ cropHeight: 0
338
+ });
339
+ }
340
+ },
341
+ autoCropArea: 1,
342
+ dragMode: "none"
343
+ });
344
+ }
345
+ }
346
+ handleAfterOpen() {
347
+ const { focalPoint } = this.props;
348
+ this.setState({
349
+ focalPoint
350
+ // モーダルが開いた時に、親コンポーネントから渡された focalPoint を state にセット
351
+ });
352
+ }
353
+ handleAfterClose() {
354
+ if (this.cropper) {
355
+ this.cropper.destroy();
356
+ this.cropper = null;
357
+ }
358
+ this.setState({
359
+ cropWidth: 0,
360
+ cropHeight: 0,
361
+ ratio: 0,
362
+ useFocalPoint: false
363
+ });
364
+ }
365
+ onCancel() {
366
+ this.setState({
367
+ cropWidth: 0,
368
+ cropHeight: 0,
369
+ ratio: 0,
370
+ useFocalPoint: false,
371
+ focalPoint: this.props.focalPoint
372
+ });
373
+ this.props.onClose();
374
+ }
375
+ onCrop() {
376
+ if (!this.image) {
377
+ return;
378
+ }
379
+ if (!this.cropper) {
380
+ return;
381
+ }
382
+ let mimeType = "image/png";
383
+ if (this.image.src) {
384
+ const lastIndex = this.image.src.lastIndexOf("?");
385
+ const src = lastIndex === -1 ? this.image.src : this.image.src.substring(0, lastIndex);
386
+ if (src.slice(-3) !== "png") {
387
+ mimeType = "image/jpeg";
388
+ }
389
+ }
390
+ this.cropper.getCroppedCanvas().toBlob((blob) => {
391
+ const { focalPoint } = this.state;
392
+ this.props.onCrop(blob, focalPoint);
393
+ }, mimeType);
394
+ }
395
+ onUploadImg(files) {
396
+ if (!files.length) {
397
+ return;
398
+ }
399
+ if (files[0].filetype === "image") {
400
+ this.cropper?.replace(files[0].preview);
401
+ }
402
+ }
403
+ useOriginalImg() {
404
+ if (this.props.original) {
405
+ this.cropper?.replace(this.props.original);
406
+ }
407
+ }
408
+ changeAspectRatio(ratioProp) {
409
+ if (!this.cropper) {
410
+ return;
411
+ }
412
+ const { ratio } = this.state;
413
+ this.cropper.clear();
414
+ if (ratioProp === ratio || isNaN(ratioProp) && isNaN(ratio)) {
415
+ this.setState({
416
+ ratio: 0
417
+ });
418
+ return;
419
+ }
420
+ this.cropper.setAspectRatio(ratioProp);
421
+ this.cropper.crop();
422
+ this.setState({
423
+ ratio: ratioProp
424
+ });
425
+ }
426
+ rotate(rotate) {
427
+ if (!this.cropper) {
428
+ return;
429
+ }
430
+ const data = this.cropper.getCropBoxData();
431
+ const contData = this.cropper.getContainerData();
432
+ data.width = 2;
433
+ data.height = 2;
434
+ data.top = 0;
435
+ const leftNew = contData.width / 2 - 1;
436
+ data.left = leftNew;
437
+ this.cropper.setCropBoxData(data);
438
+ this.cropper.rotate(rotate);
439
+ const canvData = this.cropper.getCanvasData();
440
+ const heightOld = canvData.height;
441
+ const heightNew = heightOld > contData.height ? contData.height : heightOld;
442
+ const koef = heightNew / heightOld;
443
+ const widthNew = canvData.width * koef;
444
+ canvData.height = heightNew;
445
+ canvData.width = widthNew;
446
+ canvData.top = 0;
447
+ if (canvData.width >= contData.width) {
448
+ canvData.left = 0;
449
+ } else {
450
+ canvData.left = (contData.width - canvData.width) / 2;
451
+ }
452
+ if (canvData.height >= contData.height) {
453
+ canvData.top = 0;
454
+ } else {
455
+ canvData.top = (contData.height - canvData.height) / 2;
456
+ }
457
+ this.cropper.setCanvasData(canvData);
458
+ data.left = 0;
459
+ data.top = 0;
460
+ data.width = canvData.width;
461
+ data.height = canvData.height;
462
+ this.cropper.setCropBoxData(data);
463
+ }
464
+ toggleFocalPoint() {
465
+ const { useFocalPoint } = this.state;
466
+ this.setState({
467
+ useFocalPoint: !useFocalPoint
468
+ });
469
+ }
470
+ handleFocalDragEnd = (event) => {
471
+ if (!this.cropper) {
472
+ return;
473
+ }
474
+ const { delta } = event;
475
+ const canvas = this.cropper.getCanvasData();
476
+ const { width, height } = canvas;
477
+ const { focalPoint } = this.state;
478
+ const focalPointCoordinates = focalPointToCoordinates(focalPoint, canvas);
479
+ const x = (focalPointCoordinates.x + delta.x) / width * 100;
480
+ const y = (focalPointCoordinates.y + delta.y) / height * 100;
481
+ const percentX = Math.max(0, Math.min(100, x));
482
+ const percentY = Math.max(0, Math.min(100, y));
483
+ this.setState({
484
+ focalPoint: [percentX, percentY]
485
+ });
486
+ };
487
+ focalPointToTransform = (focalPoint) => {
488
+ if (!this.cropper) {
489
+ return { x: 0, y: 0, scaleX: 1, scaleY: 1 };
490
+ }
491
+ const canvas = this.cropper.getCanvasData();
492
+ const coordinates = focalPointToCoordinates(focalPoint, canvas);
493
+ const transform = coordinatesToTransform(coordinates, canvas);
494
+ return transform;
495
+ };
496
+ hoverOnCropList = () => {
497
+ if (this.state.timeout) {
498
+ clearTimeout(this.state.timeout);
499
+ }
500
+ this.setState({
501
+ isCropListOpen: true
502
+ });
503
+ };
504
+ leaveFromCropList = () => {
505
+ const timeout = setTimeout(() => {
506
+ this.setState({
507
+ isCropListOpen: false
508
+ });
509
+ }, 500);
510
+ this.setState({
511
+ timeout
512
+ });
513
+ };
514
+ toggleCropList = (e) => {
515
+ e.preventDefault();
516
+ const { isCropListOpen } = this.state;
517
+ this.setState({
518
+ isCropListOpen: !isCropListOpen
519
+ });
520
+ };
521
+ restrictToCanvas = ({ draggingNodeRect, transform }) => {
522
+ if (!this.cropper) {
523
+ return transform;
524
+ }
525
+ if (!draggingNodeRect) {
526
+ return transform;
527
+ }
528
+ const canvasRect = getClientRect(this.cropper.canvas);
529
+ const width = canvasRect.width + draggingNodeRect.width;
530
+ const height = canvasRect.height + draggingNodeRect.height;
531
+ const left = canvasRect.left - draggingNodeRect.width / 2;
532
+ const right = canvasRect.right + draggingNodeRect.width / 2;
533
+ const top = canvasRect.top - draggingNodeRect.height / 2;
534
+ const bottom = canvasRect.bottom + draggingNodeRect.height / 2;
535
+ const restrictedCanvasRect = {
536
+ width,
537
+ height,
538
+ left,
539
+ right,
540
+ top,
541
+ bottom
542
+ };
543
+ return restrictToBoundingRect(transform, draggingNodeRect, restrictedCanvasRect);
544
+ };
545
+ getImgWidth(width, height) {
546
+ const ratio = width / height;
547
+ const heightVh = calcVhToPx(MAX_HEIGHT_VH);
548
+ const imageWidth = calcWidthFromRatio(ratio, Math.min(heightVh, height));
549
+ const imageHeight = calcHeightFromRatio(ratio, imageWidth);
550
+ return `${Math.max(imageWidth, imageHeight)}px`;
551
+ }
552
+ render() {
553
+ const { cropWidth, cropHeight, ratio, useFocalPoint, isCropListOpen, focalPoint } = this.state;
554
+ const { src, original, mediaCropSizes, title, width, height, isOpen, container } = this.props;
555
+ return /* @__PURE__ */ jsxs(
556
+ Modal,
557
+ {
558
+ className: "acms-admin-media-edit-modal",
559
+ isOpen,
560
+ onClose: this.onCancel.bind(this),
561
+ size: "large",
562
+ container,
563
+ onAfterOpen: this.handleAfterOpen.bind(this),
564
+ onAfterClose: this.handleAfterClose.bind(this),
565
+ "aria-labelledby": "acms-media-edit-modal-title",
566
+ children: [
567
+ /* @__PURE__ */ jsx(ModalHeader, { children: `${ACMS.i18n("media.edit_image")}${title ? ` - ${title}` : ""}` }),
568
+ /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs("div", { children: [
569
+ /* @__PURE__ */ jsx(DropZone, { onComplete: this.onUploadImg.bind(this), children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs("div", { className: "acms-admin-cropper-container", children: [
570
+ cropWidth > 0 && cropHeight > 0 && /* @__PURE__ */ jsxs("div", { className: "acms-admin-cropper-crop-info", children: [
571
+ /* @__PURE__ */ jsx("img", { src: media_crop_icon_default, className: "acms-admin-cropper-crop-info-img", alt: "" }),
572
+ /* @__PURE__ */ jsx("input", { type: "text", className: "acms-admin-cropper-crop-info-input", value: cropWidth, readOnly: true }),
573
+ /* @__PURE__ */ jsx("span", { className: "acms-admin-cropper-crop-info-text", children: "\xD7" }),
574
+ /* @__PURE__ */ jsx("input", { type: "text", className: "acms-admin-cropper-crop-info-input", value: cropHeight, readOnly: true })
575
+ ] }),
576
+ /* @__PURE__ */ jsx("div", { className: "acms-admin-cropper-wrap", children: /* @__PURE__ */ jsxs(
577
+ "div",
578
+ {
579
+ className: "acms-admin-cropper-img-container",
580
+ style: { maxWidth: this.getImgWidth(width, height) },
581
+ children: [
582
+ /* @__PURE__ */ jsx("img", { src, ref: this.setImageRef.bind(this), className: "acms-admin-img-responsive", alt: "" }),
583
+ useFocalPoint && /* @__PURE__ */ jsx(DndContext, { onDragEnd: this.handleFocalDragEnd.bind(this), modifiers: [this.restrictToCanvas], children: /* @__PURE__ */ jsx(DraggableFocalPoint, { focalPointTransform: this.focalPointToTransform(focalPoint), children: /* @__PURE__ */ jsx(
584
+ "span",
585
+ {
586
+ className: "acms-admin-cropper-focal-point",
587
+ style: { backgroundImage: `url(${media_crop_focal_default})` },
588
+ "aria-hidden": true
589
+ }
590
+ ) }) })
591
+ ]
592
+ }
593
+ ) })
594
+ ] }) }) }),
595
+ /* @__PURE__ */ jsx("div", { className: "acms-admin-form acms-admin-cropper-bottom", children: /* @__PURE__ */ jsx("div", { className: "acms-admin-cropper-group-wrap", children: /* @__PURE__ */ jsxs("div", { className: "acms-admin-cropper-group", children: [
596
+ /* @__PURE__ */ jsxs("div", { className: "acms-admin-cropper-crop-list-wrap", children: [
597
+ /* @__PURE__ */ jsxs(
598
+ "button",
599
+ {
600
+ type: "button",
601
+ className: "acms-admin-cropper-btn",
602
+ onMouseOver: this.hoverOnCropList,
603
+ onMouseLeave: this.leaveFromCropList,
604
+ onFocus: this.hoverOnCropList,
605
+ onBlur: this.leaveFromCropList,
606
+ onClick: this.toggleCropList,
607
+ children: [
608
+ /* @__PURE__ */ jsx("img", { src: media_crop_icon_default, className: "acms-admin-cropper-icon", alt: "" }),
609
+ /* @__PURE__ */ jsx("span", { className: "acms-admin-cropper-btn-txt", children: ACMS.i18n("media.crop") })
610
+ ]
611
+ }
612
+ ),
613
+ isCropListOpen && /* @__PURE__ */ jsxs(
614
+ "div",
615
+ {
616
+ className: "acms-admin-cropper-crop-list",
617
+ onMouseOver: this.hoverOnCropList,
618
+ onMouseLeave: this.leaveFromCropList,
619
+ onFocus: this.hoverOnCropList,
620
+ onBlur: this.leaveFromCropList,
621
+ children: [
622
+ /* @__PURE__ */ jsx(
623
+ "button",
624
+ {
625
+ type: "button",
626
+ className: classnames("acms-admin-cropper-list-btn", {
627
+ active: isNaN(ratio)
628
+ }),
629
+ onClick: (e) => {
630
+ e.preventDefault();
631
+ this.changeAspectRatio(NaN);
632
+ this.setState({
633
+ isCropListOpen: false
634
+ });
635
+ },
636
+ children: ACMS.i18n("media.custom")
637
+ }
638
+ ),
639
+ mediaCropSizes.map((size) => /* @__PURE__ */ jsx(
640
+ "button",
641
+ {
642
+ type: "button",
643
+ className: classnames("acms-admin-cropper-list-btn", {
644
+ active: ratio === size[0] / size[1]
645
+ }),
646
+ onClick: (e) => {
647
+ e.preventDefault();
648
+ this.changeAspectRatio(size[0] / size[1]);
649
+ this.setState({
650
+ isCropListOpen: false
651
+ });
652
+ },
653
+ children: `${size[0]} / ${size[1]}`
654
+ },
655
+ size.join("x")
656
+ ))
657
+ ]
658
+ }
659
+ )
660
+ ] }),
661
+ /* @__PURE__ */ jsxs(
662
+ "button",
663
+ {
664
+ type: "button",
665
+ className: "acms-admin-cropper-btn",
666
+ onClick: (e) => {
667
+ e.preventDefault();
668
+ this.rotate(90);
669
+ },
670
+ children: [
671
+ /* @__PURE__ */ jsx("img", { src: media_rotate_icon_default, className: "acms-admin-cropper-icon", alt: "" }),
672
+ /* @__PURE__ */ jsx("span", { className: "acms-admin-cropper-btn-txt", children: ACMS.i18n("media.rotate") })
673
+ ]
674
+ }
675
+ ),
676
+ /* @__PURE__ */ jsxs(
677
+ "button",
678
+ {
679
+ type: "button",
680
+ className: classnames("acms-admin-cropper-btn", {
681
+ active: useFocalPoint
682
+ }),
683
+ onClick: (e) => {
684
+ e.preventDefault();
685
+ this.toggleFocalPoint();
686
+ },
687
+ children: [
688
+ /* @__PURE__ */ jsx("img", { src: media_focal_point_default, className: "acms-admin-cropper-icon", alt: "" }),
689
+ /* @__PURE__ */ jsx("span", { className: "acms-admin-cropper-btn-txt", children: ACMS.i18n("media.focal_point") })
690
+ ]
691
+ }
692
+ )
693
+ ] }) }) })
694
+ ] }) }),
695
+ /* @__PURE__ */ jsx(ModalFooter, { children: /* @__PURE__ */ jsxs(HStack, { display: "inline-flex", children: [
696
+ original && /* @__PURE__ */ jsx(
697
+ "button",
698
+ {
699
+ type: "button",
700
+ className: "acms-admin-btn acms-admin-btn-text",
701
+ onClick: this.useOriginalImg.bind(this),
702
+ children: ACMS.i18n("media.initialize")
703
+ }
704
+ ),
705
+ /* @__PURE__ */ jsx("button", { type: "button", className: "acms-admin-btn", onClick: this.onCancel.bind(this), children: ACMS.i18n("media.cancel") }),
706
+ /* @__PURE__ */ jsx("button", { type: "button", className: "acms-admin-btn acms-admin-btn-info", onClick: this.onCrop.bind(this), children: ACMS.i18n("media.apply") })
707
+ ] }) })
708
+ ]
709
+ }
710
+ );
711
+ }
712
+ };
713
+
714
+ // src/components/media-modal/pdf-previewer.ts
715
+ var Pdf2ImageClass;
716
+ var instanceByUrl = /* @__PURE__ */ new Map();
717
+ var inflightByKey = /* @__PURE__ */ new Map();
718
+ var resultCacheByKey = /* @__PURE__ */ new Map();
719
+ var keyOf = (url, page) => `${url}|${page}`;
720
+ async function getInstance(url) {
721
+ if (!Pdf2ImageClass) {
722
+ const { default: pdf2image } = await import(
723
+ /* webpackChunkName: "pdf2image" */
724
+ "@ablogcms/lib/pdf2image"
725
+ );
726
+ Pdf2ImageClass = pdf2image;
727
+ }
728
+ let inst = instanceByUrl.get(url);
729
+ if (!inst) {
730
+ inst = new Pdf2ImageClass(url);
731
+ instanceByUrl.set(url, inst);
732
+ }
733
+ return inst;
734
+ }
735
+ async function fetchPdfPage(url, page) {
736
+ const key = keyOf(url, page);
737
+ const cached = resultCacheByKey.get(key);
738
+ if (cached) return cached;
739
+ const running = inflightByKey.get(key);
740
+ if (running) return running;
741
+ const p = (async () => {
742
+ const inst = await getInstance(url);
743
+ const image = await inst.getPageImage(page);
744
+ const [hasPrev, hasNext] = await Promise.all([inst.hasPrevPage(), inst.hasNextPage()]);
745
+ const res = {
746
+ image,
747
+ hasPrev,
748
+ hasNext,
749
+ currentPage: inst.currentPage
750
+ };
751
+ if (image !== false) {
752
+ resultCacheByKey.set(key, res);
753
+ }
754
+ return res;
755
+ })();
756
+ inflightByKey.set(key, p);
757
+ try {
758
+ return await p;
759
+ } finally {
760
+ inflightByKey.delete(key);
761
+ }
762
+ }
763
+
764
+ // src/components/media-modal/media-modal.tsx
765
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
766
+ var delimiter = ",";
767
+ var resizeImage = new ResizeImage();
768
+ var MediaModal = class extends Component2 {
769
+ form;
770
+ filenameInputRef;
771
+ tagsInputRef;
772
+ altTextareaRef;
773
+ modalRef;
774
+ root;
775
+ static defaultProps = {
776
+ tags: []
777
+ };
778
+ constructor(props) {
779
+ super(props);
780
+ this.state = {
781
+ isEditDialogOpen: false,
782
+ file: null,
783
+ blob: null,
784
+ preview: props.item ? this.getDefaultPreview(props.item) : "",
785
+ replaced: false,
786
+ pdfPreviewSrc: "",
787
+ pdfHasPrevPage: false,
788
+ pdfHasNextPage: false,
789
+ pdfPage: props.item?.media_pdf_page ? parseInt(props.item.media_pdf_page, 10) : 1,
790
+ focalPoint: props.item ? getFocalPoint(props.item) : [50, 50],
791
+ activeTab: "edit"
792
+ };
793
+ this.root = document.createElement("div");
794
+ this.form = null;
795
+ this.modalRef = createRef();
796
+ this.filenameInputRef = createRef();
797
+ this.tagsInputRef = createRef();
798
+ this.altTextareaRef = createRef();
799
+ }
800
+ componentDidMount() {
801
+ (this.props.container || document.body).appendChild(this.root);
802
+ }
803
+ getDefaultPreview(item) {
804
+ if (item.media_type === "file") {
805
+ return item.media_thumbnail;
806
+ }
807
+ return `${item.media_edited}?date=${item.media_last_modified}`;
808
+ }
809
+ handleAfterClose() {
810
+ this.props.actions.setItem(null);
811
+ const { onAfterClose } = this.props;
812
+ if (onAfterClose) {
813
+ onAfterClose();
814
+ }
815
+ }
816
+ handleAfterOpen() {
817
+ const { onAfterOpen, item } = this.props;
818
+ if (item !== null) {
819
+ this.setState({
820
+ focalPoint: getFocalPoint(item),
821
+ pdfPage: parseInt(item.media_pdf_page, 10) || 1
822
+ });
823
+ }
824
+ if (onAfterOpen) {
825
+ onAfterOpen();
826
+ }
827
+ }
828
+ componentDidUpdate(prevProps) {
829
+ const { item } = this.props;
830
+ if (prevProps.item !== item && item !== null) {
831
+ if (item.media_ext.toLowerCase() === "pdf") {
832
+ this.pdfPreview(item.media_permalink, parseInt(item.media_pdf_page, 10) || 1);
833
+ } else {
834
+ this.setState({
835
+ preview: this.getDefaultPreview(item)
836
+ });
837
+ }
838
+ this.setState({
839
+ focalPoint: getFocalPoint(item),
840
+ pdfPage: parseInt(item.media_pdf_page, 10) || 1
841
+ });
842
+ }
843
+ }
844
+ setFormRef(node) {
845
+ this.form = node;
846
+ }
847
+ componentWillUnmount() {
848
+ this.root.parentElement?.removeChild(this.root);
849
+ }
850
+ async pdfPreview(url, page) {
851
+ const res = await fetchPdfPage(url, page);
852
+ if (res.image !== false) {
853
+ this.setState({
854
+ pdfPreviewSrc: res.image,
855
+ pdfHasPrevPage: res.hasPrev,
856
+ pdfHasNextPage: res.hasNext,
857
+ pdfPage: res.currentPage
858
+ });
859
+ }
860
+ }
861
+ async pdfPrevPage(e) {
862
+ e.preventDefault();
863
+ const { item } = this.props;
864
+ if (!item) return;
865
+ const url = item.media_permalink;
866
+ const prevPage = Math.max(1, (this.state.pdfPage || 1) - 1);
867
+ await this.pdfPreview(url, prevPage);
868
+ }
869
+ async pdfNextPage(e) {
870
+ e.preventDefault();
871
+ const { item } = this.props;
872
+ if (!item) return;
873
+ const url = item.media_permalink;
874
+ const nextPage = (this.state.pdfPage || 1) + 1;
875
+ await this.pdfPreview(url, nextPage);
876
+ }
877
+ hideModal() {
878
+ if ("history" in window) {
879
+ history.replaceState(null, "", "#");
880
+ }
881
+ if (this.props.onClose) {
882
+ this.props.onClose();
883
+ }
884
+ }
885
+ handleClose() {
886
+ this.hideModal();
887
+ }
888
+ isImageMedia(state, props) {
889
+ if (state.blob && state.blob.type.match(/image/)) {
890
+ return true;
891
+ }
892
+ if (!state.replaced && props.item?.media_type === "image") {
893
+ return true;
894
+ }
895
+ return false;
896
+ }
897
+ isSvgMedia(state, props) {
898
+ if (state.file && state.file.type === "image/svg+xml") {
899
+ return true;
900
+ }
901
+ if (!state.replaced && props.item?.media_type === "svg") {
902
+ return true;
903
+ }
904
+ return false;
905
+ }
906
+ isFileMedia(state, props) {
907
+ if (state.file && state.file.type !== "image/svg+xml") {
908
+ return true;
909
+ }
910
+ if (!state.replaced && props.item?.media_type === "file") {
911
+ return true;
912
+ }
913
+ return false;
914
+ }
915
+ isPdfFile(state, props) {
916
+ if (state.file && state.file.type === "application/pdf") {
917
+ return true;
918
+ }
919
+ if (!state.replaced && props.item?.media_type === "file" && props.item.media_ext.toLowerCase() === "pdf") {
920
+ return true;
921
+ }
922
+ return false;
923
+ }
924
+ buildFormData(postName) {
925
+ const { blob, file, focalPoint, replaced, pdfPreviewSrc } = this.state;
926
+ const formData = new FormData(this.form);
927
+ if (blob) {
928
+ formData.append("media_file", blob);
929
+ } else if (file) {
930
+ formData.append("media_file", file);
931
+ }
932
+ if (Array.isArray(focalPoint) && focalPoint.length > 0) {
933
+ formData.append("media[]", "focal_x");
934
+ formData.append("media[]", "focal_y");
935
+ formData.append("focal_x", `${focalPoint[0]}`);
936
+ formData.append("focal_y", `${focalPoint[1]}`);
937
+ }
938
+ if (replaced) {
939
+ formData.append("media[]", "replaced");
940
+ formData.append("replaced", "true");
941
+ }
942
+ if (this.isFileMedia(this.state, this.props) && this.isPdfFile(this.state, this.props) && pdfPreviewSrc) {
943
+ formData.append("media_pdf_thumbnail", dataURItoBlob(pdfPreviewSrc));
944
+ formData.append("media[]", "pdf_page");
945
+ formData.append("pdf_page", String(this.state.pdfPage || 1));
946
+ }
947
+ formData.append(postName, "true");
948
+ formData.append("formToken", window.csrfToken);
949
+ return formData;
950
+ }
951
+ updateStateOnAfterSave(mediaItem) {
952
+ this.setState({
953
+ file: null,
954
+ // メディアを更新した場合はファイルをリセット。リセットしないと再度保存時にメディアを変更していない場合でもファイルが変更されるというアラートが出てしまう。
955
+ blob: null,
956
+ // メディアを更新した場合はファイルをリセット。リセットしないと再度保存時にメディアを変更していない場合でもファイルが変更されるというアラートが出てしまう。
957
+ replaced: false,
958
+ focalPoint: getFocalPoint(mediaItem),
959
+ // ローカルで保持している焦点座標の状態を更新(再度モーダルを開いたときに更新を反映するため)
960
+ pdfPage: parseInt(mediaItem.media_pdf_page, 10) || 1
961
+ // ローカルで保持しているPDFページの状態を更新(再度モーダルを開いたときに更新を反映するため)
962
+ });
963
+ }
964
+ async update(item) {
965
+ const { actions } = this.props;
966
+ const { file, blob } = this.state;
967
+ const formData = this.buildFormData("ACMS_POST_Media_Update");
968
+ if (file || blob) {
969
+ const msg = file ? ACMS.i18n("media.file_changed") : ACMS.i18n("media.img_changed");
970
+ if (!confirm(msg)) {
971
+ return;
972
+ }
973
+ }
974
+ const gateResult = await emit("media.update.before", { item, formData });
975
+ if (gateResult.canceled) {
976
+ if (gateResult.reason) {
977
+ alert(gateResult.reason);
978
+ }
979
+ return;
980
+ }
981
+ const end = pending.splash(ACMS.i18n("media.saving"));
982
+ getMediaTransport().updateMedia(item.media_id, gateResult.event.formData).then((res) => {
983
+ end();
984
+ if ("status" in res && res.status === "failure") {
985
+ if (res.message) {
986
+ alert(res.message);
987
+ } else {
988
+ alert(ACMS.i18n("media.cannot_edit"));
989
+ }
990
+ return;
991
+ }
992
+ actions.updateMediaList(res);
993
+ if (this.props.onUpdate) {
994
+ this.props.onUpdate(res);
995
+ }
996
+ void emit("media.update.success", { item: res });
997
+ triggerEvent(document, "acms.media-updated", {
998
+ detail: { data: res },
999
+ bubbles: true
1000
+ });
1001
+ this.hideModal();
1002
+ this.updateStateOnAfterSave(res);
1003
+ });
1004
+ }
1005
+ async uploadAsNew(item) {
1006
+ const { actions } = this.props;
1007
+ const formData = this.buildFormData("ACMS_POST_Media_UpdateAsNew");
1008
+ const gateResult = await emit("media.update-as-new.before", { item, formData });
1009
+ if (gateResult.canceled) {
1010
+ if (gateResult.reason) {
1011
+ alert(gateResult.reason);
1012
+ }
1013
+ return;
1014
+ }
1015
+ const end = pending.splash(ACMS.i18n("media.saving"));
1016
+ getMediaTransport().updateMediaAsNew(item.media_id, gateResult.event.formData).then((res) => {
1017
+ end();
1018
+ if ("status" in res && res.status === "failure") {
1019
+ if (res.message) {
1020
+ alert(res.message);
1021
+ } else {
1022
+ alert(ACMS.i18n("media.cannot_edit"));
1023
+ }
1024
+ return;
1025
+ }
1026
+ actions.fetchMediaList();
1027
+ if (this.props.onUpdate) {
1028
+ this.props.onUpdate(res);
1029
+ }
1030
+ void emit("media.update-as-new.success", { item: res });
1031
+ this.hideModal();
1032
+ this.updateStateOnAfterSave(res);
1033
+ });
1034
+ }
1035
+ makeTags(label) {
1036
+ if (!label) {
1037
+ return null;
1038
+ }
1039
+ const labels = label.split(delimiter);
1040
+ return labels.map((label2) => ({
1041
+ value: label2,
1042
+ label: label2
1043
+ }));
1044
+ }
1045
+ handleTagsChange(tags) {
1046
+ const value = tags.reduce((val, tag, idx) => {
1047
+ if (idx === 0) {
1048
+ return tag.value;
1049
+ }
1050
+ return `${val}${delimiter}${tag.value}`;
1051
+ }, "");
1052
+ if (this.tagsInputRef.current) {
1053
+ this.tagsInputRef.current.value = value;
1054
+ }
1055
+ }
1056
+ openEditDialog() {
1057
+ this.setState({
1058
+ isEditDialogOpen: true
1059
+ });
1060
+ }
1061
+ blobToDataURL(blob) {
1062
+ return new Promise((resolve, reject) => {
1063
+ const fr = new FileReader();
1064
+ fr.onload = (e) => {
1065
+ if (!(e.target instanceof FileReader)) {
1066
+ reject(new Error("Failed to load blob"));
1067
+ return;
1068
+ }
1069
+ resolve(e.target.result);
1070
+ };
1071
+ fr.readAsDataURL(blob);
1072
+ });
1073
+ }
1074
+ handleEditDialogClose() {
1075
+ this.setState({
1076
+ isEditDialogOpen: false
1077
+ });
1078
+ }
1079
+ handleCrop(blob, focalPoint) {
1080
+ if (blob) {
1081
+ this.blobToDataURL(blob).then((preview) => {
1082
+ if (focalPoint) {
1083
+ this.setState({
1084
+ preview,
1085
+ blob,
1086
+ focalPoint
1087
+ });
1088
+ } else {
1089
+ this.setState({
1090
+ preview,
1091
+ blob
1092
+ });
1093
+ }
1094
+ });
1095
+ }
1096
+ this.setState({
1097
+ isEditDialogOpen: false
1098
+ });
1099
+ }
1100
+ async changeImage(e) {
1101
+ if (!(e.target instanceof HTMLInputElement)) {
1102
+ return;
1103
+ }
1104
+ if (!e.target.files) {
1105
+ return;
1106
+ }
1107
+ const { item } = this.props;
1108
+ if (item === null) {
1109
+ return;
1110
+ }
1111
+ const file = e.target.files[0];
1112
+ const type = file.type.match(/svg/) ? "svg" : file.type.match(/image/) ? "image" : "file";
1113
+ const isHeic = /(heic|heif)/i.test(file.type);
1114
+ if (item.media_type !== type) {
1115
+ alert(ACMS.i18n("media.cannnot_change_type"));
1116
+ return false;
1117
+ }
1118
+ const nextState = {
1119
+ replaced: true
1120
+ };
1121
+ if (type === "image") {
1122
+ if (isHeic) {
1123
+ const { heicTo } = await import(
1124
+ /* webpackChunkName: "heic-to" */
1125
+ "heic-to"
1126
+ );
1127
+ const result = await heicTo({
1128
+ blob: file,
1129
+ type: "image/jpeg"
1130
+ });
1131
+ const blob = Array.isArray(result) ? result[0] : result;
1132
+ if (!(blob instanceof Blob)) {
1133
+ throw new Error("Invalid blob result from heicTo");
1134
+ }
1135
+ const preview = await this.blobToDataURL(blob);
1136
+ nextState.preview = preview;
1137
+ nextState.blob = blob;
1138
+ } else {
1139
+ const [resizeType, largeSize] = ACMS.Config.lgImg.split(":");
1140
+ const { blob, resize } = await resizeImage.getBlobFromFile(file, resizeType, parseInt(largeSize, 10));
1141
+ const preview = await this.blobToDataURL(blob);
1142
+ nextState.preview = preview;
1143
+ if (resize === false || ACMS.Config.mediaClientResize !== "on") {
1144
+ nextState.blob = file;
1145
+ } else {
1146
+ nextState.blob = blob;
1147
+ }
1148
+ }
1149
+ } else if (type === "svg") {
1150
+ const textData = await file.text();
1151
+ const clean = DOMPurify.sanitize(textData, { USE_PROFILES: { svg: true, svgFilters: true } });
1152
+ const reBlob = new Blob([clean], { type: "image/svg+xml" });
1153
+ nextState.file = new File([reBlob], file.name, { type: reBlob.type });
1154
+ nextState.preview = await this.blobToDataURL(nextState.file);
1155
+ } else if (type === "file") {
1156
+ nextState.file = file;
1157
+ if (file.type === "application/pdf") {
1158
+ const url = URL.createObjectURL(file);
1159
+ this.pdfPreview(url, 1);
1160
+ } else {
1161
+ nextState.preview = `${ACMS.Config.root}themes/system/images/fileicon/document.svg`;
1162
+ }
1163
+ }
1164
+ if (this.filenameInputRef.current) {
1165
+ this.filenameInputRef.current.value = file.name;
1166
+ }
1167
+ this.setState(nextState);
1168
+ }
1169
+ imageWidth(size) {
1170
+ const [width] = size.split(" x ");
1171
+ return parseInt(width, 10);
1172
+ }
1173
+ imageHeight(size) {
1174
+ const [, height] = size.split(" x ");
1175
+ return parseInt(height, 10);
1176
+ }
1177
+ render() {
1178
+ const { item, formToken, tags, isOpen } = this.props;
1179
+ const { isEditDialogOpen, preview, pdfHasPrevPage, pdfHasNextPage, pdfPreviewSrc, focalPoint } = this.state;
1180
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
1181
+ /* @__PURE__ */ jsxs2(
1182
+ Modal2,
1183
+ {
1184
+ ref: this.modalRef,
1185
+ isOpen,
1186
+ onClose: this.handleClose.bind(this),
1187
+ size: "large",
1188
+ container: this.root,
1189
+ onAfterClose: this.handleAfterClose.bind(this),
1190
+ onAfterOpen: this.handleAfterOpen.bind(this),
1191
+ "aria-labelledby": "acms-media-modal-title",
1192
+ children: [
1193
+ /* @__PURE__ */ jsx2(ModalHeader2, { children: ACMS.i18n("media.media_edit") }),
1194
+ /* @__PURE__ */ jsx2(ModalBody2, { children: item && /* @__PURE__ */ jsxs2("form", { className: "acms-admin-form", ref: this.setFormRef.bind(this), children: [
1195
+ /* @__PURE__ */ jsxs2("div", { className: "acms-admin-media-modal-layout", children: [
1196
+ /* @__PURE__ */ jsxs2("div", { className: "acms-admin-media-modal-preview", children: [
1197
+ this.isImageMedia(this.state, this.props) && /* @__PURE__ */ jsxs2("div", { className: "acms-admin-media-thumb-container acms-admin-margin-bottom-small", children: [
1198
+ item.media_ext !== "svg" && /* @__PURE__ */ jsx2(
1199
+ "button",
1200
+ {
1201
+ className: "acms-admin-media-edit-btn acms-admin-media-edit-thumb-btn",
1202
+ type: "button",
1203
+ onClick: this.openEditDialog.bind(this),
1204
+ children: ACMS.i18n("media.edit")
1205
+ }
1206
+ ),
1207
+ /* @__PURE__ */ jsx2("div", { style: { backgroundImage: `url("${preview}")` }, className: "acms-admin-media-thumb" })
1208
+ ] }),
1209
+ this.isSvgMedia(this.state, this.props) && /* @__PURE__ */ jsx2("div", { className: "acms-admin-media-thumb-container acms-admin-margin-bottom-small acms-admin-media-thumb-container-assets", children: /* @__PURE__ */ jsx2("div", { className: "acms-admin-media-thumb-assets", style: { width: "80%" }, children: /* @__PURE__ */ jsx2(
1210
+ "img",
1211
+ {
1212
+ src: preview,
1213
+ style: {
1214
+ margin: "auto",
1215
+ display: "block",
1216
+ width: "auto",
1217
+ maxWidth: "100%",
1218
+ objectFit: "contain"
1219
+ },
1220
+ alt: ""
1221
+ }
1222
+ ) }) }),
1223
+ this.isFileMedia(this.state, this.props) && (this.isPdfFile(this.state, this.props) ? /* @__PURE__ */ jsxs2("div", { className: "acms-admin-media-thumb-container acms-admin-margin-bottom-small acms-admin-media-thumb-container-assets", children: [
1224
+ /* @__PURE__ */ jsx2("div", { className: "acms-admin-media-thumb-assets", style: { width: "70%" }, children: /* @__PURE__ */ jsx2(
1225
+ "img",
1226
+ {
1227
+ src: pdfPreviewSrc,
1228
+ className: "acms-admin-media-thumb-box",
1229
+ style: {
1230
+ margin: "auto",
1231
+ display: "block",
1232
+ width: "auto",
1233
+ maxWidth: "100%",
1234
+ objectFit: "contain"
1235
+ },
1236
+ alt: ""
1237
+ }
1238
+ ) }),
1239
+ /* @__PURE__ */ jsxs2("div", { style: { marginTop: "5px" }, className: "acms-admin-media-thumb-pager", children: [
1240
+ pdfHasPrevPage && /* @__PURE__ */ jsxs2(
1241
+ "button",
1242
+ {
1243
+ type: "button",
1244
+ className: "acms-admin-media-thumb-pager-arrow acms-admin-media-thumb-pager-arrow-left",
1245
+ onClick: this.pdfPrevPage.bind(this),
1246
+ children: [
1247
+ /* @__PURE__ */ jsx2("span", { className: "acms-admin-icon-arrow-small-left" }),
1248
+ /* @__PURE__ */ jsx2(VisuallyHidden, { children: "\u524D\u30DA\u30FC\u30B8" })
1249
+ ]
1250
+ }
1251
+ ),
1252
+ pdfHasNextPage && /* @__PURE__ */ jsxs2(
1253
+ "button",
1254
+ {
1255
+ type: "button",
1256
+ className: "acms-admin-media-thumb-pager-arrow acms-admin-media-thumb-pager-arrow-right",
1257
+ onClick: this.pdfNextPage.bind(this),
1258
+ children: [
1259
+ /* @__PURE__ */ jsx2("span", { className: "acms-admin-icon-arrow-small-right" }),
1260
+ /* @__PURE__ */ jsx2(VisuallyHidden, { children: "\u6B21\u30DA\u30FC\u30B8" })
1261
+ ]
1262
+ }
1263
+ )
1264
+ ] })
1265
+ ] }) : /* @__PURE__ */ jsx2("div", { className: "acms-admin-media-thumb-container acms-admin-margin-bottom-small acms-admin-media-thumb-container-assets", children: /* @__PURE__ */ jsx2("div", { className: "acms-admin-media-thumb-assets", style: { width: "70%" }, children: /* @__PURE__ */ jsx2(
1266
+ "img",
1267
+ {
1268
+ className: "acms-admin-media-thumb-box",
1269
+ src: preview,
1270
+ style: { margin: "auto", display: "block", width: "70px" },
1271
+ alt: ""
1272
+ }
1273
+ ) }) }))
1274
+ ] }),
1275
+ /* @__PURE__ */ jsxs2("div", { className: "acms-admin-media-modal-info", children: [
1276
+ /* @__PURE__ */ jsxs2(Tabs, { children: [
1277
+ /* @__PURE__ */ jsxs2(TabPanel, { label: ACMS.i18n("media.edit"), id: "media-edit", children: [
1278
+ /* @__PURE__ */ jsx2(Table, { variant: "unstyled", className: "acms-admin-media-table-edit", children: /* @__PURE__ */ jsxs2(TableBody, { children: [
1279
+ /* @__PURE__ */ jsxs2(TableRow, { children: [
1280
+ /* @__PURE__ */ jsxs2(TableHead, { children: [
1281
+ ACMS.i18n("media.media_change"),
1282
+ /* @__PURE__ */ jsx2(
1283
+ "i",
1284
+ {
1285
+ className: "acms-admin-icon-tooltip acms-admin-margin-left-mini js-acms-tooltip-hover",
1286
+ "data-acms-position": "top",
1287
+ "data-acms-tooltip": ACMS.i18n("media.managed_media_change")
1288
+ }
1289
+ )
1290
+ ] }),
1291
+ /* @__PURE__ */ jsx2(TableCell, { children: /* @__PURE__ */ jsx2("label", { "aria-label": ACMS.i18n("media.managed_media_change"), children: /* @__PURE__ */ jsx2("input", { type: "file", onChange: this.changeImage.bind(this) }) }) })
1292
+ ] }),
1293
+ item.media_type === "file" && /* @__PURE__ */ jsxs2(TableRow, { children: [
1294
+ /* @__PURE__ */ jsxs2(TableHead, { nowrap: true, children: [
1295
+ ACMS.i18n("media.status"),
1296
+ /* @__PURE__ */ jsx2(
1297
+ "i",
1298
+ {
1299
+ className: "acms-admin-icon-tooltip js-acms-tooltip-hover",
1300
+ "data-acms-position": "top",
1301
+ "data-acms-tooltip": ACMS.i18n("media.status_settings")
1302
+ }
1303
+ )
1304
+ ] }),
1305
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1306
+ /* @__PURE__ */ jsxs2(
1307
+ "select",
1308
+ {
1309
+ name: "status",
1310
+ defaultValue: item.media_status,
1311
+ style: {
1312
+ maxWidth: "max-content",
1313
+ width: "100%"
1314
+ },
1315
+ children: [
1316
+ /* @__PURE__ */ jsx2("option", { value: "entry", children: ACMS.i18n("media.follow_media_status") }),
1317
+ /* @__PURE__ */ jsx2("option", { value: "open", children: ACMS.i18n("media.open") }),
1318
+ /* @__PURE__ */ jsx2("option", { value: "close", children: ACMS.i18n("media.close") }),
1319
+ /* @__PURE__ */ jsx2("option", { value: "secret", children: ACMS.i18n("media.secret") })
1320
+ ]
1321
+ }
1322
+ ),
1323
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "status" })
1324
+ ] })
1325
+ ] }),
1326
+ /* @__PURE__ */ jsxs2(
1327
+ TableRow,
1328
+ {
1329
+ style: {
1330
+ display: typeof ACMS !== "undefined" && ACMS.Config && ACMS.Config.mediaShowAltAndCaptionOnModal ? "table-row" : "none"
1331
+ },
1332
+ children: [
1333
+ /* @__PURE__ */ jsxs2(TableHead, { nowrap: true, children: [
1334
+ /* @__PURE__ */ jsx2(
1335
+ "label",
1336
+ {
1337
+ id: `media-modal-filename-label-${item.media_id}`,
1338
+ htmlFor: `media-modal-filename-${item.media_id}`,
1339
+ children: ACMS.i18n("media.filename")
1340
+ }
1341
+ ),
1342
+ /* @__PURE__ */ jsx2(
1343
+ "i",
1344
+ {
1345
+ className: "acms-admin-icon-tooltip acms-admin-margin-left-mini js-acms-tooltip-hover",
1346
+ "data-acms-position": "top",
1347
+ "data-acms-tooltip": ACMS.i18n("media.filename_settings")
1348
+ }
1349
+ )
1350
+ ] }),
1351
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1352
+ /* @__PURE__ */ jsx2(
1353
+ "input",
1354
+ {
1355
+ ref: this.filenameInputRef,
1356
+ type: "text",
1357
+ id: `media-modal-filename-${item.media_id}`,
1358
+ "aria-labelledby": `media-modal-filename-label-${item.media_id}`,
1359
+ defaultValue: item.media_title,
1360
+ name: "file_name",
1361
+ className: "acms-admin-form-width-full"
1362
+ }
1363
+ ),
1364
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "file_name" })
1365
+ ] })
1366
+ ]
1367
+ }
1368
+ ),
1369
+ /* @__PURE__ */ jsxs2(TableRow, { children: [
1370
+ /* @__PURE__ */ jsxs2(TableHead, { nowrap: true, children: [
1371
+ ACMS.i18n("media.tag"),
1372
+ /* @__PURE__ */ jsx2(
1373
+ "i",
1374
+ {
1375
+ className: "acms-admin-icon-tooltip acms-admin-margin-left-mini js-acms-tooltip-hover",
1376
+ "data-acms-position": "top",
1377
+ "data-acms-tooltip": ACMS.i18n("media.managed_tag")
1378
+ }
1379
+ )
1380
+ ] }),
1381
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1382
+ /* @__PURE__ */ jsx2(
1383
+ CreatableSelect,
1384
+ {
1385
+ isMulti: true,
1386
+ defaultValue: this.makeTags(item.media_label),
1387
+ className: "acms-admin-form-width-full",
1388
+ onChange: this.handleTagsChange.bind(this),
1389
+ options: tags && tags.map((tag) => ({
1390
+ label: tag,
1391
+ value: tag
1392
+ })),
1393
+ placeholder: ACMS.i18n("media.tag_select_placeholder"),
1394
+ noOptionsMessage: () => ACMS.i18n("media.tag_select_no_options_message"),
1395
+ formatCreateLabel: (inputValue) => ACMS.i18n("media.add_tag", { name: inputValue }),
1396
+ isValidNewOption: (inputValue) => inputValue.trim().length > 0,
1397
+ closeMenuOnSelect: false,
1398
+ hideSelectedOptions: true
1399
+ }
1400
+ ),
1401
+ /* @__PURE__ */ jsx2(
1402
+ "input",
1403
+ {
1404
+ ref: this.tagsInputRef,
1405
+ type: "hidden",
1406
+ defaultValue: item.media_label,
1407
+ name: "media_label"
1408
+ }
1409
+ ),
1410
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "media_label" })
1411
+ ] })
1412
+ ] }),
1413
+ /* @__PURE__ */ jsxs2(
1414
+ TableRow,
1415
+ {
1416
+ style: {
1417
+ display: typeof ACMS !== "undefined" && ACMS.Config && ACMS.Config.mediaShowAltAndCaptionOnModal ? "table-row" : "none"
1418
+ },
1419
+ children: [
1420
+ /* @__PURE__ */ jsxs2(TableHead, { nowrap: true, children: [
1421
+ /* @__PURE__ */ jsx2(
1422
+ "label",
1423
+ {
1424
+ id: `media-modal-caption-label-${item.media_id}`,
1425
+ htmlFor: `media-modal-caption-${item.media_id}`,
1426
+ children: ACMS.i18n("media.caption")
1427
+ }
1428
+ ),
1429
+ /* @__PURE__ */ jsx2(
1430
+ "i",
1431
+ {
1432
+ className: "acms-admin-icon-tooltip acms-admin-margin-left-mini js-acms-tooltip-hover",
1433
+ "data-acms-position": "top",
1434
+ "data-acms-tooltip": ACMS.i18n("media.caption_settings")
1435
+ }
1436
+ )
1437
+ ] }),
1438
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1439
+ /* @__PURE__ */ jsx2(
1440
+ "input",
1441
+ {
1442
+ type: "text",
1443
+ id: `media-modal-caption-${item.media_id}`,
1444
+ "aria-labelledby": `media-modal-caption-label-${item.media_id}`,
1445
+ defaultValue: item.media_caption,
1446
+ name: "field_1",
1447
+ className: "acms-admin-form-width-full"
1448
+ }
1449
+ ),
1450
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "field_1" })
1451
+ ] })
1452
+ ]
1453
+ }
1454
+ ),
1455
+ /* @__PURE__ */ jsxs2(
1456
+ TableRow,
1457
+ {
1458
+ style: {
1459
+ display: typeof ACMS !== "undefined" && ACMS.Config && ACMS.Config.mediaShowAltAndCaptionOnModal ? "table-row" : "none"
1460
+ },
1461
+ children: [
1462
+ /* @__PURE__ */ jsxs2(TableHead, { nowrap: true, children: [
1463
+ /* @__PURE__ */ jsx2(
1464
+ "label",
1465
+ {
1466
+ id: `media-modal-alt-label-${item.media_id}`,
1467
+ htmlFor: `media-modal-alt-${item.media_id}`,
1468
+ children: ACMS.i18n("media.alt")
1469
+ }
1470
+ ),
1471
+ /* @__PURE__ */ jsx2(
1472
+ "i",
1473
+ {
1474
+ className: "acms-admin-icon-tooltip acms-admin-margin-left-mini js-acms-tooltip-hover",
1475
+ "data-acms-position": "top",
1476
+ "data-acms-tooltip": ACMS.i18n("media.alt_settings")
1477
+ }
1478
+ )
1479
+ ] }),
1480
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1481
+ /* @__PURE__ */ jsx2(
1482
+ AutoResizeTextarea,
1483
+ {
1484
+ ref: this.altTextareaRef,
1485
+ id: `media-modal-alt-${item.media_id}`,
1486
+ "aria-labelledby": `media-modal-alt-label-${item.media_id}`,
1487
+ defaultValue: item.media_alt,
1488
+ name: "field_3",
1489
+ className: "acms-admin-form-width-full"
1490
+ }
1491
+ ),
1492
+ /* @__PURE__ */ jsx2(
1493
+ Slot,
1494
+ {
1495
+ name: "media.edit-modal.field.alt",
1496
+ fillProps: {
1497
+ item,
1498
+ previewSrc: preview,
1499
+ getAlt: () => this.altTextareaRef.current?.value ?? "",
1500
+ setAlt: (value) => this.altTextareaRef.current?.setValue(value)
1501
+ }
1502
+ }
1503
+ ),
1504
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "field_3" })
1505
+ ] })
1506
+ ]
1507
+ }
1508
+ ),
1509
+ item.media_type !== "file" && /* @__PURE__ */ jsxs2(TableRow, { children: [
1510
+ /* @__PURE__ */ jsxs2(TableHead, { nowrap: true, children: [
1511
+ /* @__PURE__ */ jsx2(
1512
+ "label",
1513
+ {
1514
+ id: `media-modal-link-label-${item.media_id}`,
1515
+ htmlFor: `media-modal-link-${item.media_id}`,
1516
+ children: ACMS.i18n("media.link")
1517
+ }
1518
+ ),
1519
+ /* @__PURE__ */ jsx2(
1520
+ "i",
1521
+ {
1522
+ className: "acms-admin-icon-tooltip acms-admin-margin-left-mini js-acms-tooltip-hover",
1523
+ "data-acms-position": "top",
1524
+ "data-acms-tooltip": ACMS.i18n("media.link_settings")
1525
+ }
1526
+ )
1527
+ ] }),
1528
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1529
+ /* @__PURE__ */ jsx2(
1530
+ "input",
1531
+ {
1532
+ type: "text",
1533
+ id: `media-modal-link-${item.media_id}`,
1534
+ "aria-labelledby": `media-modal-link-label-${item.media_id}`,
1535
+ defaultValue: item.media_link,
1536
+ name: "field_2",
1537
+ className: "acms-admin-form-width-full"
1538
+ }
1539
+ ),
1540
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "field_2" })
1541
+ ] })
1542
+ ] }),
1543
+ /* @__PURE__ */ jsxs2(TableRow, { children: [
1544
+ /* @__PURE__ */ jsxs2(TableHead, { nowrap: true, children: [
1545
+ /* @__PURE__ */ jsx2(
1546
+ "label",
1547
+ {
1548
+ id: `media-modal-memo-label-${item.media_id}`,
1549
+ htmlFor: `media-modal-memo-${item.media_id}`,
1550
+ children: ACMS.i18n("media.memo")
1551
+ }
1552
+ ),
1553
+ /* @__PURE__ */ jsx2(
1554
+ "i",
1555
+ {
1556
+ className: "acms-admin-icon-tooltip acms-admin-margin-left-mini js-acms-tooltip-hover",
1557
+ "data-acms-position": "top",
1558
+ "data-acms-tooltip": ACMS.i18n("media.memo_settings")
1559
+ }
1560
+ )
1561
+ ] }),
1562
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1563
+ /* @__PURE__ */ jsx2(
1564
+ "textarea",
1565
+ {
1566
+ id: `media-modal-memo-${item.media_id}`,
1567
+ "aria-labelledby": `media-modal-memo-label-${item.media_id}`,
1568
+ defaultValue: item.media_text,
1569
+ name: "field_4",
1570
+ className: "acms-admin-form-width-full"
1571
+ }
1572
+ ),
1573
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "field_4" })
1574
+ ] })
1575
+ ] })
1576
+ ] }) }),
1577
+ /* @__PURE__ */ jsx2(Slot, { name: "media.edit-modal.fields", fillProps: { item } })
1578
+ ] }),
1579
+ /* @__PURE__ */ jsx2(TabPanel, { label: ACMS.i18n("media.info"), id: "media-info", children: /* @__PURE__ */ jsx2(Table, { variant: "unstyled", className: "acms-admin-media-table-edit", children: /* @__PURE__ */ jsxs2(TableBody, { children: [
1580
+ /* @__PURE__ */ jsxs2(TableRow, { children: [
1581
+ /* @__PURE__ */ jsx2(TableHead, { children: ACMS.i18n("media.media_id") }),
1582
+ /* @__PURE__ */ jsx2(TableCell, { children: /* @__PURE__ */ jsx2("span", { className: "acms-admin-label", children: item.media_id }) })
1583
+ ] }),
1584
+ /* @__PURE__ */ jsxs2(TableRow, { children: [
1585
+ /* @__PURE__ */ jsx2(TableHead, { children: ACMS.i18n("media.upload_date") }),
1586
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1587
+ item.media_datetime,
1588
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "upload_date", value: item.media_datetime }),
1589
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "upload_date" })
1590
+ ] })
1591
+ ] }),
1592
+ /* @__PURE__ */ jsxs2(TableRow, { children: [
1593
+ /* @__PURE__ */ jsx2(TableHead, { children: ACMS.i18n("media.user_name") }),
1594
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1595
+ item.media_user_name,
1596
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "user_id", value: item.media_user_id }),
1597
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "user_id" })
1598
+ ] })
1599
+ ] }),
1600
+ /* @__PURE__ */ jsxs2(TableRow, { children: [
1601
+ /* @__PURE__ */ jsx2(TableHead, { children: ACMS.i18n("media.last_modified") }),
1602
+ /* @__PURE__ */ jsx2(TableCell, { children: item.media_last_modified })
1603
+ ] }),
1604
+ item.media_last_update_user_name !== "" && /* @__PURE__ */ jsxs2(TableRow, { children: [
1605
+ /* @__PURE__ */ jsx2(TableHead, { children: ACMS.i18n("media.last_update_user_name") }),
1606
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1607
+ item.media_last_update_user_name,
1608
+ /* @__PURE__ */ jsx2(
1609
+ "input",
1610
+ {
1611
+ type: "hidden",
1612
+ name: "last_update_user_id",
1613
+ value: item.media_last_update_user_id
1614
+ }
1615
+ ),
1616
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "last_update_user_id" })
1617
+ ] })
1618
+ ] }),
1619
+ item.media_type === "image" && /* @__PURE__ */ jsxs2(TableRow, { children: [
1620
+ /* @__PURE__ */ jsx2(TableHead, { children: ACMS.i18n("media.image_size") }),
1621
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1622
+ item.media_size,
1623
+ " px"
1624
+ ] })
1625
+ ] }),
1626
+ /* @__PURE__ */ jsxs2(TableRow, { children: [
1627
+ /* @__PURE__ */ jsx2(TableHead, { children: ACMS.i18n("media.file_size") }),
1628
+ /* @__PURE__ */ jsx2(TableCell, { children: formatBytes(item.media_filesize) })
1629
+ ] })
1630
+ ] }) }) })
1631
+ ] }),
1632
+ /* @__PURE__ */ jsx2("div", { className: "acms-admin-media-clipboard", children: /* @__PURE__ */ jsx2(Table, { variant: "unstyled", className: "acms-admin-table-admin-media-edit", children: /* @__PURE__ */ jsxs2(TableBody, { children: [
1633
+ this.isFileMedia(this.state, this.props) && /* @__PURE__ */ jsxs2(TableRow, { children: [
1634
+ /* @__PURE__ */ jsx2(TableHead, { nowrap: true, children: ACMS.i18n("media.entity_path") }),
1635
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1636
+ /* @__PURE__ */ jsxs2("div", { className: "acms-admin-form-input-group", children: [
1637
+ /* @__PURE__ */ jsx2(
1638
+ "input",
1639
+ {
1640
+ type: "text",
1641
+ value: decodeURI(item.media_path),
1642
+ readOnly: true,
1643
+ className: "acms-admin-form-width-full",
1644
+ disabled: true,
1645
+ style: {
1646
+ cursor: "auto"
1647
+ }
1648
+ }
1649
+ ),
1650
+ /* @__PURE__ */ jsx2(
1651
+ CopyToClipboard,
1652
+ {
1653
+ text: item.media_path,
1654
+ tooltipMessage: ACMS.i18n("media.intrinsic_link_copied"),
1655
+ children: /* @__PURE__ */ jsx2("span", { className: "acms-admin-form-side-btn", children: /* @__PURE__ */ jsx2("button", { type: "button", className: "acms-admin-btn", children: ACMS.i18n("media.copy") }) })
1656
+ }
1657
+ )
1658
+ ] }),
1659
+ /* @__PURE__ */ jsx2("p", { style: { fontSize: "12px", marginTop: "5px" }, className: "acms-admin-text-primary", children: ACMS.i18n("media.entity_path_attention") })
1660
+ ] })
1661
+ ] }),
1662
+ /* @__PURE__ */ jsxs2(TableRow, { children: [
1663
+ /* @__PURE__ */ jsx2(TableHead, { nowrap: true, children: ACMS.i18n("media.permalink") }),
1664
+ /* @__PURE__ */ jsxs2(TableCell, { children: [
1665
+ /* @__PURE__ */ jsxs2("div", { className: "acms-admin-form-input-group", children: [
1666
+ /* @__PURE__ */ jsx2(
1667
+ "input",
1668
+ {
1669
+ type: "text",
1670
+ value: item.media_permalink,
1671
+ readOnly: true,
1672
+ className: "acms-admin-form-width-full",
1673
+ disabled: true,
1674
+ style: {
1675
+ cursor: "auto"
1676
+ }
1677
+ }
1678
+ ),
1679
+ /* @__PURE__ */ jsx2(
1680
+ CopyToClipboard,
1681
+ {
1682
+ text: item.media_permalink,
1683
+ tooltipMessage: ACMS.i18n("media.permalink_copied"),
1684
+ children: /* @__PURE__ */ jsx2("span", { className: "acms-admin-form-side-btn", children: /* @__PURE__ */ jsx2("button", { type: "button", className: "acms-admin-btn", children: ACMS.i18n("media.copy") }) })
1685
+ }
1686
+ )
1687
+ ] }),
1688
+ /* @__PURE__ */ jsx2(
1689
+ "p",
1690
+ {
1691
+ style: { fontSize: "12px", marginTop: "5px", marginBottom: 0 },
1692
+ className: "acms-admin-text-danger",
1693
+ children: ACMS.i18n("media.permalink_attention")
1694
+ }
1695
+ )
1696
+ ] })
1697
+ ] })
1698
+ ] }) }) })
1699
+ ] })
1700
+ ] }),
1701
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "formToken", value: formToken }),
1702
+ item.media_ext && /* @__PURE__ */ jsx2("input", { type: "hidden", name: "extension", value: item.media_ext.toUpperCase() }),
1703
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "type", value: item.media_type }),
1704
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "extension" }),
1705
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "type" }),
1706
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "file_size", value: item.media_size }),
1707
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "file_size" }),
1708
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "path", value: item.media_path }),
1709
+ /* @__PURE__ */ jsx2("input", { type: "hidden", name: "media[]", value: "path" })
1710
+ ] }) }),
1711
+ /* @__PURE__ */ jsx2(ModalFooter2, { className: "acms-admin-media-modal-footer", children: /* @__PURE__ */ jsxs2(HStack2, { children: [
1712
+ /* @__PURE__ */ jsx2(
1713
+ "button",
1714
+ {
1715
+ type: "button",
1716
+ className: "acms-admin-btn acms-admin-media-cancel-btn",
1717
+ onClick: this.hideModal.bind(this),
1718
+ children: ACMS.i18n("media.cancel")
1719
+ }
1720
+ ),
1721
+ /* @__PURE__ */ jsx2(
1722
+ "button",
1723
+ {
1724
+ type: "button",
1725
+ className: "acms-admin-btn acms-admin-btn-primary",
1726
+ onClick: () => {
1727
+ if (item) {
1728
+ this.uploadAsNew(item);
1729
+ }
1730
+ },
1731
+ children: ACMS.i18n("media.save_as_new")
1732
+ }
1733
+ ),
1734
+ /* @__PURE__ */ jsx2(
1735
+ "button",
1736
+ {
1737
+ type: "button",
1738
+ className: "acms-admin-btn acms-admin-btn-primary",
1739
+ onClick: () => {
1740
+ if (item) {
1741
+ this.update(item);
1742
+ }
1743
+ },
1744
+ children: ACMS.i18n("media.save")
1745
+ }
1746
+ ),
1747
+ item && /* @__PURE__ */ jsx2(
1748
+ Slot,
1749
+ {
1750
+ name: "media.edit-modal.footer",
1751
+ fillProps: { item, getFormData: () => this.buildFormData("ACMS_POST_Media_Update") }
1752
+ }
1753
+ )
1754
+ ] }) })
1755
+ ]
1756
+ }
1757
+ ),
1758
+ item && /* @__PURE__ */ jsx2(
1759
+ MediaEditModal,
1760
+ {
1761
+ isOpen: isEditDialogOpen,
1762
+ onClose: this.handleEditDialogClose.bind(this),
1763
+ onCrop: this.handleCrop.bind(this),
1764
+ src: preview || item.media_edited,
1765
+ original: item.media_original,
1766
+ focalPoint,
1767
+ width: this.imageWidth(item.media_size),
1768
+ height: this.imageHeight(item.media_size),
1769
+ mediaCropSizes: ACMS.Config.mediaCropSizes,
1770
+ container: this.root
1771
+ }
1772
+ )
1773
+ ] });
1774
+ }
1775
+ };
1776
+
1777
+ export {
1778
+ actions_exports,
1779
+ MediaModal,
1780
+ reducer_default,
1781
+ rootSaga
1782
+ };
1783
+ //# sourceMappingURL=chunk-JJTHI4QP.mjs.map