@nocobase/plugin-file-manager 0.12.0-alpha.5 → 0.13.0-alpha.10

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 (40) hide show
  1. package/dist/client/index.js +1 -979
  2. package/dist/index.js +37 -16
  3. package/dist/locale/en-US.js +22 -4
  4. package/dist/locale/fr-FR.js +22 -4
  5. package/dist/locale/ja-JP.js +22 -4
  6. package/dist/locale/ru-RU.js +22 -4
  7. package/dist/locale/tr-TR.js +22 -4
  8. package/dist/locale/zh-CN.js +22 -4
  9. package/dist/node_modules/@aws-sdk/client-s3/dist-cjs/index.js +3 -3
  10. package/dist/node_modules/@aws-sdk/client-s3/package.json +1 -1
  11. package/dist/node_modules/mime-match/index.js +1 -1
  12. package/dist/node_modules/mime-match/package.json +1 -1
  13. package/dist/node_modules/mkdirp/index.js +1 -1
  14. package/dist/node_modules/mkdirp/package.json +1 -1
  15. package/dist/node_modules/multer-aliyun-oss/index.js +22 -22
  16. package/dist/node_modules/multer-aliyun-oss/package.json +1 -1
  17. package/dist/node_modules/multer-cos/index.js +15 -15
  18. package/dist/node_modules/multer-cos/package.json +1 -1
  19. package/dist/node_modules/multer-s3/index.js +5 -5
  20. package/dist/node_modules/multer-s3/package.json +1 -1
  21. package/dist/server/actions/attachments.js +54 -45
  22. package/dist/server/actions/index.js +37 -14
  23. package/dist/server/collections/attachments.js +22 -4
  24. package/dist/server/collections/storages.js +22 -4
  25. package/dist/server/constants.js +38 -10
  26. package/dist/server/index.js +37 -21
  27. package/dist/server/migrations/20230831160742-fix-attachment-field.d.ts +4 -0
  28. package/dist/server/migrations/20230831160742-fix-attachment-field.js +60 -0
  29. package/dist/server/rules/index.js +36 -13
  30. package/dist/server/rules/mimetype.js +34 -11
  31. package/dist/server/server.js +53 -28
  32. package/dist/server/storages/ali-oss.js +26 -9
  33. package/dist/server/storages/index.js +48 -26
  34. package/dist/server/storages/local.d.ts +0 -3
  35. package/dist/server/storages/local.js +44 -103
  36. package/dist/server/storages/s3.js +26 -9
  37. package/dist/server/storages/tx-cos.js +28 -11
  38. package/dist/server/utils.js +42 -15
  39. package/dist/swagger/index.json +81 -0
  40. package/package.json +2 -2
