apostrophe 3.63.3 → 4.1.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 (184) hide show
  1. package/.eslintrc +13 -4
  2. package/CHANGELOG.md +37 -5
  3. package/defaults.js +2 -1
  4. package/modules/@apostrophecms/admin-bar/ui/apos/apps/AposAdminBar.js +7 -17
  5. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBar.vue +14 -16
  6. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarLocale.vue +1 -1
  7. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarMenu.vue +22 -15
  8. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarUser.vue +2 -2
  9. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextBar.vue +13 -8
  10. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextModeAndSettings.vue +18 -10
  11. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextTitle.vue +4 -4
  12. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextUndoRedo.vue +14 -8
  13. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposSavingIndicator.vue +2 -1
  14. package/modules/@apostrophecms/area/ui/apos/apps/AposAreas.js +36 -54
  15. package/modules/@apostrophecms/area/ui/apos/components/AposAreaContextualMenu.vue +20 -25
  16. package/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +5 -12
  17. package/modules/@apostrophecms/area/ui/apos/components/AposAreaExpandedMenu.vue +11 -3
  18. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenu.vue +6 -6
  19. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenuItem.vue +3 -2
  20. package/modules/@apostrophecms/area/ui/apos/components/AposAreaWidget.vue +31 -44
  21. package/modules/@apostrophecms/area/ui/apos/components/AposWidgetControls.vue +16 -16
  22. package/modules/@apostrophecms/asset/index.js +25 -12
  23. package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.config.js +3 -3
  24. package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.vue.js +7 -1
  25. package/modules/@apostrophecms/attachment/index.js +2 -1
  26. package/modules/@apostrophecms/attachment/public/img/missing-icon.svg +14 -0
  27. package/modules/@apostrophecms/busy/ui/apos/apps/AposBusy.js +8 -7
  28. package/modules/@apostrophecms/busy/ui/apos/components/TheAposBusy.vue +1 -1
  29. package/modules/@apostrophecms/command-menu/ui/apos/apps/AposCommandMenu.js +11 -29
  30. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuKey.vue +1 -1
  31. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuShortcut.vue +6 -6
  32. package/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +10 -7
  33. package/modules/@apostrophecms/doc-type/index.js +34 -13
  34. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocContextMenu.vue +3 -3
  35. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +20 -15
  36. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +1 -1
  37. package/modules/@apostrophecms/i18n/i18n/en.json +13 -0
  38. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +209 -33
  39. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalizeErrors.vue +3 -3
  40. package/modules/@apostrophecms/image/ui/apos/components/AposImageCropper.vue +5 -5
  41. package/modules/@apostrophecms/image/ui/apos/components/AposImageRelationshipEditor.vue +6 -6
  42. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +23 -16
  43. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +11 -11
  44. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +28 -21
  45. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +4 -3
  46. package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +5 -4
  47. package/modules/@apostrophecms/login/index.js +18 -1
  48. package/modules/@apostrophecms/login/ui/apos/apps/AposLogin.js +6 -7
  49. package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -3
  50. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +10 -10
  51. package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +3 -3
  52. package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -2
  53. package/modules/@apostrophecms/login/ui/apos/logic/AposLoginForm.js +1 -16
  54. package/modules/@apostrophecms/modal/ui/apos/apps/AposModals.js +60 -87
  55. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +15 -11
  56. package/modules/@apostrophecms/modal/ui/apos/components/AposModal.vue +17 -11
  57. package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +7 -4
  58. package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +9 -9
  59. package/modules/@apostrophecms/modal/ui/apos/components/AposModalLip.vue +2 -2
  60. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -8
  61. package/modules/@apostrophecms/modal/ui/apos/components/AposModalTabs.vue +4 -3
  62. package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +7 -7
  63. package/modules/@apostrophecms/modal/ui/apos/components/TheAposModals.vue +22 -4
  64. package/modules/@apostrophecms/modal/ui/apos/composables/AposFocus.js +95 -0
  65. package/modules/@apostrophecms/modal/ui/apos/mixins/AposDocsManagerMixin.js +2 -3
  66. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +6 -0
  67. package/modules/@apostrophecms/notification/index.js +4 -4
  68. package/modules/@apostrophecms/notification/ui/apos/apps/AposNotification.js +6 -9
  69. package/modules/@apostrophecms/notification/ui/apos/components/AposNotification.vue +12 -8
  70. package/modules/@apostrophecms/notification/ui/apos/components/TheAposNotifications.vue +4 -2
  71. package/modules/@apostrophecms/oembed-field/ui/apos/components/AposInputOembed.vue +12 -10
  72. package/modules/@apostrophecms/page/index.js +1 -0
  73. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +15 -11
  74. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +1 -1
  75. package/modules/@apostrophecms/permission/ui/apos/components/AposInputRole.vue +3 -3
  76. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +25 -17
  77. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerDisplay.vue +24 -20
  78. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerSelectBox.vue +9 -5
  79. package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +15 -11
  80. package/modules/@apostrophecms/rich-text-widget/index.js +1 -0
  81. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +7 -6
  82. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +31 -30
  83. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +12 -10
  84. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapButton.vue +1 -1
  85. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapImage.vue +1 -1
  86. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +9 -8
  87. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapStyles.vue +3 -3
  88. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapTable.vue +3 -3
  89. package/modules/@apostrophecms/schema/index.js +69 -8
  90. package/modules/@apostrophecms/schema/lib/addFieldTypes.js +1 -1
  91. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +10 -8
  92. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +5 -3
  93. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +81 -277
  94. package/modules/@apostrophecms/schema/ui/apos/components/AposInputAttachment.vue +4 -2
  95. package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +24 -14
  96. package/modules/@apostrophecms/schema/ui/apos/components/AposInputCheckboxes.vue +7 -6
  97. package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +10 -7
  98. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +3 -3
  99. package/modules/@apostrophecms/schema/ui/apos/components/AposInputPassword.vue +6 -4
  100. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +5 -4
  101. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRange.vue +9 -6
  102. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +15 -12
  103. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSelect.vue +1 -1
  104. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +16 -12
  105. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +19 -11
  106. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +15 -12
  107. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +75 -22
  108. package/modules/@apostrophecms/schema/ui/apos/components/AposSearchList.vue +1 -1
  109. package/modules/@apostrophecms/schema/ui/apos/components/AposSubform.vue +2 -2
  110. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +0 -4
  111. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +3 -3
  112. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +15 -4
  113. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputAttachment.js +3 -3
  114. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputCheckboxes.js +7 -7
  115. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputColor.js +5 -8
  116. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputDateAndTime.js +1 -1
  117. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +1 -1
  118. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRadio.js +1 -1
  119. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +12 -9
  120. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSelect.js +3 -3
  121. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +7 -9
  122. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputWrapper.js +4 -4
  123. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +42 -13
  124. package/modules/@apostrophecms/schema/ui/apos/logic/AposSubform.js +1 -1
  125. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +9 -9
  126. package/modules/@apostrophecms/schema/ui/apos/scss/AposInputArray.scss +205 -0
  127. package/modules/@apostrophecms/settings/ui/apos/components/AposSettingsManager.vue +5 -5
  128. package/modules/@apostrophecms/settings/ui/apos/logic/AposSettingsManager.js +4 -4
  129. package/modules/@apostrophecms/submitted-draft/ui/apos/components/AposSubmittedDraftIcon.vue +5 -4
  130. package/modules/@apostrophecms/task/index.js +2 -0
  131. package/modules/@apostrophecms/translation/index.js +233 -0
  132. package/modules/@apostrophecms/translation/ui/apos/components/AposTranslationIndicator.vue +84 -0
  133. package/modules/@apostrophecms/ui/ui/apos/components/AposAvatar.vue +2 -1
  134. package/modules/@apostrophecms/ui/ui/apos/components/AposButton.vue +4 -4
  135. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonGroup.vue +6 -6
  136. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonSplit.vue +120 -113
  137. package/modules/@apostrophecms/ui/ui/apos/components/AposCellButton.vue +2 -1
  138. package/modules/@apostrophecms/ui/ui/apos/components/AposCellLabels.vue +49 -5
  139. package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +19 -19
  140. package/modules/@apostrophecms/ui/ui/apos/components/AposCloudUploadIcon.vue +10 -5
  141. package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +15 -15
  142. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +214 -191
  143. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuDialog.vue +77 -65
  144. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuItem.vue +1 -1
  145. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuTip.vue +28 -50
  146. package/modules/@apostrophecms/ui/ui/apos/components/AposEmptyState.vue +3 -3
  147. package/modules/@apostrophecms/ui/ui/apos/components/AposFile.vue +5 -5
  148. package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +4 -4
  149. package/modules/@apostrophecms/ui/ui/apos/components/AposIndicator.vue +1 -1
  150. package/modules/@apostrophecms/ui/ui/apos/components/AposLabel.vue +1 -1
  151. package/modules/@apostrophecms/ui/ui/apos/components/AposMinMaxCount.vue +5 -5
  152. package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +14 -8
  153. package/modules/@apostrophecms/ui/ui/apos/components/AposPagerDots.vue +2 -1
  154. package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +13 -12
  155. package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +53 -59
  156. package/modules/@apostrophecms/ui/ui/apos/components/AposSpinner.vue +2 -2
  157. package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +2 -2
  158. package/modules/@apostrophecms/ui/ui/apos/components/AposTag.vue +3 -2
  159. package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +40 -35
  160. package/modules/@apostrophecms/ui/ui/apos/components/AposTagListItem.vue +2 -1
  161. package/modules/@apostrophecms/ui/ui/apos/components/AposToggle.vue +2 -2
  162. package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +9 -11
  163. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeHeader.vue +5 -3
  164. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +129 -129
  165. package/modules/@apostrophecms/ui/ui/apos/composables/AposTheme.js +11 -0
  166. package/modules/@apostrophecms/ui/ui/apos/lib/click-outside-element.js +4 -4
  167. package/modules/@apostrophecms/ui/ui/apos/lib/i18next.js +56 -50
  168. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip.js +191 -0
  169. package/modules/@apostrophecms/ui/ui/apos/lib/vue.js +19 -10
  170. package/modules/@apostrophecms/ui/ui/apos/mixins/AposAdvisoryLockMixin.js +1 -1
  171. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tables.scss +1 -1
  172. package/modules/@apostrophecms/ui/ui/apos/scss/global/_theme.scss +1 -0
  173. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tooltips.scss +6 -22
  174. package/modules/@apostrophecms/ui/ui/apos/scss/shared/_table-rows.scss +1 -1
  175. package/modules/@apostrophecms/widget-type/index.js +8 -2
  176. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +26 -22
  177. package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +4 -4
  178. package/package.json +31 -44
  179. package/test/attachments.js +5 -0
  180. package/test/schemas.js +138 -0
  181. package/test/translation.js +538 -0
  182. package/test-lib/util.js +21 -0
  183. package/modules/@apostrophecms/ui/ui/apos/lib/localized-v-tooltip.js +0 -63
  184. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip-options.js +0 -13
