@uploadcare/file-uploader 1.22.0 → 1.23.1

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 (114) hide show
  1. package/abstract/UploaderBlock.d.ts.map +1 -1
  2. package/abstract/UploaderBlock.js +27 -5
  3. package/abstract/UploaderPublicApi.d.ts.map +1 -1
  4. package/abstract/UploaderPublicApi.js +9 -1
  5. package/abstract/managers/ValidationManager.d.ts +71 -12
  6. package/abstract/managers/ValidationManager.d.ts.map +1 -1
  7. package/abstract/managers/ValidationManager.js +229 -53
  8. package/abstract/uploadEntrySchema.d.ts +10 -2
  9. package/abstract/uploadEntrySchema.d.ts.map +1 -1
  10. package/abstract/uploadEntrySchema.js +10 -2
  11. package/blocks/CloudImageEditor/src/CloudImageEditorBlock.js +1 -1
  12. package/blocks/Config/initialConfig.d.ts.map +1 -1
  13. package/blocks/Config/initialConfig.js +2 -0
  14. package/blocks/Config/normalizeConfigValue.d.ts.map +1 -1
  15. package/blocks/Config/normalizeConfigValue.js +2 -0
  16. package/blocks/ExternalSource/ExternalSource.d.ts +1 -0
  17. package/blocks/ExternalSource/ExternalSource.d.ts.map +1 -1
  18. package/blocks/ExternalSource/ExternalSource.js +19 -7
  19. package/blocks/FileItem/FileItem.d.ts +1 -1
  20. package/blocks/FileItem/FileItem.d.ts.map +1 -1
  21. package/blocks/FileItem/FileItem.js +68 -49
  22. package/blocks/UploadList/UploadList.d.ts +2 -0
  23. package/blocks/UploadList/UploadList.d.ts.map +1 -1
  24. package/blocks/UploadList/UploadList.js +18 -20
  25. package/env.d.ts +1 -1
  26. package/env.js +1 -1
  27. package/index.ssr.d.ts +1 -1
  28. package/index.ssr.d.ts.map +1 -1
  29. package/index.ssr.js +10 -2
  30. package/locales/file-uploader/ar.d.ts +3 -1
  31. package/locales/file-uploader/ar.js +4 -2
  32. package/locales/file-uploader/az.d.ts +3 -1
  33. package/locales/file-uploader/az.js +5 -2
  34. package/locales/file-uploader/ca.d.ts +3 -1
  35. package/locales/file-uploader/ca.js +5 -2
  36. package/locales/file-uploader/cs.d.ts +3 -1
  37. package/locales/file-uploader/cs.js +5 -2
  38. package/locales/file-uploader/da.d.ts +3 -1
  39. package/locales/file-uploader/da.js +5 -2
  40. package/locales/file-uploader/de.d.ts +3 -1
  41. package/locales/file-uploader/de.js +5 -2
  42. package/locales/file-uploader/el.d.ts +3 -1
  43. package/locales/file-uploader/el.js +5 -2
  44. package/locales/file-uploader/en.d.ts +3 -1
  45. package/locales/file-uploader/en.js +4 -2
  46. package/locales/file-uploader/es.d.ts +3 -1
  47. package/locales/file-uploader/es.js +5 -2
  48. package/locales/file-uploader/et.d.ts +3 -1
  49. package/locales/file-uploader/et.js +5 -2
  50. package/locales/file-uploader/fi.d.ts +3 -1
  51. package/locales/file-uploader/fi.js +5 -2
  52. package/locales/file-uploader/fr.d.ts +3 -1
  53. package/locales/file-uploader/fr.js +5 -2
  54. package/locales/file-uploader/he.d.ts +3 -1
  55. package/locales/file-uploader/he.js +5 -2
  56. package/locales/file-uploader/hy.d.ts +3 -1
  57. package/locales/file-uploader/hy.js +4 -2
  58. package/locales/file-uploader/is.d.ts +3 -1
  59. package/locales/file-uploader/is.js +5 -2
  60. package/locales/file-uploader/it.d.ts +3 -1
  61. package/locales/file-uploader/it.js +5 -2
  62. package/locales/file-uploader/ja.d.ts +3 -1
  63. package/locales/file-uploader/ja.js +5 -2
  64. package/locales/file-uploader/ka.d.ts +3 -1
  65. package/locales/file-uploader/ka.js +5 -2
  66. package/locales/file-uploader/kk.d.ts +3 -1
  67. package/locales/file-uploader/kk.js +5 -2
  68. package/locales/file-uploader/ko.d.ts +3 -1
  69. package/locales/file-uploader/ko.js +5 -2
  70. package/locales/file-uploader/lv.d.ts +3 -1
  71. package/locales/file-uploader/lv.js +5 -2
  72. package/locales/file-uploader/nb.d.ts +3 -1
  73. package/locales/file-uploader/nb.js +5 -2
  74. package/locales/file-uploader/nl.d.ts +3 -1
  75. package/locales/file-uploader/nl.js +5 -2
  76. package/locales/file-uploader/pl.d.ts +3 -1
  77. package/locales/file-uploader/pl.js +5 -2
  78. package/locales/file-uploader/pt.d.ts +3 -1
  79. package/locales/file-uploader/pt.js +5 -2
  80. package/locales/file-uploader/ro.d.ts +3 -1
  81. package/locales/file-uploader/ro.js +5 -2
  82. package/locales/file-uploader/ru.d.ts +3 -1
  83. package/locales/file-uploader/ru.js +5 -2
  84. package/locales/file-uploader/sk.d.ts +3 -1
  85. package/locales/file-uploader/sk.js +5 -2
  86. package/locales/file-uploader/sr.d.ts +3 -1
  87. package/locales/file-uploader/sr.js +5 -2
  88. package/locales/file-uploader/sv.d.ts +3 -1
  89. package/locales/file-uploader/sv.js +5 -2
  90. package/locales/file-uploader/tr.d.ts +3 -1
  91. package/locales/file-uploader/tr.js +5 -2
  92. package/locales/file-uploader/uk.d.ts +3 -1
  93. package/locales/file-uploader/uk.js +5 -2
  94. package/locales/file-uploader/vi.d.ts +3 -1
  95. package/locales/file-uploader/vi.js +5 -2
  96. package/locales/file-uploader/zh-TW.d.ts +3 -1
  97. package/locales/file-uploader/zh-TW.js +5 -2
  98. package/locales/file-uploader/zh.d.ts +3 -1
  99. package/locales/file-uploader/zh.js +5 -2
  100. package/package.json +8 -8
  101. package/types/exported.d.ts +26 -4
  102. package/utils/withResolvers.d.ts +6 -0
  103. package/utils/withResolvers.d.ts.map +1 -0
  104. package/utils/withResolvers.js +18 -0
  105. package/utils/withResolvers.test.d.ts +2 -0
  106. package/utils/withResolvers.test.d.ts.map +1 -0
  107. package/utils/withResolvers.test.js +36 -0
  108. package/web/file-uploader.iife.min.js +4 -4
  109. package/web/file-uploader.min.js +4 -4
  110. package/web/uc-cloud-image-editor.min.js +4 -4
  111. package/web/uc-file-uploader-inline.min.js +4 -4
  112. package/web/uc-file-uploader-minimal.min.js +4 -4
  113. package/web/uc-file-uploader-regular.min.js +4 -4
  114. package/web/uc-img.min.js +1 -1