@@ -1,979 +1 @@
1
- (function(global, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("@nocobase/client"), require("react"), require("@nocobase/utils/client"), require("antd"), require("@formily/antd-v5"), require("@formily/react"), require("react-i18next"), require("@formily/shared")) : typeof define === "function" && define.amd ? define(["exports", "@nocobase/client", "react", "@nocobase/utils/client", "antd", "@formily/antd-v5", "@formily/react", "react-i18next", "@formily/shared"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["@nocobase/plugin-file-manager"] = {}, global["@nocobase/client"], global.react, global["@nocobase/utils"], global.antd, global["@formily/antd-v5"], global["@formily/react"], global["react-i18next"], global["@formily/shared"]));
3
- })(this, function(exports2, client, require$$0, client$1, antd, antdV5, react, reactI18next, shared) {
4
- "use strict";
5
- var jsxRuntime = { exports: {} };
6
- var reactJsxRuntime_production_min = {};
7
- /**
8
- * @license React
9
- * react-jsx-runtime.production.min.js
10
- *
11
- * Copyright (c) Facebook, Inc. and its affiliates.
12
- *
13
- * This source code is licensed under the MIT license found in the
14
- * LICENSE file in the root directory of this source tree.
15
- */
16
- var f = require$$0, k = Symbol.for("react.element"), l = Symbol.for("react.fragment"), m = Object.prototype.hasOwnProperty, n = f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, p = { key: true, ref: true, __self: true, __source: true };
17
- function q(c, a, g) {
18
- var b, d = {}, e = null, h = null;
19
- void 0 !== g && (e = "" + g);
20
- void 0 !== a.key && (e = "" + a.key);
21
- void 0 !== a.ref && (h = a.ref);
22
- for (b in a)
23
- m.call(a, b) && !p.hasOwnProperty(b) && (d[b] = a[b]);
24
- if (c && c.defaultProps)
25
- for (b in a = c.defaultProps, a)
26
- void 0 === d[b] && (d[b] = a[b]);
27
- return { $$typeof: k, type: c, key: e, ref: h, props: d, _owner: n.current };
28
- }
29
- reactJsxRuntime_production_min.Fragment = l;
30
- reactJsxRuntime_production_min.jsx = q;
31
- reactJsxRuntime_production_min.jsxs = q;
32
- {
33
- jsxRuntime.exports = reactJsxRuntime_production_min;
34
- }
35
- var jsxRuntimeExports = jsxRuntime.exports;
36
- const NAMESPACE = "file-manager";
37
- function useFmTranslation() {
38
- return reactI18next.useTranslation(NAMESPACE);
39
- }
40
- const schema = {
41
- local: {
42
- properties: {
43
- documentRoot: {
44
- title: `{{t("Destination", { ns: "${NAMESPACE}" })}}`,
45
- type: "string",
46
- "x-decorator": "FormItem",
47
- "x-component": "Input",
48
- default: "uploads"
49
- },
50
- serve: {
51
- type: "string",
52
- "x-decorator": "FormItem",
53
- "x-component": "Checkbox",
54
- "x-content": `{{t("Use the built-in static file server", { ns: "${NAMESPACE}" })}}`,
55
- default: true
56
- }
57
- }
58
- },
59
- "ali-oss": {
60
- properties: {
61
- region: {
62
- title: `{{t("Region", { ns: "${NAMESPACE}" })}}`,
63
- type: "string",
64
- "x-decorator": "FormItem",
65
- "x-component": "Input",
66
- required: true
67
- },
68
- accessKeyId: {
69
- title: `{{t("AccessKey ID", { ns: "${NAMESPACE}" })}}`,
70
- type: "string",
71
- "x-decorator": "FormItem",
72
- "x-component": "Input",
73
- required: true
74
- },
75
- accessKeySecret: {
76
- title: `{{t("AccessKey Secret", { ns: "${NAMESPACE}" })}}`,
77
- type: "string",
78
- "x-decorator": "FormItem",
79
- "x-component": "Password",
80
- required: true
81
- },
82
- bucket: {
83
- title: `{{t("Bucket", { ns: "${NAMESPACE}" })}}`,
84
- type: "string",
85
- "x-decorator": "FormItem",
86
- "x-component": "Input",
87
- required: true
88
- }
89
- }
90
- },
91
- "tx-cos": {
92
- properties: {
93
- Region: {
94
- title: `{{t("Region", { ns: "${NAMESPACE}" })}}`,
95
- type: "string",
96
- "x-decorator": "FormItem",
97
- "x-component": "Input",
98
- required: true
99
- },
100
- SecretId: {
101
- title: `{{t("SecretId", { ns: "${NAMESPACE}" })}}`,
102
- type: "string",
103
- "x-decorator": "FormItem",
104
- "x-component": "Input",
105
- required: true
106
- },
107
- SecretKey: {
108
- title: `{{t("SecretKey", { ns: "${NAMESPACE}" })}}`,
109
- type: "string",
110
- "x-decorator": "FormItem",
111
- "x-component": "Password",
112
- required: true
113
- },
114
- Bucket: {
115
- title: `{{t("Bucket", { ns: "${NAMESPACE}" })}}`,
116
- type: "string",
117
- "x-decorator": "FormItem",
118
- "x-component": "Input",
119
- required: true
120
- }
121
- }
122
- },
123
- s3: {
124
- properties: {
125
- region: {
126
- title: `{{t("Region", { ns: "${NAMESPACE}" })}}`,
127
- type: "string",
128
- "x-decorator": "FormItem",
129
- "x-component": "Input",
130
- required: true
131
- },
132
- accessKeyId: {
133
- title: `{{t("AccessKey ID", { ns: "${NAMESPACE}" })}}`,
134
- type: "string",
135
- "x-decorator": "FormItem",
136
- "x-component": "Input",
137
- required: true
138
- },
139
- secretAccessKey: {
140
- title: `{{t("AccessKey Secret", { ns: "${NAMESPACE}" })}}`,
141
- type: "string",
142
- "x-decorator": "FormItem",
143
- "x-component": "Password",
144
- required: true
145
- },
146
- bucket: {
147
- title: `{{t("Bucket", { ns: "${NAMESPACE}" })}}`,
148
- type: "string",
149
- "x-decorator": "FormItem",
150
- "x-component": "Input",
151
- required: true
152
- },
153
- endpoint: {
154
- title: `{{t("Endpoint", { ns: "${NAMESPACE}" })}}`,
155
- type: "string",
156
- "x-decorator": "FormItem",
157
- "x-component": "Input"
158
- }
159
- }
160
- }
161
- };
162
- const StorageOptions = react.observer(
163
- (props) => {
164
- const form = react.useForm();
165
- const field = react.useField();
166
- const [s, setSchema] = require$$0.useState(new react.Schema({}));
167
- require$$0.useEffect(() => {
168
- setSchema(new react.Schema(schema[form.values.type] || {}));
169
- }, [form.values.type]);
170
- return /* @__PURE__ */ jsxRuntimeExports.jsx(antdV5.FormLayout, { layout: "vertical", children: /* @__PURE__ */ jsxRuntimeExports.jsx(react.RecursionField, { basePath: field.address, onlyRenderProperties: true, schema: s }, form.values.type || "local") });
171
- },
172
- { displayName: "StorageOptions" }
173
- );
174
- const collection = {
175
- name: "storages",
176
- fields: [
177
- {
178
- type: "integer",
179
- name: "title",
180
- interface: "input",
181
- uiSchema: {
182
- title: '{{t("Title")}}',
183
- type: "string",
184
- "x-component": "Input",
185
- required: true
186
- }
187
- },
188
- {
189
- type: "string",
190
- name: "name",
191
- interface: "input",
192
- uiSchema: {
193
- title: `{{t("Storage name", { ns: "${NAMESPACE}" })}}`,
194
- descriptions: `{{t("Will be used for API", { ns: "${NAMESPACE}" })}}`,
195
- type: "string",
196
- "x-component": "Input"
197
- }
198
- },
199
- {
200
- type: "string",
201
- name: "type",
202
- interface: "select",
203
- uiSchema: {
204
- title: `{{t("Storage type", { ns: "${NAMESPACE}" })}}`,
205
- type: "string",
206
- "x-component": "Select",
207
- required: true,
208
- enum: [
209
- { label: `{{t("Local storage", { ns: "${NAMESPACE}" })}}`, value: "local" },
210
- { label: `{{t("Aliyun OSS", { ns: "${NAMESPACE}" })}}`, value: "ali-oss" },
211
- { label: `{{t("Amazon S3", { ns: "${NAMESPACE}" })}}`, value: "s3" },
212
- { label: `{{t("Tencent COS", { ns: "${NAMESPACE}" })}}`, value: "tx-cos" }
213
- ]
214
- }
215
- },
216
- {
217
- type: "string",
218
- name: "baseUrl",
219
- interface: "input",
220
- uiSchema: {
221
- title: `{{t("Storage base URL", { ns: "${NAMESPACE}" })}}`,
222
- type: "string",
223
- "x-component": "Input",
224
- required: true
225
- }
226
- },
227
- {
228
- type: "string",
229
- name: "path",
230
- interface: "input",
231
- uiSchema: {
232
- title: `{{t("Path", { ns: "${NAMESPACE}" })}}`,
233
- type: "string",
234
- "x-component": "Input"
235
- }
236
- },
237
- {
238
- type: "boolean",
239
- name: "default",
240
- interface: "boolean",
241
- uiSchema: {
242
- title: `{{t("Default storage", { ns: "${NAMESPACE}" })}}`,
243
- type: "boolean",
244
- "x-component": "Checkbox"
245
- }
246
- },
247
- {
248
- type: "boolean",
249
- name: "paranoid",
250
- interface: "boolean",
251
- uiSchema: {
252
- title: `{{t("Keep file in storage when destroy record", { ns: "${NAMESPACE}" })}}`,
253
- type: "boolean",
254
- "x-component": "Checkbox"
255
- }
256
- }
257
- ]
258
- };
259
- const storageSchema = {
260
- type: "object",
261
- properties: {
262
- [shared.uid()]: {
263
- type: "void",
264
- "x-decorator": "ResourceActionProvider",
265
- "x-decorator-props": {
266
- collection,
267
- resourceName: "storages",
268
- request: {
269
- resource: "storages",
270
- action: "list",
271
- params: {
272
- pageSize: 50,
273
- sort: ["id"],
274
- appends: []
275
- }
276
- }
277
- },
278
- "x-component": "CollectionProvider",
279
- "x-component-props": {
280
- collection
281
- },
282
- properties: {
283
- actions: {
284
- type: "void",
285
- "x-component": "ActionBar",
286
- "x-component-props": {
287
- style: {
288
- marginBottom: 16
289
- }
290
- },
291
- properties: {
292
- delete: {
293
- type: "void",
294
- title: '{{ t("Delete") }}',
295
- "x-component": "Action",
296
- "x-component-props": {
297
- useAction: "{{ cm.useBulkDestroyAction }}",
298
- confirm: {
299
- title: "{{t('Delete')}}",
300
- content: "{{t('Are you sure you want to delete it?')}}"
301
- }
302
- }
303
- },
304
- create: {
305
- type: "void",
306
- title: '{{t("Add new")}}',
307
- "x-component": "Action",
308
- "x-component-props": {
309
- type: "primary"
310
- },
311
- properties: {
312
- drawer: {
313
- type: "void",
314
- "x-component": "Action.Drawer",
315
- "x-decorator": "Form",
316
- "x-decorator-props": {
317
- useValues(options) {
318
- const ctx = client.useActionContext();
319
- return client.useRequest(
320
- () => Promise.resolve({
321
- data: {
322
- name: `s_${shared.uid()}`
323
- }
324
- }),
325
- { ...options, refreshDeps: [ctx.visible] }
326
- );
327
- }
328
- },
329
- title: '{{t("Add new")}}',
330
- properties: {
331
- title: {
332
- "x-component": "CollectionField",
333
- "x-decorator": "FormItem"
334
- },
335
- name: {
336
- "x-component": "CollectionField",
337
- "x-decorator": "FormItem",
338
- description: '{{t("Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.")}}'
339
- },
340
- baseUrl: {
341
- "x-component": "CollectionField",
342
- "x-decorator": "FormItem"
343
- },
344
- type: {
345
- "x-component": "CollectionField",
346
- "x-decorator": "FormItem"
347
- },
348
- options: {
349
- type: "object",
350
- "x-component": "StorageOptions"
351
- },
352
- path: {
353
- "x-component": "CollectionField",
354
- "x-decorator": "FormItem"
355
- },
356
- default: {
357
- "x-component": "CollectionField",
358
- "x-decorator": "FormItem",
359
- title: "",
360
- "x-content": `{{t("Default storage", { ns: "${NAMESPACE}" })}}`
361
- },
362
- paranoid: {
363
- title: "",
364
- "x-component": "CollectionField",
365
- "x-decorator": "FormItem",
366
- "x-content": `{{t("Keep file in storage when destroy record", { ns: "${NAMESPACE}" })}}`
367
- },
368
- footer: {
369
- type: "void",
370
- "x-component": "Action.Drawer.Footer",
371
- properties: {
372
- cancel: {
373
- title: '{{t("Cancel")}}',
374
- "x-component": "Action",
375
- "x-component-props": {
376
- useAction: "{{ cm.useCancelAction }}"
377
- }
378
- },
379
- submit: {
380
- title: '{{t("Submit")}}',
381
- "x-component": "Action",
382
- "x-component-props": {
383
- type: "primary",
384
- useAction: "{{ cm.useCreateAction }}"
385
- }
386
- }
387
- }
388
- }
389
- }
390
- }
391
- }
392
- }
393
- }
394
- },
395
- table: {
396
- type: "void",
397
- "x-uid": "input",
398
- "x-component": "Table.Void",
399
- "x-component-props": {
400
- rowKey: "id",
401
- rowSelection: {
402
- type: "checkbox"
403
- },
404
- useDataSource: "{{ cm.useDataSourceFromRAC }}"
405
- },
406
- properties: {
407
- title: {
408
- type: "void",
409
- "x-decorator": "Table.Column.Decorator",
410
- "x-component": "Table.Column",
411
- properties: {
412
- title: {
413
- type: "number",
414
- "x-component": "CollectionField",
415
- "x-read-pretty": true
416
- }
417
- }
418
- },
419
- name: {
420
- type: "void",
421
- "x-decorator": "Table.Column.Decorator",
422
- "x-component": "Table.Column",
423
- properties: {
424
- name: {
425
- type: "string",
426
- "x-component": "CollectionField",
427
- "x-read-pretty": true
428
- }
429
- }
430
- },
431
- default: {
432
- type: "void",
433
- "x-decorator": "Table.Column.Decorator",
434
- "x-component": "Table.Column",
435
- properties: {
436
- default: {
437
- type: "string",
438
- "x-component": "CollectionField",
439
- "x-read-pretty": true
440
- }
441
- }
442
- },
443
- actions: {
444
- type: "void",
445
- title: '{{t("Actions")}}',
446
- "x-component": "Table.Column",
447
- properties: {
448
- actions: {
449
- type: "void",
450
- "x-component": "Space",
451
- "x-component-props": {
452
- split: "|"
453
- },
454
- properties: {
455
- update: {
456
- type: "void",
457
- title: '{{t("Edit")}}',
458
- "x-component": "Action.Link",
459
- "x-component-props": {
460
- type: "primary"
461
- },
462
- properties: {
463
- drawer: {
464
- type: "void",
465
- "x-component": "Action.Drawer",
466
- "x-decorator": "Form",
467
- "x-decorator-props": {
468
- useValues: "{{ cm.useValuesFromRecord }}"
469
- },
470
- title: '{{t("Edit")}}',
471
- properties: {
472
- title: {
473
- "x-component": "CollectionField",
474
- "x-decorator": "FormItem"
475
- },
476
- name: {
477
- "x-component": "CollectionField",
478
- "x-decorator": "FormItem",
479
- "x-disabled": true
480
- },
481
- baseUrl: {
482
- "x-component": "CollectionField",
483
- "x-decorator": "FormItem"
484
- },
485
- type: {
486
- "x-component": "CollectionField",
487
- "x-decorator": "FormItem",
488
- "x-disabled": true
489
- },
490
- options: {
491
- type: "object",
492
- "x-component": "StorageOptions"
493
- },
494
- path: {
495
- "x-component": "CollectionField",
496
- "x-decorator": "FormItem"
497
- },
498
- default: {
499
- title: "",
500
- "x-component": "CollectionField",
501
- "x-decorator": "FormItem",
502
- "x-content": `{{t("Default storage", { ns: "${NAMESPACE}" })}}`
503
- },
504
- paranoid: {
505
- title: "",
506
- "x-component": "CollectionField",
507
- "x-decorator": "FormItem",
508
- "x-content": `{{t("Keep file in storage when destroy record", { ns: "${NAMESPACE}" })}}`
509
- },
510
- footer: {
511
- type: "void",
512
- "x-component": "Action.Drawer.Footer",
513
- properties: {
514
- cancel: {
515
- title: '{{t("Cancel")}}',
516
- "x-component": "Action",
517
- "x-component-props": {
518
- useAction: "{{ cm.useCancelAction }}"
519
- }
520
- },
521
- submit: {
522
- title: '{{t("Submit")}}',
523
- "x-component": "Action",
524
- "x-component-props": {
525
- type: "primary",
526
- useAction: "{{ cm.useUpdateAction }}"
527
- }
528
- }
529
- }
530
- }
531
- }
532
- }
533
- }
534
- },
535
- delete: {
536
- type: "void",
537
- title: '{{ t("Delete") }}',
538
- "x-component": "Action.Link",
539
- "x-component-props": {
540
- confirm: {
541
- title: '{{t("Delete")}}',
542
- content: '{{t("Are you sure you want to delete it?")}}'
543
- },
544
- useAction: "{{cm.useDestroyAction}}"
545
- }
546
- }
547
- }
548
- }
549
- }
550
- }
551
- }
552
- }
553
- }
554
- }
555
- }
556
- };
557
- const FileStoragePane = () => {
558
- return /* @__PURE__ */ jsxRuntimeExports.jsx(antd.Card, { bordered: false, children: /* @__PURE__ */ jsxRuntimeExports.jsx(client.SchemaComponent, { components: { StorageOptions }, schema: storageSchema }) });
559
- };
560
- const FILE_LIMIT_SIZE = 1024 * 1024 * 1024;
561
- const useUploadFiles = () => {
562
- const { service } = client.useBlockRequestContext();
563
- const { t } = useFmTranslation();
564
- const { setVisible } = client.useActionContext();
565
- const { setSelectedRows } = require$$0.useContext(client.RecordPickerContext) || {};
566
- const uploadingFiles = {};
567
- let pendingNumber = 0;
568
- return {
569
- /**
570
- * 返回 false 会阻止上传,返回 true 会继续上传
571
- */
572
- beforeUpload(file2) {
573
- if (file2.size > FILE_LIMIT_SIZE) {
574
- antd.notification.error({
575
- message: `${t("File size cannot exceed")} ${FILE_LIMIT_SIZE / 1024 / 1024}M`
576
- });
577
- file2.status = "error";
578
- return false;
579
- }
580
- return true;
581
- },
582
- onChange(fileList) {
583
- fileList.forEach((file2) => {
584
- var _a;
585
- if (file2.status === "uploading" && !uploadingFiles[file2.uid]) {
586
- pendingNumber++;
587
- uploadingFiles[file2.uid] = true;
588
- }
589
- if (file2.status !== "uploading" && uploadingFiles[file2.uid]) {
590
- delete uploadingFiles[file2.uid];
591
- if (--pendingNumber === 0) {
592
- (_a = service == null ? void 0 : service.refresh) == null ? void 0 : _a.call(service);
593
- setSelectedRows == null ? void 0 : setSelectedRows((preRows) => [
594
- ...preRows,
595
- ...fileList.filter((file22) => file22.status === "done").map((file22) => file22.response.data)
596
- ]);
597
- }
598
- }
599
- });
600
- if (fileList.every((file2) => file2.status === "done")) {
601
- setVisible(false);
602
- }
603
- }
604
- };
605
- };
606
- const hooks = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
607
- __proto__: null,
608
- FILE_LIMIT_SIZE,
609
- useUploadFiles
610
- }, Symbol.toStringTag, { value: "Module" }));
611
- const UploadActionInitializer = (props) => {
612
- const collection2 = client.useCollection();
613
- const schema2 = {
614
- type: "void",
615
- "x-action": "create",
616
- title: "{{t('Upload')}}",
617
- "x-designer": "Action.Designer",
618
- "x-component": "Action",
619
- "x-decorator": "ACLActionProvider",
620
- "x-component-props": {
621
- openMode: "drawer",
622
- type: "primary",
623
- icon: "UploadOutlined"
624
- },
625
- properties: {
626
- drawer: {
627
- type: "void",
628
- title: '{{ t("Upload files") }}',
629
- "x-component": "Action.Container",
630
- properties: {
631
- upload: {
632
- type: "void",
633
- title: '{{ t("Upload files") }}',
634
- "x-component": "Upload.DraggerV2",
635
- "x-component-props": {
636
- height: "50vh",
637
- action: `${collection2.name}:create`,
638
- useProps: "{{useUploadFiles}}",
639
- multiple: true,
640
- listType: "picture"
641
- }
642
- }
643
- }
644
- }
645
- }
646
- };
647
- return /* @__PURE__ */ jsxRuntimeExports.jsx(client.ActionInitializer, { ...props, schema: schema2 });
648
- };
649
- const initializers = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
650
- __proto__: null,
651
- UploadActionInitializer
652
- }, Symbol.toStringTag, { value: "Module" }));
653
- const attachment = {
654
- name: "attachment",
655
- type: "object",
656
- group: "media",
657
- title: `{{t("Attachment", { ns: "${NAMESPACE}" })}}`,
658
- isAssociation: true,
659
- default: {
660
- type: "belongsToMany",
661
- target: "attachments",
662
- // name,
663
- uiSchema: {
664
- type: "array",
665
- // title,
666
- "x-component": "Upload.Attachment",
667
- "x-component-props": {}
668
- }
669
- },
670
- availableTypes: ["belongsToMany"],
671
- schemaInitialize(schema2, { block, field }) {
672
- if (["Table", "Kanban"].includes(block)) {
673
- schema2["x-component-props"] = schema2["x-component-props"] || {};
674
- schema2["x-component-props"]["size"] = "small";
675
- }
676
- schema2["x-component-props"]["action"] = `${field.target}:create${field.storage ? `?attachementField=${field.collectionName}.${field.name}` : ""}`;
677
- },
678
- initialize: (values) => {
679
- if (!values.through) {
680
- values.through = `t_${shared.uid()}`;
681
- }
682
- if (!values.foreignKey) {
683
- values.foreignKey = `f_${shared.uid()}`;
684
- }
685
- if (!values.otherKey) {
686
- values.otherKey = `f_${shared.uid()}`;
687
- }
688
- if (!values.sourceKey) {
689
- values.sourceKey = "id";
690
- }
691
- if (!values.targetKey) {
692
- values.targetKey = "id";
693
- }
694
- },
695
- properties: {
696
- ...client.interfacesProperties.defaultProps,
697
- "uiSchema.x-component-props.accept": {
698
- type: "string",
699
- title: `{{t("MIME type", { ns: "${NAMESPACE}" })}}`,
700
- "x-component": "Input",
701
- "x-decorator": "FormItem",
702
- description: "Example: image/png",
703
- default: "image/*"
704
- },
705
- "uiSchema.x-component-props.multiple": {
706
- type: "boolean",
707
- "x-content": `{{t('Allow uploading multiple files', { ns: "${NAMESPACE}" })}}`,
708
- "x-decorator": "FormItem",
709
- "x-component": "Checkbox",
710
- default: true
711
- },
712
- storage: {
713
- type: "string",
714
- title: `{{t("Storage", { ns: "${NAMESPACE}" })}}`,
715
- description: `{{t('Default storage will be used when not selected', { ns: "${NAMESPACE}" })}}`,
716
- "x-decorator": "FormItem",
717
- "x-component": "RemoteSelect",
718
- "x-component-props": {
719
- service: {
720
- resource: "storages",
721
- params: {
722
- // pageSize: -1
723
- }
724
- },
725
- manual: false,
726
- fieldNames: {
727
- label: "title",
728
- value: "name"
729
- }
730
- }
731
- }
732
- },
733
- filterable: {
734
- children: [
735
- {
736
- name: "id",
737
- title: '{{t("Exists")}}',
738
- operators: [
739
- { label: '{{t("exists")}}', value: "$exists", noValue: true },
740
- { label: '{{t("not exists")}}', value: "$notExists", noValue: true }
741
- ],
742
- schema: {
743
- title: '{{t("Exists")}}',
744
- type: "string",
745
- "x-component": "Input"
746
- }
747
- },
748
- {
749
- name: "filename",
750
- title: `{{t("Filename", { ns: "${NAMESPACE}" })}}`,
751
- operators: client.interfacesProperties.operators.string,
752
- schema: {
753
- title: `{{t("Filename", { ns: "${NAMESPACE}" })}}`,
754
- type: "string",
755
- "x-component": "Input"
756
- }
757
- }
758
- ]
759
- }
760
- };
761
- const file = {
762
- name: "file",
763
- title: `{{t("File collection", { ns: "${NAMESPACE}" })}}`,
764
- order: 3,
765
- color: "blue",
766
- default: {
767
- createdBy: true,
768
- updatedBy: true,
769
- fields: [
770
- {
771
- interface: "input",
772
- type: "string",
773
- name: "title",
774
- deletable: false,
775
- uiSchema: {
776
- type: "string",
777
- title: `{{t("Title")}}`,
778
- "x-component": "Input"
779
- }
780
- },
781
- // '系统文件名(含扩展名)',
782
- {
783
- interface: "input",
784
- type: "string",
785
- name: "filename",
786
- deletable: false,
787
- uiSchema: {
788
- type: "string",
789
- title: `{{t("File name", { ns: "${NAMESPACE}" })}}`,
790
- "x-component": "Input",
791
- "x-read-pretty": true
792
- }
793
- },
794
- // '扩展名(含“.”)',
795
- {
796
- interface: "input",
797
- type: "string",
798
- name: "extname",
799
- deletable: false,
800
- uiSchema: {
801
- type: "string",
802
- title: `{{t("Extension name", { ns: "${NAMESPACE}" })}}`,
803
- "x-component": "Input",
804
- "x-read-pretty": true
805
- }
806
- },
807
- // '文件体积(字节)',
808
- {
809
- interface: "integer",
810
- type: "integer",
811
- name: "size",
812
- deletable: false,
813
- uiSchema: {
814
- type: "number",
815
- title: `{{t("Size", { ns: "${NAMESPACE}" })}}`,
816
- "x-component": "InputNumber",
817
- "x-read-pretty": true,
818
- "x-component-props": {
819
- stringMode: true,
820
- step: "0"
821
- }
822
- }
823
- },
824
- {
825
- interface: "input",
826
- type: "string",
827
- name: "mimetype",
828
- deletable: false,
829
- uiSchema: {
830
- type: "string",
831
- title: `{{t("MIME type", { ns: "${NAMESPACE}" })}}`,
832
- "x-component": "Input",
833
- "x-read-pretty": true
834
- }
835
- },
836
- // '相对路径(含“/”前缀)',
837
- {
838
- interface: "input",
839
- type: "string",
840
- name: "path",
841
- deletable: false,
842
- uiSchema: {
843
- type: "string",
844
- title: `{{t("Path")}}`,
845
- "x-component": "Input",
846
- "x-read-pretty": true
847
- }
848
- },
849
- // 文件的可访问地址
850
- {
851
- interface: "input",
852
- type: "string",
853
- name: "url",
854
- deletable: false,
855
- uiSchema: {
856
- type: "string",
857
- title: `{{t("URL")}}`,
858
- "x-component": "Input.URL",
859
- "x-read-pretty": true
860
- }
861
- },
862
- // 用于预览
863
- {
864
- interface: "url",
865
- type: "string",
866
- name: "preview",
867
- field: "url",
868
- // 直接引用 url 字段
869
- deletable: false,
870
- uiSchema: {
871
- type: "string",
872
- title: `{{t("Preview")}}`,
873
- "x-component": "Preview",
874
- "x-read-pretty": true
875
- }
876
- },
877
- {
878
- comment: "存储引擎",
879
- type: "belongsTo",
880
- name: "storage",
881
- target: "storages",
882
- foreignKey: "storageId",
883
- deletable: false
884
- },
885
- // '其他文件信息(如图片的宽高)',
886
- {
887
- type: "jsonb",
888
- name: "meta",
889
- deletable: false,
890
- defaultValue: {}
891
- }
892
- ]
893
- },
894
- configurableProperties: {
895
- ...client.getConfigurableProperties("title", "name"),
896
- inherits: {
897
- ...client.getConfigurableProperties("inherits").inherits,
898
- "x-reactions": ["{{useAsyncDataSource(loadCollections)}}"]
899
- },
900
- ...client.getConfigurableProperties("category"),
901
- storage: {
902
- title: `{{t("File storage", { ns: "${NAMESPACE}" })}}`,
903
- type: "hasOne",
904
- name: "storage",
905
- required: true,
906
- "x-decorator": "FormItem",
907
- "x-component": "Select",
908
- "x-reactions": ["{{useAsyncDataSource(loadStorages)}}"]
909
- }
910
- }
911
- };
912
- const templates = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
913
- __proto__: null,
914
- file
915
- }, Symbol.toStringTag, { value: "Module" }));
916
- client$1.forEach(templates, (template, key) => {
917
- client.registerTemplate(key, template);
918
- });
919
- client.registerField(attachment.group, "attachment", attachment);
920
- const FileManagerProvider = (props) => {
921
- const initializes = require$$0.useContext(client.SchemaInitializerContext);
922
- const hasUploadAction = initializes.TableActionInitializers.items[0].children.some(
923
- (initialize) => initialize.component === "UploadActionInitializer"
924
- );
925
- !hasUploadAction && initializes.TableActionInitializers.items[0].children.push({
926
- type: "item",
927
- title: "{{t('Upload')}}",
928
- component: "UploadActionInitializer",
929
- schema: {
930
- "x-align": "right",
931
- "x-decorator": "ACLActionProvider",
932
- "x-acl-action-props": {
933
- skipScopeCheck: true
934
- }
935
- },
936
- visible: () => {
937
- const collection2 = client.useCollection();
938
- return collection2.template === "file";
939
- }
940
- });
941
- const ctx = require$$0.useContext(client.PluginManagerContext);
942
- return /* @__PURE__ */ jsxRuntimeExports.jsx(
943
- client.SettingsCenterProvider,
944
- {
945
- settings: {
946
- "file-manager": {
947
- title: `{{t("File manager", { ns: "${NAMESPACE}" })}}`,
948
- icon: "FileOutlined",
949
- tabs: {
950
- storages: {
951
- title: `{{t("File storage", { ns: "${NAMESPACE}" })}}`,
952
- component: FileStoragePane
953
- }
954
- }
955
- }
956
- },
957
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(
958
- client.PluginManagerContext.Provider,
959
- {
960
- value: {
961
- components: {
962
- ...ctx == null ? void 0 : ctx.components
963
- }
964
- },
965
- children: /* @__PURE__ */ jsxRuntimeExports.jsx(client.CollectionManagerProvider, { interfaces: { attachment }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(client.SchemaComponentOptions, { scope: hooks, children: /* @__PURE__ */ jsxRuntimeExports.jsx(client.SchemaInitializerProvider, { components: initializers, children: props.children }) }) })
966
- }
967
- )
968
- }
969
- );
970
- };
971
- class FileManagerPlugin extends client.Plugin {
972
- async load() {
973
- this.app.use(FileManagerProvider);
974
- }
975
- }
976
- exports2.FileManagerPlugin = FileManagerPlugin;
977
- exports2.default = FileManagerPlugin;
978
- Object.defineProperties(exports2, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
979
- });
1
+ (function(n,t){typeof exports=="object"&&typeof module!="undefined"?t(exports,require("@nocobase/client"),require("react/jsx-runtime"),require("@nocobase/utils/client"),require("react"),require("antd"),require("@formily/antd-v5"),require("@formily/react"),require("react-i18next"),require("@formily/shared")):typeof define=="function"&&define.amd?define(["exports","@nocobase/client","react/jsx-runtime","@nocobase/utils/client","react","antd","@formily/antd-v5","@formily/react","react-i18next","@formily/shared"],t):(n=typeof globalThis!="undefined"?globalThis:n||self,t(n["@nocobase/plugin-file-manager"]={},n["@nocobase/client"],n.jsxRuntime,n["@nocobase/utils"],n.react,n.antd,n["@formily/antd-v5"],n["@formily/react"],n["react-i18next"],n["@formily/shared"]))})(this,function(n,t,r,b,u,f,h,s,p,c){"use strict";var B=Object.defineProperty,L=Object.defineProperties;var R=Object.getOwnPropertyDescriptors;var P=Object.getOwnPropertySymbols;var V=Object.prototype.hasOwnProperty,N=Object.prototype.propertyIsEnumerable;var T=(n,t,r)=>t in n?B(n,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):n[t]=r,x=(n,t)=>{for(var r in t||(t={}))V.call(t,r)&&T(n,r,t[r]);if(P)for(var r of P(t))N.call(t,r)&&T(n,r,t[r]);return n},y=(n,t)=>L(n,R(t));var q=(n,t,r)=>new Promise((b,u)=>{var f=p=>{try{s(r.next(p))}catch(c){u(c)}},h=p=>{try{s(r.throw(p))}catch(c){u(c)}},s=p=>p.done?b(p.value):Promise.resolve(p.value).then(f,h);s((r=r.apply(n,t)).next())});const e="file-manager";function w(){return p.useTranslation(e)}const D={local:{properties:{documentRoot:{title:`{{t("Destination", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",default:"storage/uploads"}}},"ali-oss":{properties:{region:{title:`{{t("Region", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",required:!0},accessKeyId:{title:`{{t("AccessKey ID", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",required:!0},accessKeySecret:{title:`{{t("AccessKey Secret", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Password",required:!0},bucket:{title:`{{t("Bucket", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",required:!0}}},"tx-cos":{properties:{Region:{title:`{{t("Region", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",required:!0},SecretId:{title:`{{t("SecretId", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",required:!0},SecretKey:{title:`{{t("SecretKey", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Password",required:!0},Bucket:{title:`{{t("Bucket", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",required:!0}}},s3:{properties:{region:{title:`{{t("Region", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",required:!0},accessKeyId:{title:`{{t("AccessKey ID", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",required:!0},secretAccessKey:{title:`{{t("AccessKey Secret", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Password",required:!0},bucket:{title:`{{t("Bucket", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input",required:!0},endpoint:{title:`{{t("Endpoint", { ns: "${e}" })}}`,type:"string","x-decorator":"FormItem","x-component":"Input"}}}},K=s.observer(o=>{const i=s.useForm(),a=s.useField(),[l,m]=u.useState(new s.Schema({}));return u.useEffect(()=>{m(new s.Schema(D[i.values.type]||{}))},[i.values.type]),r.jsx(h.FormLayout,{layout:"vertical",children:r.jsx(s.RecursionField,{basePath:a.address,onlyRenderProperties:!0,schema:l},i.values.type||"local")})},{displayName:"StorageOptions"}),A={name:"storages",fields:[{type:"integer",name:"title",interface:"input",uiSchema:{title:'{{t("Title")}}',type:"string","x-component":"Input",required:!0}},{type:"string",name:"name",interface:"input",uiSchema:{title:`{{t("Storage name", { ns: "${e}" })}}`,descriptions:`{{t("Will be used for API", { ns: "${e}" })}}`,type:"string","x-component":"Input"}},{type:"string",name:"type",interface:"select",uiSchema:{title:`{{t("Storage type", { ns: "${e}" })}}`,type:"string","x-component":"Select",required:!0,enum:[{label:`{{t("Local storage", { ns: "${e}" })}}`,value:"local"},{label:`{{t("Aliyun OSS", { ns: "${e}" })}}`,value:"ali-oss"},{label:`{{t("Amazon S3", { ns: "${e}" })}}`,value:"s3"},{label:`{{t("Tencent COS", { ns: "${e}" })}}`,value:"tx-cos"}]}},{type:"string",name:"baseUrl",interface:"input",uiSchema:{title:`{{t("Storage base URL", { ns: "${e}" })}}`,type:"string","x-component":"Input",required:!0}},{type:"string",name:"path",interface:"input",uiSchema:{title:`{{t("Path", { ns: "${e}" })}}`,type:"string","x-component":"Input"}},{type:"boolean",name:"default",interface:"boolean",uiSchema:{title:`{{t("Default storage", { ns: "${e}" })}}`,type:"boolean","x-component":"Checkbox"}},{type:"boolean",name:"paranoid",interface:"boolean",uiSchema:{title:`{{t("Keep file in storage when destroy record", { ns: "${e}" })}}`,type:"boolean","x-component":"Checkbox"}}]},U={type:"object",properties:{[c.uid()]:{type:"void","x-decorator":"ResourceActionProvider","x-decorator-props":{collection:A,resourceName:"storages",request:{resource:"storages",action:"list",params:{pageSize:50,sort:["id"],appends:[]}}},"x-component":"CollectionProvider","x-component-props":{collection:A},properties:{actions:{type:"void","x-component":"ActionBar","x-component-props":{style:{marginBottom:16}},properties:{delete:{type:"void",title:'{{ t("Delete") }}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useBulkDestroyAction }}",confirm:{title:"{{t('Delete')}}",content:"{{t('Are you sure you want to delete it?')}}"}}},create:{type:"void",title:'{{t("Add new")}}',"x-component":"Action","x-component-props":{type:"primary"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-decorator":"Form","x-decorator-props":{useValues(o){const i=t.useActionContext();return t.useRequest(()=>Promise.resolve({data:{name:`s_${c.uid()}`}}),y(x({},o),{refreshDeps:[i.visible]}))}},title:'{{t("Add new")}}',properties:{title:{"x-component":"CollectionField","x-decorator":"FormItem"},name:{"x-component":"CollectionField","x-decorator":"FormItem",description:'{{t("Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.")}}'},baseUrl:{"x-component":"CollectionField","x-decorator":"FormItem"},type:{"x-component":"CollectionField","x-decorator":"FormItem"},options:{type:"object","x-component":"StorageOptions"},path:{"x-component":"CollectionField","x-decorator":"FormItem"},default:{"x-component":"CollectionField","x-decorator":"FormItem",title:"","x-content":`{{t("Default storage", { ns: "${e}" })}}`},paranoid:{title:"","x-component":"CollectionField","x-decorator":"FormItem","x-content":`{{t("Keep file in storage when destroy record", { ns: "${e}" })}}`},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useCancelAction }}"}},submit:{title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ cm.useCreateAction }}"}}}}}}}}}},table:{type:"void","x-uid":"input","x-component":"Table.Void","x-component-props":{rowKey:"id",rowSelection:{type:"checkbox"},useDataSource:"{{ cm.useDataSourceFromRAC }}"},properties:{title:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{title:{type:"number","x-component":"CollectionField","x-read-pretty":!0}}},name:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{name:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},default:{type:"void","x-decorator":"Table.Column.Decorator","x-component":"Table.Column",properties:{default:{type:"string","x-component":"CollectionField","x-read-pretty":!0}}},actions:{type:"void",title:'{{t("Actions")}}',"x-component":"Table.Column",properties:{actions:{type:"void","x-component":"Space","x-component-props":{split:"|"},properties:{update:{type:"void",title:'{{t("Edit")}}',"x-component":"Action.Link","x-component-props":{type:"primary"},properties:{drawer:{type:"void","x-component":"Action.Drawer","x-decorator":"Form","x-decorator-props":{useValues:"{{ cm.useValuesFromRecord }}"},title:'{{t("Edit")}}',properties:{title:{"x-component":"CollectionField","x-decorator":"FormItem"},name:{"x-component":"CollectionField","x-decorator":"FormItem","x-disabled":!0},baseUrl:{"x-component":"CollectionField","x-decorator":"FormItem"},type:{"x-component":"CollectionField","x-decorator":"FormItem","x-disabled":!0},options:{type:"object","x-component":"StorageOptions"},path:{"x-component":"CollectionField","x-decorator":"FormItem"},default:{title:"","x-component":"CollectionField","x-decorator":"FormItem","x-content":`{{t("Default storage", { ns: "${e}" })}}`},paranoid:{title:"","x-component":"CollectionField","x-decorator":"FormItem","x-content":`{{t("Keep file in storage when destroy record", { ns: "${e}" })}}`},footer:{type:"void","x-component":"Action.Drawer.Footer",properties:{cancel:{title:'{{t("Cancel")}}',"x-component":"Action","x-component-props":{useAction:"{{ cm.useCancelAction }}"}},submit:{title:'{{t("Submit")}}',"x-component":"Action","x-component-props":{type:"primary",useAction:"{{ cm.useUpdateAction }}"}}}}}}}},delete:{type:"void",title:'{{ t("Delete") }}',"x-component":"Action.Link","x-component-props":{confirm:{title:'{{t("Delete")}}',content:'{{t("Are you sure you want to delete it?")}}'},useAction:"{{cm.useDestroyAction}}"}}}}}}}}}}}},z=()=>r.jsx(f.Card,{bordered:!1,children:r.jsx(t.SchemaComponent,{components:{StorageOptions:K},schema:U})}),I=1024*1024*1024,M=Object.freeze(Object.defineProperty({__proto__:null,FILE_LIMIT_SIZE:I,useUploadFiles:()=>{const{service:o}=t.useBlockRequestContext(),{t:i}=w(),{setVisible:a}=t.useActionContext(),{setSelectedRows:l}=u.useContext(t.RecordPickerContext)||{},m={};let $=0;return{beforeUpload(g){return g.size>I?(f.notification.error({message:`${i("File size cannot exceed")} ${I/1024/1024}M`}),g.status="error",!1):!0},onChange(g){g.forEach(d=>{var v;d.status==="uploading"&&!m[d.uid]&&($++,m[d.uid]=!0),d.status!=="uploading"&&m[d.uid]&&(delete m[d.uid],--$===0&&((v=o==null?void 0:o.refresh)==null||v.call(o),l==null||l(O=>[...O,...g.filter(S=>S.status==="done").map(S=>S.response.data)])))}),g.every(d=>d.status==="done")&&a(!1)}}}},Symbol.toStringTag,{value:"Module"})),_=Object.freeze(Object.defineProperty({__proto__:null,UploadActionInitializer:o=>{const i=t.useCollection(),a={type:"void","x-action":"create",title:"{{t('Upload')}}","x-designer":"Action.Designer","x-component":"Action","x-decorator":"ACLActionProvider","x-component-props":{openMode:"drawer",type:"primary",icon:"UploadOutlined"},properties:{drawer:{type:"void",title:'{{ t("Upload files") }}',"x-component":"Action.Container",properties:{upload:{type:"void",title:'{{ t("Upload files") }}',"x-component":"Upload.DraggerV2","x-component-props":{height:"50vh",action:`${i.name}:create`,useProps:"{{useUploadFiles}}",multiple:!0,listType:"picture"}}}}}};return r.jsx(t.ActionInitializer,y(x({},o),{schema:a}))}},Symbol.toStringTag,{value:"Module"})),F={name:"attachment",type:"object",group:"media",title:`{{t("Attachment", { ns: "${e}" })}}`,isAssociation:!0,default:{type:"belongsToMany",target:"attachments",uiSchema:{type:"array","x-component":"Upload.Attachment","x-component-props":{}}},availableTypes:["belongsToMany"],schemaInitialize(o,{block:i,field:a}){["Table","Kanban"].includes(i)&&(o["x-component-props"]=o["x-component-props"]||{},o["x-component-props"].size="small"),o["x-component-props"]||(o["x-component-props"]={}),o["x-component-props"].action=`${a.target}:create${a.storage?`?attachmentField=${a.collectionName}.${a.name}`:""}`},initialize:o=>{o.through||(o.through=`t_${c.uid()}`),o.foreignKey||(o.foreignKey=`f_${c.uid()}`),o.otherKey||(o.otherKey=`f_${c.uid()}`),o.sourceKey||(o.sourceKey="id"),o.targetKey||(o.targetKey="id")},properties:y(x({},t.interfacesProperties.defaultProps),{"uiSchema.x-component-props.accept":{type:"string",title:`{{t("MIME type", { ns: "${e}" })}}`,"x-component":"Input","x-decorator":"FormItem",description:"Example: image/png",default:"image/*"},"uiSchema.x-component-props.multiple":{type:"boolean","x-content":`{{t('Allow uploading multiple files', { ns: "${e}" })}}`,"x-decorator":"FormItem","x-component":"Checkbox",default:!0},storage:{type:"string",title:`{{t("Storage", { ns: "${e}" })}}`,description:`{{t('Default storage will be used when not selected', { ns: "${e}" })}}`,"x-decorator":"FormItem","x-component":"RemoteSelect","x-component-props":{service:{resource:"storages",params:{}},manual:!1,fieldNames:{label:"title",value:"name"}}}}),filterable:{children:[{name:"id",title:'{{t("Exists")}}',operators:[{label:'{{t("exists")}}',value:"$exists",noValue:!0},{label:'{{t("not exists")}}',value:"$notExists",noValue:!0}],schema:{title:'{{t("Exists")}}',type:"string","x-component":"Input"}},{name:"filename",title:`{{t("Filename", { ns: "${e}" })}}`,operators:t.interfacesProperties.operators.string,schema:{title:`{{t("Filename", { ns: "${e}" })}}`,type:"string","x-component":"Input"}}]}},k={name:"file",title:`{{t("File collection", { ns: "${e}" })}}`,order:3,color:"blue",default:{createdBy:!0,updatedBy:!0,fields:[{interface:"input",type:"string",name:"title",deletable:!1,uiSchema:{type:"string",title:'{{t("Title")}}',"x-component":"Input"}},{interface:"input",type:"string",name:"filename",deletable:!1,uiSchema:{type:"string",title:`{{t("File name", { ns: "${e}" })}}`,"x-component":"Input","x-read-pretty":!0}},{interface:"input",type:"string",name:"extname",deletable:!1,uiSchema:{type:"string",title:`{{t("Extension name", { ns: "${e}" })}}`,"x-component":"Input","x-read-pretty":!0}},{interface:"integer",type:"integer",name:"size",deletable:!1,uiSchema:{type:"number",title:`{{t("Size", { ns: "${e}" })}}`,"x-component":"InputNumber","x-read-pretty":!0,"x-component-props":{stringMode:!0,step:"0"}}},{interface:"input",type:"string",name:"mimetype",deletable:!1,uiSchema:{type:"string",title:`{{t("MIME type", { ns: "${e}" })}}`,"x-component":"Input","x-read-pretty":!0}},{interface:"input",type:"string",name:"path",deletable:!1,uiSchema:{type:"string",title:'{{t("Path")}}',"x-component":"Input","x-read-pretty":!0}},{interface:"input",type:"string",name:"url",deletable:!1,uiSchema:{type:"string",title:'{{t("URL")}}',"x-component":"Input.URL","x-read-pretty":!0}},{interface:"url",type:"string",name:"preview",field:"url",deletable:!1,uiSchema:{type:"string",title:'{{t("Preview")}}',"x-component":"Preview","x-read-pretty":!0}},{comment:"存储引擎",type:"belongsTo",name:"storage",target:"storages",foreignKey:"storageId",deletable:!1},{type:"jsonb",name:"meta",deletable:!1,defaultValue:{}}]},configurableProperties:y(x(y(x({},t.getConfigurableProperties("title","name")),{inherits:y(x({},t.getConfigurableProperties("inherits").inherits),{"x-reactions":["{{useAsyncDataSource(loadCollections)}}"]})}),t.getConfigurableProperties("category","description")),{storage:{title:`{{t("File storage", { ns: "${e}" })}}`,type:"hasOne",name:"storage",required:!0,"x-decorator":"FormItem","x-component":"Select","x-reactions":["{{useAsyncDataSource(loadStorages)}}"]}})},j=Object.freeze(Object.defineProperty({__proto__:null,file:k},Symbol.toStringTag,{value:"Module"}));b.forEach(j,(o,i)=>{t.registerTemplate(i,o)}),t.registerField(F.group,"attachment",F);const E=o=>{const i=u.useContext(t.SchemaInitializerContext);!i.TableActionInitializers.items[0].children.some(m=>m.component==="UploadActionInitializer")&&i.TableActionInitializers.items[0].children.push({type:"item",title:"{{t('Upload')}}",component:"UploadActionInitializer",schema:{"x-align":"right","x-decorator":"ACLActionProvider","x-acl-action-props":{skipScopeCheck:!0}},visible:()=>t.useCollection().template==="file"});const l=u.useContext(t.PluginManagerContext);return r.jsx(t.SettingsCenterProvider,{settings:{"file-manager":{title:`{{t("File manager", { ns: "${e}" })}}`,icon:"FileOutlined",tabs:{storages:{title:`{{t("File storage", { ns: "${e}" })}}`,component:z}}}},children:r.jsx(t.PluginManagerContext.Provider,{value:{components:x({},l==null?void 0:l.components)},children:r.jsx(t.CollectionManagerProvider,{interfaces:{attachment:F},children:r.jsx(t.SchemaComponentOptions,{scope:M,children:r.jsx(t.SchemaInitializerProvider,{components:_,children:o.children})})})})})};class C extends t.Plugin{load(){return q(this,null,function*(){this.app.use(E)})}}n.FileManagerPlugin=C,n.default=C,Object.defineProperties(n,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});