@@ -24,12 +24,7 @@ export default {
24
24
  return {
25
25
  previousKey: '',
26
26
  modal: 'default',
27
- keyboardShortcutListener() {},
28
- delay(resolve, ms) {
29
- return new Promise(() => {
30
- setTimeout(resolve, ms);
31
- });
32
- }
27
+ keyboardShortcutListener() {}
33
28
  };
34
29
  },
35
30
  computed: {
@@ -90,13 +85,21 @@ export default {
90
85
  apos.bus.$on('modal-launched', this.updateModal);
91
86
  apos.bus.$on('modal-resolved', this.updateModal);
92
87
  },
93
- beforeDestroy() {
88
+ beforeUnmount() {
94
89
  document.removeEventListener('keydown', this.keyboardShortcutListener);
95
90
 
96
91
  apos.bus.$off('modal-launched', this.updateModal);
97
92
  apos.bus.$off('modal-resolved', this.updateModal);
98
93
  },
99
94
  methods: {
95
+ delay(resolve, ms) {
96
+ return new Promise(() => {
97
+ setTimeout(resolve, ms);
98
+ });
99
+ },
100
+ getModal() {
101
+ return this.modal;
102
+ },
100
103
  getFirstNonShortcutModal(index = -1) {
101
104
  const modal = apos.modal.getAt(index);
102
105
  const properties = apos.modal.getProperties(modal.id);
@@ -1047,6 +1047,7 @@ module.exports = {
1047
1047
  locale: toLocale,
1048
1048
  mode: 'draft'
1049
1049
  });
1050
+
1050
1051
  const toId = draft._id.replace(`:${draft.aposLocale}`, `:${toLocale}:draft`);
1051
1052
  const actionModule = self.apos.page.isPage(draft) ? self.apos.page : self;
1052
1053
  // Use findForEditing so that we are successful even for edge cases
@@ -1059,17 +1060,26 @@ module.exports = {
1059
1060
  const existing = await actionModule.findForEditing(toReq, {
1060
1061
  _id: toId
1061
1062
  }).permission('view').toObject();
1063
+
1064
+ const eventOptions = {
1065
+ source: draft.aposLocale.split(':')[0],
1066
+ target: toLocale,
1067
+ existing: Boolean(existing)
1068
+ };
1069
+
1062
1070
  // We only want to copy schema properties, leave non-schema
1063
1071
  // properties of the source document alone
1064
- const data = Object.fromEntries(Object.entries(draft).filter(([ key, value ]) => self.schema.find(field => field.name === key)));
1072
+ const data = Object.fromEntries(Object.entries(draft)
1073
+ .filter(
1074
+ ([ key, value ]) => key === 'type' || self.schema.find(field => field.name === key)
1075
+ ));
1065
1076
  // We need a slug even if removed from the schema for editing purposes
1066
1077
  data.slug = draft.slug;
1067
1078
  let result;
1068
1079
  if (!existing) {
1069
1080
  if (self.apos.page.isPage(draft)) {
1070
1081
  if (!draft.level) {
1071
- // Replicating the home page for the first time
1072
- result = await self.apos.doc.insert(toReq, {
1082
+ const insert = {
1073
1083
  ...data,
1074
1084
  aposDocId: draft.aposDocId,
1075
1085
  aposLocale: `${toLocale}:draft`,
@@ -1079,7 +1089,10 @@ module.exports = {
1079
1089
  rank: draft.rank,
1080
1090
  parked: draft.parked,
1081
1091
  parkedId: draft.parkedId
1082
- });
1092
+ };
1093
+ await self.emit('beforeLocalize', req, insert, eventOptions);
1094
+ // Replicating the home page for the first time
1095
+ result = await self.apos.doc.insert(toReq, insert);
1083
1096
  } else {
1084
1097
  // A page that is not the home page, being replicated for the first time
1085
1098
  let { lastTargetId, lastPosition } = await self.apos.page.inferLastTargetIdAndPosition(draft);
@@ -1137,25 +1150,29 @@ module.exports = {
1137
1150
  lastPosition = 'lastChild';
1138
1151
  }
1139
1152
  }
1153
+ const insert = {
1154
+ ...data,
1155
+ aposLocale: `${toLocale}:draft`,
1156
+ _id: toId,
1157
+ parked: draft.parked,
1158
+ parkedId: draft.parkedId
1159
+ };
1160
+ await self.emit('beforeLocalize', req, insert, eventOptions);
1140
1161
  result = await actionModule.insert(toReq,
1141
1162
  localizedTargetId,
1142
1163
  lastPosition,
1143
- {
1144
- ...data,
1145
- aposLocale: `${toLocale}:draft`,
1146
- _id: toId,
1147
- parked: draft.parked,
1148
- parkedId: draft.parkedId
1149
- }
1164
+ insert
1150
1165
  );
1151
1166
  }
1152
1167
  } else {
1153
- result = await actionModule.insert(toReq, {
1168
+ const insert = {
1154
1169
  ...data,
1155
1170
  aposDocId: draft.aposDocId,
1156
1171
  aposLocale: `${toLocale}:draft`,
1157
1172
  _id: toId
1158
- });
1173
+ };
1174
+ await self.emit('beforeLocalize', req, insert, eventOptions);
1175
+ result = await actionModule.insert(toReq, insert);
1159
1176
  }
1160
1177
  } else {
1161
1178
  if (!options.update) {
@@ -1169,8 +1186,12 @@ module.exports = {
1169
1186
  aposLocale: `${toLocale}:draft`,
1170
1187
  metaType: 'doc'
1171
1188
  };
1189
+ await self.emit('beforeLocalize', req, update, eventOptions);
1172
1190
  result = await actionModule.update(toReq, update);
1173
1191
  }
1192
+
1193
+ await self.emit('afterLocalize', req, draft, result, eventOptions);
1194
+
1174
1195
  return result;
1175
1196
  },
1176
1197
  // Reverts the given draft to the most recent publication.
@@ -4,9 +4,6 @@
4
4
  :menu="menu"
5
5
  :disabled="disabled || (menu.length === 0)"
6
6
  menu-placement="bottom-end"
7
- @item-clicked="menuHandler"
8
- @open="$emit('menu-open')"
9
- @close="$emit('menu-close')"
10
7
  :button="{
11
8
  tooltip: { content: 'apostrophe:moreOptions', placement: 'bottom' },
12
9
  label: 'apostrophe:moreOptions',
@@ -15,6 +12,9 @@
15
12
  type: 'subtle',
16
13
  modifiers: ['small', 'no-motion']
17
14
  }"
15
+ @item-clicked="menuHandler"
16
+ @open="$emit('menu-open')"
17
+ @close="$emit('menu-close')"
18
18
  />
19
19
  </template>
20
20
 
@@ -1,13 +1,17 @@
1
1
  <template>
2
2
  <AposModal
3
- class="apos-doc-editor" :modal="modal"
3
+ class="apos-doc-editor"
4
+ :modal="modal"
4
5
  :modal-title="modalTitle"
5
- @inactive="modal.active = false" @show-modal="modal.showModal = true"
6
- @esc="confirmAndCancel" @no-modal="$emit('safe-close')"
6
+ @inactive="modal.active = false"
7
+ @show-modal="modal.showModal = true"
8
+ @esc="confirmAndCancel"
9
+ @no-modal="$emit('safe-close')"
7
10
  >
8
11
  <template #secondaryControls>
9
12
  <AposButton
10
- type="default" label="apostrophe:cancel"
13
+ type="default"
14
+ label="apostrophe:cancel"
11
15
  @click="confirmAndCancel"
12
16
  />
13
17
  </template>
@@ -24,10 +28,11 @@
24
28
  />
25
29
  <AposButton
26
30
  v-if="restoreOnly"
27
- type="primary" :label="saveLabel"
31
+ type="primary"
32
+ :label="saveLabel"
28
33
  :disabled="saveDisabled"
29
- @click="onRestore"
30
34
  :tooltip="errorTooltip"
35
+ @click="onRestore"
31
36
  />
32
37
  <AposButtonSplit
33
38
  v-else-if="saveMenu"
@@ -42,8 +47,8 @@
42
47
  <template #leftRail>
43
48
  <AposModalRail>
44
49
  <AposModalTabs
45
- :key="tabKey"
46
50
  v-if="tabs.length"
51
+ :key="tabKey"
47
52
  :current="currentTab"
48
53
  :tabs="tabs"
49
54
  :errors="fieldErrors"
@@ -59,6 +64,7 @@
59
64
  v-for="tab in tabs"
60
65
  v-show="tab.name === currentTab"
61
66
  :key="tab.name"
67
+ :ref="tab.name"
62
68
  :changed="changed"
63
69
  :schema="groups[tab.name].schema"
64
70
  :current-fields="groups[tab.name].fields"
@@ -67,12 +73,11 @@
67
73
  :following-values="followingValues('other')"
68
74
  :conditional-fields="conditionalFields"
69
75
  :doc-id="docId"
70
- :value="docFields"
76
+ :model-value="docFields"
71
77
  :meta="docMeta"
72
78
  :server-errors="serverErrors"
73
- :ref="tab.name"
74
79
  :generation="generation"
75
- @input="updateDocFields"
80
+ @update:model-value="updateDocFields"
76
81
  @validate="triggerValidate"
77
82
  @update-doc-data="onUpdateDocFields"
78
83
  />
@@ -85,6 +90,7 @@
85
90
  <div class="apos-doc-editor__utility">
86
91
  <AposSchema
87
92
  v-if="docReady"
93
+ ref="utilitySchema"
88
94
  :schema="groups['utility'].schema"
89
95
  :changed="changed"
90
96
  :current-fields="groups['utility'].fields"
@@ -93,14 +99,13 @@
93
99
  :following-values="followingUtils"
94
100
  :conditional-fields="conditionalFields"
95
101
  :doc-id="docId"
96
- :value="docFields"
102
+ :model-value="docFields"
97
103
  :meta="docMeta"
98
- @input="updateDocFields"
99
- @validate="triggerValidate"
100
104
  :modifiers="['small', 'inverted']"
101
- ref="utilitySchema"
102
105
  :server-errors="serverErrors"
103
106
  :generation="generation"
107
+ @update:model-value="updateDocFields"
108
+ @validate="triggerValidate"
104
109
  />
105
110
  </div>
106
111
  </AposModalRail>
@@ -423,7 +428,7 @@ export default {
423
428
  }
424
429
  apos.bus.$on('content-changed', this.onContentChanged);
425
430
  },
426
- destroyed() {
431
+ unmounted() {
427
432
  apos.bus.$off('content-changed', this.onContentChanged);
428
433
  },
429
434
  methods: {
@@ -356,7 +356,7 @@ export default {
356
356
  apos.bus.$on('content-changed', this.onContentChanged);
357
357
  apos.bus.$on('command-menu-admin-bar-discard-draft', this.customDiscardDraft);
358
358
  },
359
- destroyed() {
359
+ unmounted() {
360
360
  apos.bus.$off('content-changed', this.onContentChanged);
361
361
  apos.bus.$off('command-menu-admin-bar-discard-draft', this.customDiscardDraft);
362
362
  },
@@ -45,6 +45,15 @@
45
45
  "assetWebpackCacheCleared": "Build cache cleared.",
46
46
  "assetWebpackConfigWarning": "⚠️ In the module {{ module }}, your webpack config is incorrect. It must be an object and should contain only the properties: {{ properties }}.",
47
47
  "at": "at",
48
+ "automaticTranslationCheckbox": "Translate text content",
49
+ "automaticTranslationErrMsg": "An error happened while getting available languages for translation. Translation will be skipped.",
50
+ "automaticTranslationErrorNoProvider": "Translation provider not found. Page \"{{ title }}\" was not translated.",
51
+ "automaticTranslationErrorTargets": "Badly formatted translation targets.",
52
+ "automaticTranslationLngCheckNoProvider": "Translation provider not found.",
53
+ "automaticTranslationSettings": "Automatic translation settings",
54
+ "automaticTranslationSourceErrMsg": "The current locale <strong>{{ source }}</strong> is not suitable for translation. Translation will be skipped.",
55
+ "automaticTranslationTargetErrMsg": "Could not find a suitable language for the locale <strong>{{ targets }}</strong>. Translation will be skipped for this locale.",
56
+ "automaticTranslationTargetErrMsg_plural": "Could not find a suitable language for the locales <strong>{{ targets }}</strong>. Translation will be skipped for these locales.",
48
57
  "back": "Back",
49
58
  "backToHome": "Back to Home",
50
59
  "basics": "Basics",
@@ -149,6 +158,8 @@
149
158
  "email": "Email",
150
159
  "emptyRichTextWidget": "Empty Rich Text Widget",
151
160
  "enabled": "Enabled",
161
+ "enterPassword": "Enter password",
162
+ "enterUsername": "Enter username",
152
163
  "error": "An error occurred",
153
164
  "errorBatchOperationNoti": "Batch operation {{ operation }} failed.",
154
165
  "errorCount": "{{ count }} error remaining",
@@ -281,6 +292,7 @@
281
292
  "noNewRelatedDocuments": "Although this document has related documents, none of them are new to the locales you have selected.",
282
293
  "noTypeFound": "No {{ type }} Found",
283
294
  "none": "None",
295
+ "notAvailable": "n/a",
284
296
  "notFound": "Not found.",
285
297
  "notFoundPageMessage": "We can't seem to find the page you're looking for.",
286
298
  "notFoundPageStatusCode": "404",
@@ -366,6 +378,7 @@
366
378
  "restoredPrevious": "Restored previously published version.",
367
379
  "resumeEditing": "Resume Editing",
368
380
  "retryingSaveDocument": "Retrying save document...",
381
+ "retry": "Retry",
369
382
  "returnToPage": "Return to {{ label }}",
370
383
  "richText": "Rich Text",
371
384
  "richTextAlignCenter": "Align Center",