@@ -100,7 +100,7 @@ export const uploadEntrySchema = Object.freeze({
100
100
  }),
101
101
  errors: Object.freeze({
102
102
  type: Array,
103
- value: /** @type {Error[]} */ ([]),
103
+ value: /** @type {import('../types').OutputErrorFile[]} */ ([]),
104
104
  }),
105
105
  uploadError: Object.freeze({
106
106
  type: Error,
@@ -111,7 +111,15 @@ export const uploadEntrySchema = Object.freeze({
111
111
  type: Boolean,
112
112
  value: false,
113
113
  }),
114
- isQueued: Object.freeze({
114
+ isQueuedForUploading: Object.freeze({
115
+ type: Boolean,
116
+ value: false,
117
+ }),
118
+ isValidationPending: Object.freeze({
119
+ type: Boolean,
120
+ value: false,
121
+ }),
122
+ isQueuedForValidation: Object.freeze({
115
123
  type: Boolean,
116
124
  value: false,
117
125
  }),
@@ -55,9 +55,9 @@ export class CloudImageEditorBlock extends Block {
55
55
  }, TIMEOUT);
56
56
  const resizeObserver = new ResizeObserver(([element]) => {
57
57
  if (element.contentRect.width > 0 && element.contentRect.height > 0) {
58
- resolve();
59
58
  clearTimeout(timeoutId);
60
59
  resizeObserver.disconnect();
60
+ setTimeout(() => resolve(), 0);
61
61
  }
62
62
  });
63
63
  resizeObserver.observe(this);
@@ -1 +1 @@
1
- {"version":3,"file":"initialConfig.d.ts","sourceRoot":"","sources":["initialConfig.js"],"names":[],"mappings":"AAKA,gCAAiC,sBAAsB,CAAC;AACxD,+BAAgC,+BAA+B,CAAC;AAChE,sCAAuC,+BAA+B,CAAC;AACvE,+CAAgD,qBAAqB,CAAC;AAEtE,wDAAwD;AACxD,4BADW,OAAO,sBAAsB,EAAE,UAAU,CAgFjD"}
1
+ {"version":3,"file":"initialConfig.d.ts","sourceRoot":"","sources":["initialConfig.js"],"names":[],"mappings":"AAKA,gCAAiC,sBAAsB,CAAC;AACxD,+BAAgC,+BAA+B,CAAC;AAChE,sCAAuC,+BAA+B,CAAC;AACvE,+CAAgD,qBAAqB,CAAC;AAEtE,wDAAwD;AACxD,4BADW,OAAO,sBAAsB,EAAE,UAAU,CAkFjD"}
@@ -71,6 +71,8 @@ export const initialConfig = Object.freeze({
71
71
  iconHrefResolver: null,
72
72
  fileValidators: [],
73
73
  collectionValidators: [],
74
+ validationTimeout: 15 * 1000,
75
+ validationConcurrency: 100,
74
76
 
75
77
  cameraModes: 'photo, video',
76
78
  defaultCameraMode: null,
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeConfigValue.d.ts","sourceRoot":"","sources":["normalizeConfigValue.js"],"names":[],"mappings":"AAmHO,qCAL+C,CAAC,SAA1C,MAAO,OAAO,aAAa,EAAE,UAAW,OAC1C,CAAC,SACD,OAAO,GACL,OAAO,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAa3D"}
1
+ {"version":3,"file":"normalizeConfigValue.d.ts","sourceRoot":"","sources":["normalizeConfigValue.js"],"names":[],"mappings":"AAqHO,qCAL+C,CAAC,SAA1C,MAAO,OAAO,aAAa,EAAE,UAAW,OAC1C,CAAC,SACD,OAAO,GACL,OAAO,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAa3D"}
@@ -88,6 +88,8 @@ const mapping = {
88
88
  iconHrefResolver: /** @type {typeof asFunction<import('../../types').IconHrefResolver>} */ (asFunction),
89
89
  fileValidators: /** @type {typeof asArray<import('../../types').FileValidators>} */ (asArray),
90
90
  collectionValidators: /** @type {typeof asArray<import('../../types').CollectionValidators>} */ (asArray),
91
+ validationTimeout: asNumber,
92
+ validationConcurrency: asNumber,
91
93
 
92
94
  cameraModes: asCameraModes,
93
95
  defaultCameraMode: asCameraMode,
@@ -12,6 +12,7 @@ export class ExternalSource extends UploaderBlock {
12
12
  couldSelectAll: boolean;
13
13
  couldDeselectAll: boolean;
14
14
  showSelectionStatus: boolean;
15
+ showDoneBtn: boolean;
15
16
  counterText: string;
16
17
  doneBtnTextClass: string;
17
18
  toolbarVisible: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalSource.d.ts","sourceRoot":"","sources":["ExternalSource.js"],"names":[],"mappings":"AAkBA,+DAA+D;AAE/D;IAEE,yBAAiD;IAK/C;;;QAKE,6FAA6F;sBAAlF,OAAO,YAAY,EAAE,eAAe,CAAC,uBAAuB,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmC1F;IAGH,6BAA6B;IAC7B,sBADW,cAAc,CAOxB;IAgDD;;;OAGG;IACH,mCAcC;IAED;;;OAGG;IACH,iCAIC;IAED;;;OAGG;IACH,kCAsBC;IAED,eAAe;IACf,yBAIC;IAED,eAAe;IACf,mBAKC;IAED;;;OAGG;IACH,sBAKC;IAED,eAAe;IACf,kBAKC;IAED,eAAe;IACf,kBAkBC;IAED,eAAe;IACf,oBA8BC;IANC,eAAe;IACf,uBAA6D;IAO/D,eAAe;IACf,sBAMC;IAED,eAAe;IACf,6BASC;CACF;;;;6BAjRa;IAAE,kBAAkB,EAAE,MAAM,CAAA;CAAE;8BAdd,iCAAiC"}
1
+ {"version":3,"file":"ExternalSource.d.ts","sourceRoot":"","sources":["ExternalSource.js"],"names":[],"mappings":"AAkBA,+DAA+D;AAE/D;IAEE,yBAAiD;IAK/C;;;QAKE,6FAA6F;sBAAlF,OAAO,YAAY,EAAE,eAAe,CAAC,uBAAuB,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAuC1F;IAGH,6BAA6B;IAC7B,sBADW,cAAc,CAOxB;IAgDD;;;OAGG;IACH,mCAcC;IAED;;;OAGG;IACH,iCAIC;IAED;;;OAGG;IACH,kCA0BC;IAED,eAAe;IACf,yBAIC;IAED,eAAe;IACf,mBAKC;IAED;;;OAGG;IACH,sBAKC;IAED,eAAe;IACf,kBAKC;IAED,eAAe;IACf,kBAkBC;IAED,eAAe;IACf,oBA6BC;IANC,eAAe;IACf,uBAA6D;IAO/D,eAAe;IACf,sBAMC;IAED,eAAe;IACf,6BAUC;CACF;;;;6BAzRa;IAAE,kBAAkB,EAAE,MAAM,CAAA;CAAE;8BAdd,iCAAiC"}
@@ -3,13 +3,13 @@
3
3
  import { create } from '@symbiotejs/symbiote';
4
4
  import { ActivityBlock } from '../../abstract/ActivityBlock.js';
5
5
  import { UploaderBlock } from '../../abstract/UploaderBlock.js';
6
+ import { getTopLevelOrigin } from '../../utils/get-top-level-origin.js';
6
7
  import { stringToArray } from '../../utils/stringToArray.js';
7
8
  import { wildcardRegexp } from '../../utils/wildcardRegexp.js';
9
+ import { ExternalUploadSource } from '../utils/UploadSource.js';
8
10
  import { buildThemeDefinition } from './buildThemeDefinition.js';
9
11
  import { MessageBridge } from './MessageBridge.js';
10
12
  import { queryString } from './query-string.js';
11
- import { getTopLevelOrigin } from '../../utils/get-top-level-origin.js';
12
- import { ExternalUploadSource } from '../utils/UploadSource.js';
13
13
 
14
14
  /** @type {Record<string, string>} */
15
15
  const SOCIAL_SOURCE_MAPPING = {
@@ -39,6 +39,7 @@ export class ExternalSource extends UploaderBlock {
39
39
  couldSelectAll: false,
40
40
  couldDeselectAll: false,
41
41
  showSelectionStatus: false,
42
+ showDoneBtn: false,
42
43
  counterText: '',
43
44
  doneBtnTextClass: 'uc-hidden',
44
45
  toolbarVisible: true,
@@ -48,7 +49,10 @@ export class ExternalSource extends UploaderBlock {
48
49
  const url = this.extractUrlFromSelectedFile(message);
49
50
  const { filename } = message;
50
51
  const { externalSourceType } = this.activityParams;
51
- this.api.addFileFromUrl(url, { fileName: filename, source: externalSourceType });
52
+ this.api.addFileFromUrl(url, {
53
+ fileName: filename,
54
+ source: externalSourceType,
55
+ });
52
56
  }
53
57
 
54
58
  this.$['*currentActivity'] = ActivityBlock.activities.UPLOAD_LIST;
@@ -81,7 +85,7 @@ export class ExternalSource extends UploaderBlock {
81
85
  super.initCallback();
82
86
  this.registerActivity(this.activityType, {
83
87
  onActivate: () => {
84
- let { externalSourceType } = /** @type {ActivityParams} */ (this.activityParams);
88
+ const { externalSourceType } = /** @type {ActivityParams} */ (this.activityParams);
85
89
 
86
90
  if (!externalSourceType) {
87
91
  this.modalManager.close(this.$['*currentActivity']);
@@ -179,6 +183,10 @@ export class ExternalSource extends UploaderBlock {
179
183
  couldDeselectAll: message.selectedCount === message.total,
180
184
  selectedList: message.selectedFiles,
181
185
  });
186
+
187
+ if (!this.$.showDoneBtn && message.isReady) {
188
+ this.$.showDoneBtn = true;
189
+ }
182
190
  }
183
191
 
184
192
  /** @private */
@@ -239,8 +247,7 @@ export class ExternalSource extends UploaderBlock {
239
247
  /** @private */
240
248
  mountIframe() {
241
249
  /** @type {HTMLIFrameElement} */
242
- // @ts-ignore
243
- let iframe = create({
250
+ const iframe = create({
244
251
  tag: 'iframe',
245
252
  attributes: {
246
253
  src: this.remoteUrl(),
@@ -287,6 +294,7 @@ export class ExternalSource extends UploaderBlock {
287
294
  couldSelectAll: false,
288
295
  couldDeselectAll: false,
289
296
  showSelectionStatus: false,
297
+ showDoneBtn: false,
290
298
  });
291
299
  }
292
300
  }
@@ -311,7 +319,11 @@ ExternalSource.template = /* HTML */ `
311
319
  <button type="button" set="onclick: onSelectAll; @hidden: !couldSelectAll" l10n="select-all"></button>
312
320
  <button type="button" set="onclick: onDeselectAll; @hidden: !couldDeselectAll" l10n="deselect-all"></button>
313
321
  </div>
314
- <button type="button" class="uc-done-btn uc-primary-btn" set="onclick: onDone; @disabled: !isDoneBtnEnabled;">
322
+ <button
323
+ type="button"
324
+ class="uc-done-btn uc-primary-btn"
325
+ set="onclick: onDone; @disabled: !isDoneBtnEnabled; @hidden: !showDoneBtn"
326
+ >
315
327
  <uc-spinner set="@hidden: isSelectionReady"></uc-spinner>
316
328
  <span l10n="done" set="@class: doneBtnTextClass"></span>
317
329
  </button>
@@ -46,7 +46,7 @@ export class FileItem extends FileItemConfig {
46
46
  private _calculateState;
47
47
  /** @private */
48
48
  private _debouncedCalculateState;
49
- _updateHint: (...args: any[]) => void;
49
+ _updateHintAndProgress: (...args: any[]) => void;
50
50
  /**
51
51
  * @private
52
52
  * @param {String} id
@@ -1 +1 @@
1
- {"version":3,"file":"FileItem.d.ts","sourceRoot":"","sources":["FileItem.js"],"names":[],"mappings":"AAiBA;IAIE,eAAe;IACf,sBAAsB;IAKpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+CC;IAQH;;;OAGG;IACH,0BAUC;IAPC,qCAA2C;IAC3C,wCAA0C;IAQ5C,eAAe;IACf,wBAYG;IAEH,eAAe;IACf,iCAA0E;IAE1E,sCA4BE;IAEF;;;OAGG;IACH,uBAqCC;IAED,6BAA6B;IAC7B,4BADY,OAAO,QASlB;IAgDD,uCA+BE;IAaA,eAAe;IACf,kBAEE;IAUJ;;;MAEC;IAED;;;OAGG;IACH,uBAEC;IAED,0CAyGG;CACJ;;;;;+BA7Z8B,qBAAqB"}
1
+ {"version":3,"file":"FileItem.d.ts","sourceRoot":"","sources":["FileItem.js"],"names":[],"mappings":"AAoBA;IAIE,eAAe;IACf,sBAAsB;IAKpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA+CC;IAQH;;;OAGG;IACH,0BAUC;IAPC,qCAA2C;IAC3C,wCAA0C;IAQ5C,eAAe;IACf,wBAkBG;IAEH,eAAe;IACf,iCAA0E;IAE1E,iDAmCE;IAEF;;;OAGG;IACH,uBA4CC;IAED,6BAA6B;IAC7B,4BADY,OAAO,QASlB;IAgDD,uCAsBE;IAaA,eAAe;IACf,kBAEE;IAUJ;;;MAEC;IAED;;;OAGG;IACH,uBAEC;IAED,0CA8GG;CACJ;;;;;+BAhb8B,qBAAqB"}
@@ -12,6 +12,9 @@ const FileItemState = Object.freeze({
12
12
  FINISHED: Symbol('FINISHED'),
13
13
  FAILED: Symbol('FAILED'),
14
14
  UPLOADING: Symbol('UPLOADING'),
15
+ VALIDATION: Symbol('VALIDATION'),
16
+ QUEUED_UPLOADING: Symbol('QUEUED-UPLOADING'),
17
+ QUEUED_VALIDATION: Symbol('QUEUED-VALIDATION'),
15
18
  IDLE: Symbol('IDLE'),
16
19
  });
17
20
 
@@ -102,6 +105,12 @@ export class FileItem extends FileItemConfig {
102
105
 
103
106
  if (entry.getValue('errors').length > 0) {
104
107
  state = FileItemState.FAILED;
108
+ } else if (entry.getValue('isQueuedForUploading')) {
109
+ state = FileItemState.QUEUED_UPLOADING;
110
+ } else if (entry.getValue('isQueuedForValidation')) {
111
+ state = FileItemState.QUEUED_VALIDATION;
112
+ } else if (entry.getValue('isValidationPending')) {
113
+ state = FileItemState.VALIDATION;
105
114
  } else if (entry.getValue('isUploading')) {
106
115
  state = FileItemState.UPLOADING;
107
116
  } else if (entry.getValue('fileInfo')) {
@@ -114,34 +123,41 @@ export class FileItem extends FileItemConfig {
114
123
  /** @private */
115
124
  _debouncedCalculateState = debounce(this._calculateState.bind(this), 100);
116
125
 
117
- _updateHint = this._withEntry(
118
- throttle((entry) => {
119
- const source = entry.getValue('source');
120
- const externalUrl = entry.getValue('externalUrl');
121
- const noErrors = entry.getValue('errors').length === 0;
122
- const noProgress = this.$.progressValue === 0;
123
- const isUploading = this.$.state === FileItemState.UPLOADING;
124
- const isQueued = entry.getValue('isQueued');
125
-
126
- if (!noErrors || !isUploading || !noProgress) {
127
- this.$.hint = '';
128
- return;
129
- }
130
-
131
- if (isQueued) {
132
- const hint = this.l10n('queued');
133
- this.$.hint = hint;
134
- return;
135
- }
136
-
137
- if (externalUrl && source && Object.values(ExternalUploadSource).includes(source)) {
138
- const hint = this.l10n('waiting-for', { source: this.l10n(`src-type-${source}`) });
139
- this.$.hint = hint;
140
- return;
141
- }
126
+ _updateHintAndProgress = this._withEntry(
127
+ throttle(
128
+ /** @param {(typeof FileItemState)[keyof typeof FileItemState]} state */
129
+ (entry, state) => {
130
+ const errorText = entry.getValue('errors')?.[0]?.message;
131
+ const source = entry.getValue('source');
132
+ const externalUrl = entry.getValue('externalUrl');
133
+ const isUploading = state === FileItemState.UPLOADING;
134
+ const isQueuedForUploading = state === FileItemState.QUEUED_UPLOADING;
135
+ const isQueuedForValidation = state === FileItemState.QUEUED_VALIDATION;
136
+ const isValidationPending = state === FileItemState.VALIDATION;
137
+ const fileName = entry.getValue('fileName');
138
+ let hint = '';
139
+
140
+ if (errorText) {
141
+ hint = '';
142
+ } else if (externalUrl && source && Object.values(ExternalUploadSource).includes(source)) {
143
+ hint = this.l10n('waiting-for', { source: this.l10n(`src-type-${source}`) });
144
+ }
142
145
 
143
- this.$.hint = '';
144
- }, 100),
146
+ this.set$({
147
+ hint,
148
+ errorText: errorText,
149
+ progressVisible: isUploading || isQueuedForUploading || isQueuedForValidation || isValidationPending,
150
+ progressValue: isQueuedForValidation || isValidationPending ? 0 : entry.getValue('uploadProgress'),
151
+ ariaLabelStatusFile:
152
+ fileName &&
153
+ this.l10n('a11y-file-item-status', {
154
+ fileName,
155
+ status: this.l10n(state?.description?.toLocaleLowerCase() ?? '').toLocaleLowerCase(),
156
+ }),
157
+ });
158
+ },
159
+ 100,
160
+ ),
145
161
  );
146
162
 
147
163
  /**
@@ -158,13 +174,20 @@ export class FileItem extends FileItemConfig {
158
174
  return;
159
175
  }
160
176
 
161
- this._subEntry('uploadProgress', (uploadProgress) => {
162
- this.$.progressValue = uploadProgress;
163
- this._updateHint();
177
+ this._subEntry('isQueuedForValidation', () => {
178
+ this._debouncedCalculateState();
164
179
  });
165
180
 
166
- this._subEntry('isQueued', () => {
167
- this._updateHint();
181
+ this._subEntry('isValidationPending', () => {
182
+ this._debouncedCalculateState();
183
+ });
184
+
185
+ this._subEntry('uploadProgress', () => {
186
+ this._debouncedCalculateState();
187
+ });
188
+
189
+ this._subEntry('isQueuedForUploading', () => {
190
+ this._debouncedCalculateState();
168
191
  });
169
192
 
170
193
  this._subEntry('fileName', (name) => {
@@ -256,24 +279,15 @@ export class FileItem extends FileItemConfig {
256
279
  if (state === FileItemState.UPLOADING) {
257
280
  this.$.isFocused = false;
258
281
  }
259
- const fileName = entry.getValue('fileName');
260
282
 
261
283
  this.set$({
262
284
  isFailed: state === FileItemState.FAILED,
263
285
  isUploading: state === FileItemState.UPLOADING,
264
286
  isFinished: state === FileItemState.FINISHED,
265
- progressVisible: state === FileItemState.UPLOADING,
266
- isEditable: this.cfg.useCloudImageEditor && this._entry?.getValue('isImage') && this._entry?.getValue('cdnUrl'),
267
- errorText: entry.getValue('errors')?.[0]?.message,
268
- ariaLabelStatusFile:
269
- fileName &&
270
- this.l10n('a11y-file-item-status', {
271
- fileName,
272
- status: this.l10n(state?.description?.toLocaleLowerCase() ?? '').toLocaleLowerCase(),
273
- }),
287
+ isEditable: this.cfg.useCloudImageEditor && entry.getValue('isImage') && entry.getValue('cdnUrl'),
274
288
  });
275
289
 
276
- this._updateHint();
290
+ this._updateHintAndProgress(state);
277
291
  },
278
292
  );
279
293
 
@@ -318,7 +332,12 @@ export class FileItem extends FileItemConfig {
318
332
  return;
319
333
  }
320
334
 
321
- if (entry.getValue('fileInfo') || entry.getValue('isUploading') || entry.getValue('errors').length > 0) {
335
+ if (
336
+ entry.getValue('fileInfo') ||
337
+ entry.getValue('isUploading') ||
338
+ entry.getValue('errors').length > 0 ||
339
+ entry.getValue('isValidationPending')
340
+ ) {
322
341
  return;
323
342
  }
324
343
  const multipleMax = this.cfg.multiple ? this.cfg.multipleMax : 1;
@@ -326,20 +345,20 @@ export class FileItem extends FileItemConfig {
326
345
  return;
327
346
  }
328
347
 
329
- this._debouncedCalculateState();
330
-
331
348
  entry.setMultipleValues({
332
349
  isUploading: true,
333
350
  errors: [],
334
- isQueued: true,
351
+ isQueuedForUploading: true,
335
352
  });
336
353
 
354
+ this._debouncedCalculateState();
355
+
337
356
  try {
338
357
  let abortController = new AbortController();
339
358
  entry.setValue('abortController', abortController);
340
359
 
341
360
  const uploadTask = async () => {
342
- entry.setValue('isQueued', false);
361
+ entry.setValue('isQueuedForUploading', false);
343
362
  /** @type {Blob | File | null} */
344
363
  let file = entry.getValue('file');
345
364
  if (file && this.cfg.imageShrink) {
@@ -373,7 +392,7 @@ export class FileItem extends FileItemConfig {
373
392
  let fileInfo = await this.$['*uploadQueue'].add(uploadTask);
374
393
  entry.setMultipleValues({
375
394
  fileInfo,
376
- isQueued: false,
395
+ isQueuedForUploading: false,
377
396
  isUploading: false,
378
397
  fileName: fileInfo.originalFilename,
379
398
  fileSize: fileInfo.size,
@@ -5,6 +5,7 @@
5
5
  * succeed: number;
6
6
  * uploading: number;
7
7
  * failed: number;
8
+ * validatingBeforeUploading: number;
8
9
  * }} Summary
9
10
  */
10
11
  export class UploadList extends UploaderBlock {
@@ -55,6 +56,7 @@ export type Summary = {
55
56
  succeed: number;
56
57
  uploading: number;
57
58
  failed: number;
59
+ validatingBeforeUploading: number;
58
60
  };
59
61
  import { UploaderBlock } from '../../abstract/UploaderBlock.js';
60
62
  //# sourceMappingURL=UploadList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UploadList.d.ts","sourceRoot":"","sources":["UploadList.js"],"names":[],"mappings":"AAMA,+CAA+C;AAE/C;;;;;;;GAOG;AAEH;IAKE,4BAAoD;IAKlD;;;;;;;;;;;;;;;;;;;;;;;;;;MA0BC;IAGH,eAAe;IACf,yCASQ;IAER,eAAe;IACf,4BAuCC;IAED;;;OAGG;IACH,uBAmBC;CAwEF;;;;4BAvMa,MAAM,GAAG,MAAM;sBAGhB;IACR,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;8BAZ0B,iCAAiC"}
1
+ {"version":3,"file":"UploadList.d.ts","sourceRoot":"","sources":["UploadList.js"],"names":[],"mappings":"AAMA,+CAA+C;AAE/C;;;;;;;;GAQG;AAEH;IAKE,4BAAoD;IAKlD;;;;;;;;;;;;;;;;;;;;;;;;;;MA0BC;IAGH,eAAe;IACf,yCAaQ;IAER,eAAe;IACf,4BA2CC;IAED;;;OAGG;IACH,uBAsBC;CA0DF;;;;4BArMa,MAAM,GAAG,MAAM;sBAGhB;IACR,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB,EAAE,MAAM,CAAC;CACnC;8BAb0B,iCAAiC"}
@@ -12,6 +12,7 @@ import { throttle } from '../utils/throttle.js';
12
12
  * succeed: number;
13
13
  * uploading: number;
14
14
  * failed: number;
15
+ * validatingBeforeUploading: number;
15
16
  * }} Summary
16
17
  */
17
18
 
@@ -64,6 +65,10 @@ export class UploadList extends UploaderBlock {
64
65
  if (!this.couldOpenActivity && this.$['*currentActivity'] === this.activityType) {
65
66
  this.historyBack();
66
67
  }
68
+
69
+ if (!this.cfg.confirmUpload) {
70
+ this.api.uploadAll();
71
+ }
67
72
  }, 300);
68
73
 
69
74
  /** @private */
@@ -75,19 +80,21 @@ export class UploadList extends UploaderBlock {
75
80
  succeed: collectionState.successCount,
76
81
  uploading: collectionState.uploadingCount,
77
82
  failed: collectionState.failedCount,
83
+ validatingBeforeUploading: collectionState.idleEntries.filter((e) => e.isValidationPending).length,
78
84
  };
79
85
  const fitCountRestrictions = !collectionState.errors.some(
80
86
  (err) => err.type === 'TOO_MANY_FILES' || err.type === 'TOO_FEW_FILES',
81
87
  );
82
88
  const tooMany = collectionState.errors.some((err) => err.type === 'TOO_MANY_FILES');
83
89
  const exact = collectionState.totalCount === (this.cfg.multiple ? this.cfg.multipleMax : 1);
84
- const validationOk = summary.failed === 0 && collectionState.errors.length === 0;
90
+ const isValidationPending = collectionState.allEntries.some((entry) => entry.isValidationPending);
91
+ const validationOk = summary.failed === 0 && collectionState.errors.length === 0 && !isValidationPending;
85
92
  let uploadBtnVisible = false;
86
93
  let allDone = false;
87
94
  let doneBtnEnabled = false;
88
95
 
89
96
  const readyToUpload = summary.total - summary.succeed - summary.uploading - summary.failed;
90
- if (readyToUpload > 0 && fitCountRestrictions) {
97
+ if (readyToUpload > 0 && fitCountRestrictions && validationOk) {
91
98
  uploadBtnVisible = true;
92
99
  } else {
93
100
  allDone = true;
@@ -103,6 +110,8 @@ export class UploadList extends UploaderBlock {
103
110
 
104
111
  addMoreBtnEnabled: summary.total === 0 || (!tooMany && !exact),
105
112
  addMoreBtnVisible: !exact || this.cfg.multiple,
113
+
114
+ hasFiles: summary.total > 0,
106
115
  });
107
116
 
108
117
  this.bindL10n('headerText', () => this._getHeaderText(summary));
@@ -115,12 +124,15 @@ export class UploadList extends UploaderBlock {
115
124
  _getHeaderText(summary) {
116
125
  /** @param {keyof Summary} status */
117
126
  const localizedText = (status) => {
118
- const count = summary[status];
127
+ let count = summary[status];
128
+ if (status === 'uploading') {
129
+ count += summary.validatingBeforeUploading;
130
+ }
119
131
  return this.l10n(`header-${status}`, {
120
132
  count: count,
121
133
  });
122
134
  };
123
- if (summary.uploading > 0) {
135
+ if (summary.uploading > 0 || summary.validatingBeforeUploading > 0) {
124
136
  return localizedText('uploading');
125
137
  }
126
138
  if (summary.failed > 0) {
@@ -164,22 +176,7 @@ export class UploadList extends UploaderBlock {
164
176
  // TODO: could be performance issue on many files
165
177
  // there is no need to update buttons state on every progress tick
166
178
  this.uploadCollection.observeProperties(this._throttledHandleCollectionUpdate);
167
-
168
- this.sub(
169
- '*uploadList',
170
- (list) => {
171
- this._throttledHandleCollectionUpdate();
172
-
173
- this.set$({
174
- hasFiles: list.length > 0,
175
- });
176
-
177
- if (!this.cfg.confirmUpload) {
178
- this.api.uploadAll();
179
- }
180
- },
181
- false,
182
- );
179
+ this.uploadCollection.observeCollection(this._throttledHandleCollectionUpdate);
183
180
 
184
181
  this.sub(
185
182
  '*collectionErrors',
@@ -202,6 +199,7 @@ export class UploadList extends UploaderBlock {
202
199
  destroyCallback() {
203
200
  super.destroyCallback();
204
201
  this.uploadCollection.unobserveProperties(this._throttledHandleCollectionUpdate);
202
+ this.uploadCollection.unobserveCollection(this._throttledHandleCollectionUpdate);
205
203
  }
206
204
  }
207
205
 
package/env.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  /** Do not edit this file manually. It's generated during build process. */
2
2
  export const PACKAGE_NAME: "blocks";
3
- export const PACKAGE_VERSION: "1.22.0";
3
+ export const PACKAGE_VERSION: "1.23.1";
4
4
  //# sourceMappingURL=env.d.ts.map
package/env.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /** Do not edit this file manually. It's generated during build process. */
2
2
  export const PACKAGE_NAME = 'blocks';
3
- export const PACKAGE_VERSION = '1.22.0';
3
+ export const PACKAGE_VERSION = '1.23.1';
package/index.ssr.d.ts CHANGED
@@ -566,7 +566,7 @@ export namespace ModalEvents {
566
566
  let DESTROY: string;
567
567
  }
568
568
  export const PACKAGE_NAME: "blocks";
569
- export const PACKAGE_VERSION: "1.22.0";
569
+ export const PACKAGE_VERSION: "1.23.1";
570
570
  export const PresenceToggle: {
571
571
  new (): {};
572
572
  template: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.ssr.d.ts","sourceRoot":"","sources":["index.ssr.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;EAcE;AACF;;;;;;;;;;;;;;;EAcE;AACF;;;;;EAIE;AACF;;;;;;EAKE;AACF;;;;;;;;EAgBE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6IE;AACF;;;;;;;;EAuCE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CE;AACF;;;;;;;;EAuCE;AACF;;;;;;;EAwHE;AACF;;;;;;;EAaE;AACF;;;;;;;EAME;AACF;;;;;;;;;;;;;;;;EAeE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmEE;AACF;;;;;;;EAWE;AACF;;;;;;;EAWE;AACF;;;;;;;EAWE;AACF;;;;;;;EAWE;AACF;;;;;;;EASE;AACF;;;;;;EAKE;AACF;;;;;;;EAWE;AACF;;;;;;;EAME;AACF;;;;;;;EAWE;AACF;;;;;;;EA+IE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0EE;;;;;;;;;;;;;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqFE;AACF;;;;;;EAKE;AACF;;;;;;EAKE;AACF;;;;;;;EAME;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CE;AACF;;;;;;;;EAWE;AACF;;;;;;EAwBE;AACF;;;;;;;EAUE;AACF;;;;;;;;EAWE;;;;;;;;;AASF,oCAAqC;AACrC,uCAAwC;AACxC;;;;;;;EAME;AACF;;;;;;;EASE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgDE;AACF;;;;;;;EAME;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0DE;AACF;;;;;;;EAeE;AACF;;;;;;EAKE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDE;AACF;;;;;;EAKE;AACF;;;;;;EAKE;AACF;;;;;;;;;;;;;;;;EAeE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuDE;AACF;;;;;;;;;;;;EAWE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqEE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuGE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6EE;AACK,yCAAiC;AACjC,qCAA6B;AAC7B,6CAAqC;AACrC,oCAA4B"}
1
+ {"version":3,"file":"index.ssr.d.ts","sourceRoot":"","sources":["index.ssr.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;EAcE;AACF;;;;;;;;;;;;;;;EAcE;AACF;;;;;EAIE;AACF;;;;;;EAKE;AACF;;;;;;;;EAgBE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6IE;AACF;;;;;;;;EAuCE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CE;AACF;;;;;;;;EAuCE;AACF;;;;;;;EA4HE;AACF;;;;;;;EAaE;AACF;;;;;;;EAME;AACF;;;;;;;;;;;;;;;;EAeE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmEE;AACF;;;;;;;EAWE;AACF;;;;;;;EAWE;AACF;;;;;;;EAWE;AACF;;;;;;;EAWE;AACF;;;;;;;EASE;AACF;;;;;;EAKE;AACF;;;;;;;EAWE;AACF;;;;;;;EAME;AACF;;;;;;;EAWE;AACF;;;;;;;EA+IE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8EE;;;;;;;;;;;;;AAaF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqFE;AACF;;;;;;EAKE;AACF;;;;;;EAKE;AACF;;;;;;;EAME;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CE;AACF;;;;;;;;EAWE;AACF;;;;;;EAwBE;AACF;;;;;;;EAUE;AACF;;;;;;;;EAWE;;;;;;;;;AASF,oCAAqC;AACrC,uCAAwC;AACxC;;;;;;;EAME;AACF;;;;;;;EASE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgDE;AACF;;;;;;;EAME;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0DE;AACF;;;;;;;EAeE;AACF;;;;;;EAKE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDE;AACF;;;;;;EAKE;AACF;;;;;;EAKE;AACF;;;;;;;;;;;;;;;;EAeE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuDE;AACF;;;;;;;;;;;;EAWE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqEE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuGE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6EE;AACK,yCAAiC;AACjC,qCAA6B;AAC7B,6CAAqC;AACrC,oCAA4B"}
package/index.ssr.js CHANGED
@@ -376,6 +376,8 @@ export const Config = class {
376
376
  "user-agent-integration",
377
377
  "locale-name",
378
378
  "secure-uploads-expire-threshold",
379
+ "validation-timeout",
380
+ "validation-concurrency",
379
381
  "camera-modes",
380
382
  "default-camera-mode",
381
383
  "enable-audio-recording",
@@ -430,6 +432,8 @@ export const Config = class {
430
432
  "useragentintegration",
431
433
  "localename",
432
434
  "secureuploadsexpirethreshold",
435
+ "validationtimeout",
436
+ "validationconcurrency",
433
437
  "cameramodes",
434
438
  "defaultcameramode",
435
439
  "enableaudiorecording",
@@ -812,7 +816,11 @@ export const ExternalSource = class {
812
816
  <button type="button" set="onclick: onSelectAll; @hidden: !couldSelectAll" l10n="select-all"></button>
813
817
  <button type="button" set="onclick: onDeselectAll; @hidden: !couldDeselectAll" l10n="deselect-all"></button>
814
818
  </div>
815
- <button type="button" class="uc-done-btn uc-primary-btn" set="onclick: onDone; @disabled: !isDoneBtnEnabled;">
819
+ <button
820
+ type="button"
821
+ class="uc-done-btn uc-primary-btn"
822
+ set="onclick: onDone; @disabled: !isDoneBtnEnabled; @hidden: !showDoneBtn"
823
+ >
816
824
  <uc-spinner set="@hidden: isSelectionReady"></uc-spinner>
817
825
  <span l10n="done" set="@class: doneBtnTextClass"></span>
818
826
  </button>
@@ -1100,7 +1108,7 @@ export const ModalEvents = {
1100
1108
  DESTROY: "modal:destroy",
1101
1109
  };
1102
1110
  export const PACKAGE_NAME = `blocks`;
1103
- export const PACKAGE_VERSION = `1.22.0`;
1111
+ export const PACKAGE_VERSION = `1.23.1`;
1104
1112
  export const PresenceToggle = class {
1105
1113
  static template = `<slot></slot> `;
1106
1114
  static reg = () => {};
@@ -126,9 +126,11 @@ declare const _default: {
126
126
  failed: string;
127
127
  uploading: string;
128
128
  idle: string;
129
- queued: string;
130
129
  'a11y-file-item-status': string;
131
130
  'waiting-for': string;
131
+ 'queued-uploading': string;
132
+ 'queued-validation': string;
133
+ validation: string;
132
134
  'a11y-cloud-editor-apply-aspect-ratio': string;
133
135
  'crop-to-shape': string;
134
136
  custom: string;
@@ -63,7 +63,7 @@ export default {
63
63
  'src-type-vk': 'VK',
64
64
  'src-type-evernote': 'Evernote',
65
65
  'src-type-box': 'Box',
66
- 'src-type-onedrive': 'Onedrive',
66
+ 'src-type-onedrive': 'OneDrive',
67
67
  'src-type-huddle': 'Huddle',
68
68
  'src-type-other': 'أخرى',
69
69
  'src-type-mobile-video-camera': 'فيديو',
@@ -127,9 +127,11 @@ export default {
127
127
  failed: 'فشل',
128
128
  uploading: 'جارٍ التحميل',
129
129
  idle: 'خامل',
130
- queued: 'في الانتظار',
131
130
  'a11y-file-item-status': 'الملف {{fileName}} في حالة {{status}}',
132
131
  'waiting-for': 'في انتظار {{source}}',
132
+ 'queued-uploading': 'في انتظار الرفع',
133
+ 'queued-validation': 'في انتظار التحقق',
134
+ validation: 'جارٍ التحقق',
133
135
  'a11y-cloud-editor-apply-aspect-ratio': 'تطبيق عملية {{name}} {{value}}',
134
136
  'crop-to-shape': 'اقتصاص إلى {{value}}',
135
137
  custom: 'حر الشكل',
@@ -118,9 +118,11 @@ declare const _default: {
118
118
  failed: string;
119
119
  uploading: string;
120
120
  idle: string;
121
- queued: string;
122
121
  'a11y-file-item-status': string;
123
122
  'waiting-for': string;
123
+ 'queued-uploading': string;
124
+ 'queued-validation': string;
125
+ validation: string;
124
126
  'a11y-cloud-editor-apply-aspect-ratio': string;
125
127
  'crop-to-shape': string;
126
128
  custom: string;
@@ -55,7 +55,7 @@ export default {
55
55
  'src-type-vk': 'VK',
56
56
  'src-type-evernote': 'Evernote',
57
57
  'src-type-box': 'Box',
58
- 'src-type-onedrive': 'Onedrive',
58
+ 'src-type-onedrive': 'OneDrive',
59
59
  'src-type-huddle': 'Huddle',
60
60
  'src-type-other': 'Digər',
61
61
  'src-type-mobile-video-camera': 'Video',
@@ -119,9 +119,12 @@ export default {
119
119
  failed: 'Uğursuz',
120
120
  uploading: 'Yüklənir',
121
121
  idle: 'Boş',
122
- queued: 'Növbədə',
122
+
123
123
  'a11y-file-item-status': '{{fileName}} faylı {{status}} statusundadır',
124
124
  'waiting-for': '{{source}} gözlənilir',
125
+ 'queued-uploading': 'Yükləmə üçün növbədə',
126
+ 'queued-validation': 'Doğrulama üçün növbədə',
127
+ validation: 'Doğrulanır',
125
128
  'a11y-cloud-editor-apply-aspect-ratio': '{{name}} {{value}} əməliyyatını tətbiq et',
126
129
  'crop-to-shape': '{{value}} ölçüsünə kəs',
127
130