apostrophe 3.63.2 → 4.0.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 (146) hide show
  1. package/.eslintrc +13 -4
  2. package/CHANGELOG.md +21 -0
  3. package/defaults.js +1 -0
  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 +6 -6
  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/busy/ui/apos/apps/AposBusy.js +8 -7
  26. package/modules/@apostrophecms/busy/ui/apos/components/TheAposBusy.vue +1 -1
  27. package/modules/@apostrophecms/command-menu/ui/apos/apps/AposCommandMenu.js +11 -29
  28. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuShortcut.vue +6 -6
  29. package/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +10 -7
  30. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +20 -15
  31. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +1 -1
  32. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +36 -27
  33. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalizeErrors.vue +3 -3
  34. package/modules/@apostrophecms/image/ui/apos/components/AposImageCropper.vue +5 -5
  35. package/modules/@apostrophecms/image/ui/apos/components/AposImageRelationshipEditor.vue +6 -6
  36. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +23 -16
  37. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +11 -11
  38. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +28 -21
  39. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +1 -1
  40. package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +5 -4
  41. package/modules/@apostrophecms/login/ui/apos/apps/AposLogin.js +6 -7
  42. package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -3
  43. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +10 -10
  44. package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +1 -1
  45. package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -2
  46. package/modules/@apostrophecms/modal/ui/apos/apps/AposModals.js +60 -87
  47. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +15 -11
  48. package/modules/@apostrophecms/modal/ui/apos/components/AposModal.vue +8 -2
  49. package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +7 -4
  50. package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +5 -5
  51. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -8
  52. package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +7 -7
  53. package/modules/@apostrophecms/modal/ui/apos/components/TheAposModals.vue +22 -4
  54. package/modules/@apostrophecms/modal/ui/apos/composables/AposFocus.js +95 -0
  55. package/modules/@apostrophecms/modal/ui/apos/mixins/AposDocsManagerMixin.js +2 -3
  56. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +6 -0
  57. package/modules/@apostrophecms/multisite-i18n/i18n/aposMultisite/en.json +48 -0
  58. package/modules/@apostrophecms/multisite-i18n/index.js +7 -0
  59. package/modules/@apostrophecms/notification/index.js +4 -4
  60. package/modules/@apostrophecms/notification/ui/apos/apps/AposNotification.js +6 -9
  61. package/modules/@apostrophecms/notification/ui/apos/components/AposNotification.vue +12 -8
  62. package/modules/@apostrophecms/oembed-field/ui/apos/components/AposInputOembed.vue +4 -4
  63. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +15 -11
  64. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +1 -1
  65. package/modules/@apostrophecms/permission/ui/apos/components/AposInputRole.vue +3 -3
  66. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +25 -17
  67. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerDisplay.vue +24 -20
  68. package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +15 -11
  69. package/modules/@apostrophecms/rich-text-widget/index.js +1 -0
  70. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +7 -6
  71. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +31 -30
  72. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +12 -10
  73. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +9 -8
  74. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapStyles.vue +3 -3
  75. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapTable.vue +3 -3
  76. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +10 -8
  77. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +5 -3
  78. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +81 -277
  79. package/modules/@apostrophecms/schema/ui/apos/components/AposInputAttachment.vue +4 -2
  80. package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +24 -14
  81. package/modules/@apostrophecms/schema/ui/apos/components/AposInputCheckboxes.vue +7 -6
  82. package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +10 -7
  83. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +3 -3
  84. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +5 -4
  85. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +15 -12
  86. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSelect.vue +1 -1
  87. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +16 -12
  88. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +19 -11
  89. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +1 -1
  90. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +65 -21
  91. package/modules/@apostrophecms/schema/ui/apos/components/AposSubform.vue +2 -2
  92. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +0 -4
  93. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +3 -3
  94. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +15 -4
  95. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputAttachment.js +3 -3
  96. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputCheckboxes.js +7 -7
  97. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputColor.js +5 -8
  98. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputDateAndTime.js +1 -1
  99. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +1 -1
  100. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRadio.js +1 -1
  101. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +12 -9
  102. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSelect.js +2 -2
  103. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +6 -8
  104. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +39 -13
  105. package/modules/@apostrophecms/schema/ui/apos/logic/AposSubform.js +1 -1
  106. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +9 -9
  107. package/modules/@apostrophecms/schema/ui/apos/scss/AposInputArray.scss +205 -0
  108. package/modules/@apostrophecms/settings/ui/apos/components/AposSettingsManager.vue +4 -4
  109. package/modules/@apostrophecms/settings/ui/apos/logic/AposSettingsManager.js +4 -4
  110. package/modules/@apostrophecms/submitted-draft/ui/apos/components/AposSubmittedDraftIcon.vue +5 -4
  111. package/modules/@apostrophecms/ui/ui/apos/components/AposButton.vue +4 -4
  112. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonGroup.vue +6 -6
  113. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonSplit.vue +120 -113
  114. package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +19 -19
  115. package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +15 -15
  116. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +216 -191
  117. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuDialog.vue +77 -65
  118. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuItem.vue +1 -1
  119. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuTip.vue +28 -50
  120. package/modules/@apostrophecms/ui/ui/apos/components/AposFile.vue +5 -5
  121. package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +4 -4
  122. package/modules/@apostrophecms/ui/ui/apos/components/AposMinMaxCount.vue +5 -5
  123. package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +14 -8
  124. package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +2 -2
  125. package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +53 -59
  126. package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +2 -2
  127. package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +40 -35
  128. package/modules/@apostrophecms/ui/ui/apos/components/AposToggle.vue +2 -2
  129. package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +9 -11
  130. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeHeader.vue +5 -3
  131. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +129 -129
  132. package/modules/@apostrophecms/ui/ui/apos/composables/AposTheme.js +11 -0
  133. package/modules/@apostrophecms/ui/ui/apos/lib/click-outside-element.js +4 -4
  134. package/modules/@apostrophecms/ui/ui/apos/lib/i18next.js +56 -50
  135. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip.js +191 -0
  136. package/modules/@apostrophecms/ui/ui/apos/lib/vue.js +19 -10
  137. package/modules/@apostrophecms/ui/ui/apos/mixins/AposAdvisoryLockMixin.js +1 -1
  138. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tables.scss +1 -1
  139. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tooltips.scss +6 -22
  140. package/modules/@apostrophecms/ui/ui/apos/scss/shared/_table-rows.scss +1 -1
  141. package/modules/@apostrophecms/widget-type/index.js +8 -2
  142. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +26 -22
  143. package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +4 -4
  144. package/package.json +31 -44
  145. package/modules/@apostrophecms/ui/ui/apos/lib/localized-v-tooltip.js +0 -63
  146. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip-options.js +0 -13
@@ -53,6 +53,7 @@ module.exports = {
53
53
  };
54
54
  self.configureBuilds();
55
55
  self.initUploadfs();
56
+ self.enableBrowserData();
56
57
 
57
58
  const {
58
59
  extensions = {},
@@ -325,6 +326,7 @@ module.exports = {
325
326
  registerComponents: true,
326
327
  importLastVersion: true
327
328
  });
329
+ /* componentImports = getGlobalVueComponents(self); */
328
330
  tiptapExtensionImports = getImports(`${source}/tiptap-extensions`, '*.js', { registerTiptapExtensions: true });
329
331
  appImports = getImports(`${source}/apps`, '*.js', {
330
332
  invokeApps: true,
@@ -513,7 +515,6 @@ module.exports = {
513
515
  }) {
514
516
  fs.writeFileSync(importFile, (prologue || '') + stripIndent`
515
517
  ${(icon && icon.importCode) || ''}
516
- ${(icon && icon.registerCode) || ''}
517
518
  ${(components && components.importCode) || ''}
518
519
  ${(tiptap && tiptap.importCode) || ''}
519
520
  ${(app && app.importCode) || ''}
@@ -563,16 +564,16 @@ module.exports = {
563
564
  // Load global vue icon components.
564
565
  const output = {
565
566
  importCode: '',
566
- registerCode: ''
567
+ registerCode: 'window.apos.iconComponents = window.apos.iconComponents || {};\n'
567
568
  };
568
569
 
569
570
  for (const [ registerAs, importFrom ] of Object.entries(self.iconMap)) {
570
571
  if (importFrom.substring(0, 1) === '~') {
571
572
  output.importCode += `import ${importFrom}Icon from '${importFrom.substring(1)}';\n`;
572
573
  } else {
573
- output.importCode += `import ${importFrom}Icon from 'vue-material-design-icons/${importFrom}.vue';\n`;
574
+ output.importCode += `import ${importFrom}Icon from '@apostrophecms/vue-material-design-icons/${importFrom}.vue';\n`;
574
575
  }
575
- output.registerCode += `Vue.component('${registerAs}', ${importFrom}Icon);\n`;
576
+ output.registerCode += `window.apos.iconComponents['${registerAs}'] = ${importFrom}Icon;\n`;
576
577
  }
577
578
 
578
579
  return output;
@@ -727,9 +728,17 @@ module.exports = {
727
728
  }
728
729
 
729
730
  function getImportFileOutput (components, options = {}) {
731
+ let registerCode;
732
+ if (options.registerComponents) {
733
+ registerCode = 'window.apos.vueComponents = window.apos.vueComponents || {};\n';
734
+ } else if (options.registerTiptapExtensions) {
735
+ registerCode = 'window.apos.tiptapExtensions = window.apos.tiptapExtensions || [];\n';
736
+ } else {
737
+ registerCode = '';
738
+ }
730
739
  const output = {
731
740
  importCode: '',
732
- registerCode: '',
741
+ registerCode,
733
742
  invokeCode: '',
734
743
  paths: []
735
744
  };
@@ -748,21 +757,21 @@ module.exports = {
748
757
  const jsFilename = JSON.stringify(component);
749
758
  const name = getComponentName(component, options, i);
750
759
  const jsName = JSON.stringify(name);
760
+ const importName = `${name}${options.importSuffix || ''}`;
751
761
  const importCode = `
752
- import ${name}${options.importSuffix || ''} from ${jsFilename};
762
+ import ${importName} from ${jsFilename};
753
763
  `;
754
764
 
755
765
  output.paths.push(component);
756
766
  output.importCode += `${importCode}\n`;
757
767
 
758
768
  if (options.registerComponents) {
759
- output.registerCode += `Vue.component(${jsName}, ${name});\n`;
769
+ output.registerCode += `window.apos.vueComponents[${jsName}] = ${importName};\n`;
760
770
  }
761
771
 
762
772
  if (options.registerTiptapExtensions) {
763
773
  output.registerCode += stripIndent`
764
- apos.tiptapExtensions = apos.tiptapExtensions || [];
765
- apos.tiptapExtensions.push(${name});
774
+ apos.tiptapExtensions.push(${importName});
766
775
  `;
767
776
  }
768
777
  if (options.invokeApps) {
@@ -1328,9 +1337,13 @@ module.exports = {
1328
1337
  apos: true,
1329
1338
  prologue: stripIndent`
1330
1339
  import 'Modules/@apostrophecms/ui/scss/global/import-all.scss';
1331
- import Vue from 'Modules/@apostrophecms/ui/lib/vue';
1332
- window.apos.bus = new Vue();
1333
- `,
1340
+ import emitter from 'tiny-emitter/instance';
1341
+ window.apos.bus = {
1342
+ $on: (...args) => emitter.on(...args),
1343
+ $once: (...args) => emitter.once(...args),
1344
+ $off: (...args) => emitter.off(...args),
1345
+ $emit: (...args) => emitter.emit(...args)
1346
+ };`,
1334
1347
  // Load only in browsers that support ES6 modules
1335
1348
  condition: 'module'
1336
1349
  }
@@ -49,7 +49,7 @@ module.exports = ({
49
49
  // we could extend this with aliases for other apostrophe modules
50
50
  // at a later date if needed
51
51
  resolveLoader: {
52
- extensions: [ '*', '.js', '.vue', '.json' ],
52
+ extensions: [ '.*', '.js', '.vue', '.json' ],
53
53
  modules: [
54
54
  // 1. Allow webpack to find loaders from core dependencies (pnpm), empty if not pnpm
55
55
  ...pnpmModulePath,
@@ -62,9 +62,9 @@ module.exports = ({
62
62
  ]
63
63
  },
64
64
  resolve: {
65
- extensions: [ '*', '.js', '.vue', '.json' ],
65
+ extensions: [ '.*', '.js', '.vue', '.json' ],
66
66
  alias: {
67
- vue$: 'vue/dist/vue.runtime.esm.js',
67
+ vue$: '@vue/runtime-dom',
68
68
  // resolve apostrophe modules
69
69
  Modules: path.resolve(modulesDir)
70
70
  },
@@ -1,3 +1,4 @@
1
+ const webpack = require('webpack');
1
2
  const { VueLoaderPlugin } = require('vue-loader');
2
3
 
3
4
  module.exports = (options, apos) => {
@@ -15,7 +16,12 @@ module.exports = (options, apos) => {
15
16
  },
16
17
  plugins: [
17
18
  // make sure to include the plugin for the magic
18
- new VueLoaderPlugin()
19
+ new VueLoaderPlugin(),
20
+ new webpack.DefinePlugin({
21
+ __VUE_OPTIONS_API__: 'true',
22
+ __VUE_PROD_DEVTOOLS__: 'false',
23
+ __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false'
24
+ })
19
25
  ]
20
26
  };
21
27
  };
@@ -1,10 +1,11 @@
1
- import Vue from 'Modules/@apostrophecms/ui/lib/vue';
1
+ import createApp from 'Modules/@apostrophecms/ui/lib/vue';
2
2
 
3
3
  export default function() {
4
- return new Vue({
5
- el: '#apos-busy',
6
- render: function (h) {
7
- return h('TheAposBusy');
8
- }
9
- });
4
+ const component = apos.vueComponents.TheAposBusy;
5
+ const el = document.querySelector('#apos-busy');
6
+ if (!el) {
7
+ return;
8
+ }
9
+ const app = createApp(component);
10
+ app.mount(el);
10
11
  };
@@ -76,7 +76,7 @@ export default {
76
76
  z-index: $z-index-default;
77
77
  width: 60px;
78
78
  height: 60px;
79
- & ::v-deep svg {
79
+ &:deep(svg) {
80
80
  width: 100%;
81
81
  height: 100%;
82
82
  }
@@ -1,34 +1,16 @@
1
- import Vue from 'Modules/@apostrophecms/ui/lib/vue';
1
+ import createApp from 'Modules/@apostrophecms/ui/lib/vue';
2
2
 
3
3
  export default function() {
4
+ const component = apos.vueComponents.TheAposCommandMenu;
4
5
  // Careful, login page is in user scene but has no command menu
5
- if (apos.commandMenu) {
6
- const theAposCommandMenu = new Vue({
7
- el: '#apos-command-menu',
8
- computed: {
9
- apos () {
10
- return window.apos;
11
- }
12
- },
13
- methods: {
14
- getModal() {
15
- return this.$refs.commandMenu.modal;
16
- }
17
- },
18
- render(h) {
19
- return h(
20
- apos.commandMenu.components.the,
21
- {
22
- ref: 'commandMenu',
23
- props: {
24
- groups: apos.commandMenu.groups,
25
- modals: apos.commandMenu.modals
26
- }
27
- }
28
- );
29
- }
30
- });
31
-
32
- apos.commandMenu.getModal = theAposCommandMenu.getModal;
6
+ const el = document.querySelector('#apos-command-menu');
7
+ if (!apos.commandMenu || !el) {
8
+ return;
33
9
  }
10
+ const app = createApp(component, {
11
+ modals: apos.commandMenu.modals
12
+ });
13
+ const theAposCommandMenu = app.mount(el);
14
+
15
+ apos.commandMenu.getModal = theAposCommandMenu.getModal;
34
16
  }
@@ -88,7 +88,7 @@ export default {
88
88
  this.$emit('safe-close');
89
89
  }
90
90
  },
91
- beforeDestroy() {
91
+ beforeUnmount() {
92
92
  apos.bus.$off('modal-launched', this.autoCloseWhenHidden);
93
93
  apos.bus.$off('modal-resolved', this.close);
94
94
  },
@@ -125,11 +125,11 @@ export default {
125
125
  </script>
126
126
 
127
127
  <style lang="scss" scoped>
128
- ::v-deep .apos-modal__body {
128
+ :deep(.apos-modal__body) {
129
129
  padding: 0;
130
130
  }
131
131
 
132
- ::v-deep .apos-modal__inner {
132
+ :deep(.apos-modal__inner) {
133
133
  top: auto;
134
134
  left: auto;
135
135
  max-width: 700px;
@@ -137,7 +137,7 @@ export default {
137
137
  border-radius: $spacing-base + $spacing-half;
138
138
  }
139
139
 
140
- ::v-deep .apos-modal__overlay {
140
+ :deep(.apos-modal__overlay) {
141
141
  display: none;
142
142
  }
143
143
 
@@ -153,7 +153,7 @@ export default {
153
153
  padding: 0 $spacing-base + $spacing-half;
154
154
  }
155
155
 
156
- ::v-deep .apos-button {
156
+ :deep(.apos-button) {
157
157
  display: inline-flex;
158
158
  align-items: center;
159
159
  box-sizing: border-box;
@@ -176,7 +176,7 @@ export default {
176
176
  }
177
177
 
178
178
  .apos-command-menu-key {
179
- ::v-deep button {
179
+ :deep(button) {
180
180
  width: $spacing-double;
181
181
  height: $spacing-double;
182
182
  padding: 3px $spacing-half;
@@ -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);
@@ -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
  },
@@ -27,8 +27,8 @@
27
27
  <AposButton
28
28
  type="default"
29
29
  label="apostrophe:cancel"
30
- @click="close"
31
30
  :modifiers="[ 'block' ]"
31
+ @click="close"
32
32
  />
33
33
  </div>
34
34
  </template>
@@ -49,12 +49,12 @@
49
49
  class="apos-wizard__step apos-wizard__step-select-content"
50
50
  >
51
51
  <AposInputRadio
52
+ v-model="wizard.values.toLocalize"
52
53
  :field="{
53
54
  name: 'toLocalize',
54
55
  label: 'apostrophe:selectContentToLocalize',
55
56
  choices: toLocalizeChoices
56
57
  }"
57
- v-model="wizard.values.toLocalize"
58
58
  />
59
59
  <p class="apos-wizard__help-text">
60
60
  <AposIndicator
@@ -71,20 +71,20 @@
71
71
  class="apos-wizard__step apos-wizard__step-select-locales"
72
72
  >
73
73
  <AposButton
74
- v-on="{ click: allSelected ? deselectAll : selectAll }"
75
74
  class="apos-locale-select-all"
76
75
  :label="allSelected
77
76
  ? $t('apostrophe:deselectAll')
78
77
  : $t('apostrophe:selectAll')"
79
78
  type="quiet"
80
79
  :modifiers="[ 'inline' ]"
80
+ v-on="{ click: allSelected ? deselectAll : selectAll }"
81
81
  />
82
82
  <AposInputString
83
+ ref="searchInput"
83
84
  v-model="searchValue"
84
85
  :field="searchField"
85
- @input="updateFilter"
86
86
  class="apos-locales-filter"
87
- ref="searchInput"
87
+ @update:model-value="updateFilter"
88
88
  />
89
89
  <transition-group
90
90
  tag="ul"
@@ -98,12 +98,12 @@
98
98
  >
99
99
  <AposButton
100
100
  type="primary"
101
- @click.prevent="removeLocale(loc)"
102
101
  class="apos-locale-button"
103
102
  :modifiers="[ 'small' ]"
104
103
  icon="close-icon"
105
104
  :icon-size="12"
106
105
  :label="loc.label"
106
+ @click.prevent="removeLocale(loc)"
107
107
  />
108
108
  </li>
109
109
  </transition-group>
@@ -136,13 +136,13 @@
136
136
  ({{ loc.name }})
137
137
  </span>
138
138
  <span
139
+ v-apos-tooltip="isLocalized(loc)
140
+ ? 'Localized'
141
+ : 'Not Yet Localized'"
139
142
  class="apos-locale-localized"
140
143
  :class="{
141
144
  'apos-state-is-localized': isLocalized(loc),
142
145
  }"
143
- v-apos-tooltip="isLocalized(loc)
144
- ? 'Localized'
145
- : 'Not Yet Localized'"
146
146
  />
147
147
  </span>
148
148
  </li>
@@ -155,9 +155,9 @@
155
155
  >
156
156
  <ul class="apos-selected-locales">
157
157
  <li
158
- class="apos-locale-item--selected"
159
158
  v-for="loc in selectedLocales"
160
159
  :key="loc.name"
160
+ class="apos-locale-item--selected"
161
161
  >
162
162
  <AposButton
163
163
  type="primary"
@@ -184,6 +184,7 @@
184
184
  </p>
185
185
 
186
186
  <AposInputRadio
187
+ v-model="wizard.values.relatedDocSettings"
187
188
  :field="{
188
189
  name: 'relatedDocSettings',
189
190
  choices: [
@@ -198,13 +199,11 @@
198
199
  },
199
200
  ],
200
201
  }"
201
- v-model="wizard.values.relatedDocSettings"
202
202
  />
203
-
204
203
  <AposInputCheckboxes
205
204
  v-if="relatedDocTypes.length"
206
- :field="relatedDocTypesField"
207
205
  v-model="wizard.values.relatedDocTypesToLocalize"
206
+ :field="relatedDocTypesField"
208
207
  />
209
208
  <p v-else class="apos-wizard__help-text">
210
209
  <AposIndicator
@@ -230,19 +229,19 @@
230
229
  <AposButton
231
230
  v-else
232
231
  type="primary"
233
- @click="goToNext()"
234
232
  icon="arrow-right-icon"
235
233
  :modifiers="['icon-right']"
236
234
  :disabled="!complete() || wizard.busy"
237
235
  :icon-size="12"
238
236
  label="apostrophe:next"
237
+ @click="goToNext()"
239
238
  />
240
239
  <AposButton
241
240
  v-if="!isFirstStep()"
242
241
  type="default"
243
242
  :disabled="wizard.busy"
244
- @click="goToPrevious()"
245
243
  label="apostrophe:back"
244
+ @click="goToPrevious()"
246
245
  />
247
246
  </template>
248
247
  </AposModalBody>
@@ -545,16 +544,26 @@ export default {
545
544
  return !!this.localized[locale.name];
546
545
  },
547
546
  selectAll() {
548
- this.wizard.values.toLocales.data = this.locales.filter(locale => !this.isCurrentLocale(locale) && this.canEditLocale(locale));
547
+ this.wizard.values.toLocales.data = this.locales
548
+ .filter(locale => !this.isCurrentLocale(locale) && this.canEditLocale(locale));
549
549
  },
550
550
  deselectAll() {
551
551
  this.wizard.values.toLocales.data = [];
552
552
  },
553
553
  toggleLocale(locale) {
554
- if (!this.isSelected(locale) && !this.isCurrentLocale(locale) && this.canEditLocale(locale)) {
555
- this.wizard.values.toLocales.data.push(locale);
554
+ if (
555
+ !this.isSelected(locale) &&
556
+ !this.isCurrentLocale(locale) &&
557
+ this.canEditLocale(locale)
558
+ ) {
559
+ this.wizard.values.toLocales.data = [
560
+ ...this.wizard.values.toLocales.data,
561
+ locale
562
+ ];
563
+
556
564
  } else if (this.isSelected(locale)) {
557
- this.wizard.values.toLocales.data = this.wizard.values.toLocales.data.filter(l => l !== locale);
565
+ this.wizard.values.toLocales.data = this.wizard.values.toLocales.data
566
+ .filter(l => l !== locale);
558
567
  }
559
568
  // Reset search filter
560
569
  if (this.filteredLocales.length < 2) {
@@ -831,7 +840,7 @@ export default {
831
840
  .apos-i18n-localize {
832
841
  @include type-base;
833
842
 
834
- ::v-deep .apos-modal__inner {
843
+ :deep(.apos-modal__inner) {
835
844
  $width: 565px;
836
845
  $vertical-spacing: 95px;
837
846
  $horizontal-spacing: calc(calc(100vw - #{$width}) / 2);
@@ -843,20 +852,20 @@ export default {
843
852
  height: calc(100vh - #{$vertical-spacing * 2});
844
853
  }
845
854
 
846
- ::v-deep .apos-modal__main--with-left-rail {
855
+ :deep(.apos-modal__main--with-left-rail) {
847
856
  grid-template-columns: 30% 70%;
848
857
  }
849
858
 
850
- ::v-deep .apos-modal__body-inner {
859
+ :deep(.apos-modal__body-inner) {
851
860
  padding: $spacing-triple $spacing-triple $spacing-double;
852
861
  }
853
862
 
854
- ::v-deep .apos-wizard__content .apos-modal__body-footer {
863
+ :deep(.apos-wizard__content .apos-modal__body-footer) {
855
864
  flex-direction: row-reverse;
856
865
  border-top: 1px solid var(--a-base-9);
857
866
  }
858
867
 
859
- ::v-deep .apos-busy__spinner {
868
+ :deep(.apos-busy__spinner) {
860
869
  display: inline-block;
861
870
  }
862
871
  }
@@ -890,7 +899,7 @@ export default {
890
899
  border: none;
891
900
  }
892
901
 
893
- ::v-deep .apos-field--toLocalize {
902
+ :deep(.apos-field--toLocalize) {
894
903
  margin-bottom: $spacing-triple;
895
904
  }
896
905
 
@@ -901,7 +910,7 @@ export default {
901
910
  font-weight: 400;
902
911
  color: var(--a-base-3);
903
912
 
904
- ::v-deep .material-design-icon {
913
+ :deep(.material-design-icon) {
905
914
  position: relative;
906
915
  top: 3px;
907
916
  color: var(--a-base-5);
@@ -944,7 +953,7 @@ export default {
944
953
  }
945
954
  }
946
955
 
947
- .apos-locale-button ::v-deep .apos-button {
956
+ .apos-locale-button :deep(.apos-button) {
948
957
  font-size: var(--a-type-small);
949
958
  }
950
959
 
@@ -27,7 +27,7 @@
27
27
  {{ docType(item.doc) }}
28
28
  </span>
29
29
  </div>
30
- <div class="apos-confirm__notification-detail" v-if="item.detail">
30
+ <div v-if="item.detail" class="apos-confirm__notification-detail">
31
31
  {{ $t(item.detail) }}
32
32
  </div>
33
33
  </div>
@@ -36,8 +36,8 @@
36
36
  </template>
37
37
 
38
38
  <script>
39
- import CheckIcon from 'vue-material-design-icons/Check.vue';
40
- import CancelIcon from 'vue-material-design-icons/Cancel.vue';
39
+ import CheckIcon from '@apostrophecms/vue-material-design-icons/Check.vue';
40
+ import CancelIcon from '@apostrophecms/vue-material-design-icons/Cancel.vue';
41
41
 
42
42
  export default {
43
43
  name: 'AposI18nLocalizeErrors',