apostrophe 3.63.1 → 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.
- package/.eslintrc +13 -4
- package/CHANGELOG.md +35 -0
- package/defaults.js +1 -0
- package/modules/@apostrophecms/admin-bar/ui/apos/apps/AposAdminBar.js +7 -17
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBar.vue +14 -16
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarLocale.vue +1 -1
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarMenu.vue +22 -15
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarUser.vue +2 -2
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextBar.vue +13 -8
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextModeAndSettings.vue +18 -10
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextTitle.vue +4 -4
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextUndoRedo.vue +14 -8
- package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposSavingIndicator.vue +2 -1
- package/modules/@apostrophecms/area/ui/apos/apps/AposAreas.js +36 -54
- package/modules/@apostrophecms/area/ui/apos/components/AposAreaContextualMenu.vue +20 -25
- package/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +5 -12
- package/modules/@apostrophecms/area/ui/apos/components/AposAreaExpandedMenu.vue +11 -3
- package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenu.vue +6 -6
- package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenuItem.vue +3 -2
- package/modules/@apostrophecms/area/ui/apos/components/AposAreaWidget.vue +31 -44
- package/modules/@apostrophecms/area/ui/apos/components/AposWidgetControls.vue +6 -6
- package/modules/@apostrophecms/asset/index.js +25 -12
- package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.config.js +3 -3
- package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.vue.js +7 -1
- package/modules/@apostrophecms/busy/ui/apos/apps/AposBusy.js +8 -7
- package/modules/@apostrophecms/busy/ui/apos/components/TheAposBusy.vue +1 -1
- package/modules/@apostrophecms/command-menu/ui/apos/apps/AposCommandMenu.js +11 -29
- package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuShortcut.vue +6 -6
- package/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +10 -7
- package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +20 -15
- package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +1 -1
- package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +36 -27
- package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalizeErrors.vue +3 -3
- package/modules/@apostrophecms/image/ui/apos/components/AposImageCropper.vue +5 -5
- package/modules/@apostrophecms/image/ui/apos/components/AposImageRelationshipEditor.vue +6 -6
- package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +23 -16
- package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +11 -11
- package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +28 -21
- package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +1 -1
- package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +5 -4
- package/modules/@apostrophecms/login/ui/apos/apps/AposLogin.js +6 -7
- package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -3
- package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +10 -10
- package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +1 -1
- package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -2
- package/modules/@apostrophecms/modal/ui/apos/apps/AposModals.js +60 -87
- package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +15 -11
- package/modules/@apostrophecms/modal/ui/apos/components/AposModal.vue +8 -2
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +7 -4
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +5 -5
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -8
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +7 -7
- package/modules/@apostrophecms/modal/ui/apos/components/TheAposModals.vue +22 -4
- package/modules/@apostrophecms/modal/ui/apos/composables/AposFocus.js +95 -0
- package/modules/@apostrophecms/modal/ui/apos/mixins/AposDocsManagerMixin.js +2 -3
- package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +6 -0
- package/modules/@apostrophecms/multisite-i18n/i18n/aposMultisite/en.json +48 -0
- package/modules/@apostrophecms/multisite-i18n/index.js +7 -0
- package/modules/@apostrophecms/notification/index.js +4 -4
- package/modules/@apostrophecms/notification/ui/apos/apps/AposNotification.js +6 -9
- package/modules/@apostrophecms/notification/ui/apos/components/AposNotification.vue +12 -8
- package/modules/@apostrophecms/oembed/index.js +10 -3
- package/modules/@apostrophecms/oembed-field/ui/apos/components/AposInputOembed.vue +4 -4
- package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +15 -11
- package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +1 -1
- package/modules/@apostrophecms/permission/ui/apos/components/AposInputRole.vue +3 -3
- package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +25 -17
- package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerDisplay.vue +24 -20
- package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +15 -11
- package/modules/@apostrophecms/polymorphic-type/index.js +0 -19
- package/modules/@apostrophecms/rich-text-widget/index.js +1 -0
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +7 -6
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +31 -30
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +12 -10
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +9 -8
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapStyles.vue +3 -3
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapTable.vue +3 -3
- package/modules/@apostrophecms/schema/index.js +30 -1
- package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +10 -8
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +5 -3
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +81 -277
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputAttachment.vue +4 -2
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +24 -14
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputCheckboxes.vue +7 -6
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +10 -7
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +3 -3
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +5 -4
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +15 -12
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputSelect.vue +1 -1
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +16 -12
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +19 -11
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +1 -1
- package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +65 -21
- package/modules/@apostrophecms/schema/ui/apos/components/AposSubform.vue +2 -2
- package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +0 -4
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +3 -3
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +15 -4
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputAttachment.js +3 -3
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputCheckboxes.js +7 -7
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputColor.js +5 -8
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputDateAndTime.js +1 -1
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +1 -1
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRadio.js +1 -1
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +12 -9
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSelect.js +2 -2
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +6 -8
- package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +39 -13
- package/modules/@apostrophecms/schema/ui/apos/logic/AposSubform.js +1 -1
- package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +9 -9
- package/modules/@apostrophecms/schema/ui/apos/scss/AposInputArray.scss +205 -0
- package/modules/@apostrophecms/settings/ui/apos/components/AposSettingsManager.vue +4 -4
- package/modules/@apostrophecms/settings/ui/apos/logic/AposSettingsManager.js +4 -4
- package/modules/@apostrophecms/submitted-draft/ui/apos/components/AposSubmittedDraftIcon.vue +5 -4
- package/modules/@apostrophecms/ui/ui/apos/components/AposButton.vue +4 -4
- package/modules/@apostrophecms/ui/ui/apos/components/AposButtonGroup.vue +6 -6
- package/modules/@apostrophecms/ui/ui/apos/components/AposButtonSplit.vue +120 -113
- package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +19 -19
- package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +15 -15
- package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +216 -191
- package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuDialog.vue +77 -65
- package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuItem.vue +1 -1
- package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuTip.vue +28 -50
- package/modules/@apostrophecms/ui/ui/apos/components/AposFile.vue +5 -5
- package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +4 -4
- package/modules/@apostrophecms/ui/ui/apos/components/AposMinMaxCount.vue +5 -5
- package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +14 -8
- package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +2 -2
- package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +53 -59
- package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +2 -2
- package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +40 -35
- package/modules/@apostrophecms/ui/ui/apos/components/AposToggle.vue +2 -2
- package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +9 -11
- package/modules/@apostrophecms/ui/ui/apos/components/AposTreeHeader.vue +5 -3
- package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +129 -129
- package/modules/@apostrophecms/ui/ui/apos/composables/AposTheme.js +11 -0
- package/modules/@apostrophecms/ui/ui/apos/lib/click-outside-element.js +4 -4
- package/modules/@apostrophecms/ui/ui/apos/lib/i18next.js +56 -50
- package/modules/@apostrophecms/ui/ui/apos/lib/tooltip.js +191 -0
- package/modules/@apostrophecms/ui/ui/apos/lib/vue.js +19 -10
- package/modules/@apostrophecms/ui/ui/apos/mixins/AposAdvisoryLockMixin.js +1 -1
- package/modules/@apostrophecms/ui/ui/apos/scss/global/_tables.scss +1 -1
- package/modules/@apostrophecms/ui/ui/apos/scss/global/_tooltips.scss +6 -22
- package/modules/@apostrophecms/ui/ui/apos/scss/shared/_table-rows.scss +1 -1
- package/modules/@apostrophecms/widget-type/index.js +8 -2
- package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +26 -22
- package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +4 -4
- package/package.json +31 -44
- package/test/schemas.js +10 -4
- package/modules/@apostrophecms/ui/ui/apos/lib/localized-v-tooltip.js +0 -63
- package/modules/@apostrophecms/ui/ui/apos/lib/tooltip-options.js +0 -13
package/.eslintrc
CHANGED
|
@@ -34,8 +34,7 @@
|
|
|
34
34
|
"vue/max-attributes-per-line": [
|
|
35
35
|
"warn",
|
|
36
36
|
{
|
|
37
|
-
"singleline": 2
|
|
38
|
-
"multiline": 2
|
|
37
|
+
"singleline": 2
|
|
39
38
|
}
|
|
40
39
|
],
|
|
41
40
|
"vue/singleline-html-element-content-newline": [
|
|
@@ -51,10 +50,20 @@
|
|
|
51
50
|
"textarea"
|
|
52
51
|
]
|
|
53
52
|
}
|
|
54
|
-
]
|
|
55
|
-
"vue/attributes-order": 0
|
|
53
|
+
]
|
|
56
54
|
},
|
|
57
55
|
"overrides": [
|
|
56
|
+
{
|
|
57
|
+
"files": "*.vue",
|
|
58
|
+
"globals": {
|
|
59
|
+
"defineProps": "readable",
|
|
60
|
+
"defineEmits": "readable",
|
|
61
|
+
"defineExpose": "readable",
|
|
62
|
+
"defineOptions": "readable",
|
|
63
|
+
"defineModel": "readable",
|
|
64
|
+
"defineSlots": "readable"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
58
67
|
{
|
|
59
68
|
"files": [
|
|
60
69
|
"**/ui/**/*.js"
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,40 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.0.0 (2024-03-12)
|
|
4
|
+
|
|
5
|
+
### Adds
|
|
6
|
+
|
|
7
|
+
* Add translation keys used by the multisite assembly module.
|
|
8
|
+
* Add side by side comparison support in AposSchema component.
|
|
9
|
+
* Add the possibility to make widget modals wider, which can be useful for widgets that contain areas taking significant space. See [documentation](https://v3.docs.apostrophecms.org/reference/modules/widget-type.html#options).
|
|
10
|
+
|
|
11
|
+
### Changes
|
|
12
|
+
|
|
13
|
+
* Migrate to Vue 3. This entails changes to some admin UI code, as detailed in our public announcement.
|
|
14
|
+
There are no other backwards incompatible changes in apostrophe version 4.0.0.
|
|
15
|
+
Certain other modules containing custom admin UI have also been updated in a new major version to be compatible,
|
|
16
|
+
as noted in our announcement and on the migration page of our website.
|
|
17
|
+
|
|
18
|
+
### Fixes
|
|
19
|
+
|
|
20
|
+
* Adds `textStyle` to Tiptap types so that spans are rendered on RT initialization
|
|
21
|
+
* `field.help` and `field.htmlHelp` are now correctly translated when displayed in a tooltip.
|
|
22
|
+
* Notification REST APIs should not directly return the result of MongoDB operations.
|
|
23
|
+
|
|
24
|
+
## 3.63.2 (2024-03-01)
|
|
25
|
+
|
|
26
|
+
### Security
|
|
27
|
+
|
|
28
|
+
* Always validate that method names passed to the `external-condition` API actually appear in `if` or `requiredIf`
|
|
29
|
+
clauses for the field in question. This fix addresses a serious security risk in which arbitrary methods of
|
|
30
|
+
Apostrophe modules could be called over the network, without arguments, and the results returned to the caller.
|
|
31
|
+
While the lack of arguments mitigates the data exfiltration risk, it is possible to cause data loss by
|
|
32
|
+
invoking the right method. Therefore this is an urgent upgrade for all Apostrophe 3.x users. Our thanks to the Michelin
|
|
33
|
+
penetration test red team for disclosing this vulnerability. All are welcome to disclose security vulnerabilities
|
|
34
|
+
in ApostropheCMS code via [security@apostrophecms.com](mailto:security@apostrophecms.com).
|
|
35
|
+
* Disable the `alwaysIframe` query parameter of the oembed proxy. This feature was never used in Apostrophe core, and could be misused to carry out arbitrary GET requests in the context of an iframe, although it could not be used to exfiltrate any information other than the success or failure of the request, and the request was still performed by the user's browser only. Thanks to the Michelin team.
|
|
36
|
+
* Remove vestigial A2 code relating to polymorphic relationship fields. The code in question had no relevance to the way such a feature would be implemented in A3, and could be used to cause a denial of service by crashing and restarting the process. Thanks to the Michelin team.
|
|
37
|
+
|
|
3
38
|
## 3.63.1 (2024-02-22)
|
|
4
39
|
|
|
5
40
|
### Security
|
package/defaults.js
CHANGED
|
@@ -1,22 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createApp from 'Modules/@apostrophecms/ui/lib/vue';
|
|
2
2
|
|
|
3
3
|
export default function() {
|
|
4
|
+
const component = apos.vueComponents.TheAposAdminBar;
|
|
4
5
|
// Careful, login page is in user scene but has no admin bar
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
computed: {
|
|
9
|
-
apos () {
|
|
10
|
-
return window.apos;
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
render: function (h) {
|
|
14
|
-
return h('TheAposAdminBar', {
|
|
15
|
-
props: {
|
|
16
|
-
items: apos.adminBar.items
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
});
|
|
6
|
+
const el = document.querySelector('#apos-admin-bar');
|
|
7
|
+
if (!apos.adminBar || !el) {
|
|
8
|
+
return;
|
|
21
9
|
}
|
|
10
|
+
const app = createApp(component, { items: apos.adminBar.items || [] });
|
|
11
|
+
app.mount(el);
|
|
22
12
|
};
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
class="apos-admin-bar-wrapper"
|
|
5
5
|
:class="themeClass"
|
|
6
6
|
>
|
|
7
|
-
<div class="apos-admin-bar-spacer"
|
|
8
|
-
<nav class="apos-admin-bar"
|
|
7
|
+
<div ref="spacer" class="apos-admin-bar-spacer" />
|
|
8
|
+
<nav ref="adminBar" class="apos-admin-bar">
|
|
9
9
|
<div class="apos-admin-bar__row">
|
|
10
10
|
<AposLogoPadless class="apos-admin-bar__logo" />
|
|
11
11
|
<TheAposAdminBarMenu :items="menuItems" />
|
|
@@ -18,10 +18,10 @@
|
|
|
18
18
|
</div>
|
|
19
19
|
<TheAposContextBar @visibility-changed="setSpacer" />
|
|
20
20
|
<component
|
|
21
|
-
v-for="bar in bars"
|
|
22
21
|
v-bind="bar.props || {}"
|
|
23
|
-
:key="bar.id"
|
|
24
22
|
:is="bar.componentName"
|
|
23
|
+
v-for="bar in bars"
|
|
24
|
+
:key="bar.id"
|
|
25
25
|
/>
|
|
26
26
|
</nav>
|
|
27
27
|
</div>
|
|
@@ -36,9 +36,7 @@ export default {
|
|
|
36
36
|
props: {
|
|
37
37
|
items: {
|
|
38
38
|
type: Array,
|
|
39
|
-
|
|
40
|
-
return [];
|
|
41
|
-
}
|
|
39
|
+
required: true
|
|
42
40
|
}
|
|
43
41
|
},
|
|
44
42
|
computed: {
|
|
@@ -55,7 +53,7 @@ export default {
|
|
|
55
53
|
return this.moduleOptions.bars;
|
|
56
54
|
}
|
|
57
55
|
},
|
|
58
|
-
|
|
56
|
+
mounted() {
|
|
59
57
|
this.setSpacer();
|
|
60
58
|
},
|
|
61
59
|
methods: {
|
|
@@ -86,7 +84,7 @@ export default {
|
|
|
86
84
|
background: var(--a-background-primary);
|
|
87
85
|
}
|
|
88
86
|
|
|
89
|
-
|
|
87
|
+
:deep(.apos-admin-bar__row) {
|
|
90
88
|
display: flex;
|
|
91
89
|
align-items: center;
|
|
92
90
|
height: 35px;
|
|
@@ -100,7 +98,7 @@ export default {
|
|
|
100
98
|
margin-right: 10px;
|
|
101
99
|
}
|
|
102
100
|
|
|
103
|
-
|
|
101
|
+
:deep(.apos-admin-bar__control-set) {
|
|
104
102
|
@include type-base;
|
|
105
103
|
display: flex;
|
|
106
104
|
width: 100%;
|
|
@@ -111,27 +109,27 @@ export default {
|
|
|
111
109
|
margin-left: auto;
|
|
112
110
|
}
|
|
113
111
|
|
|
114
|
-
|
|
112
|
+
:deep(.apos-context-menu__pane) {
|
|
115
113
|
min-width: 150px;
|
|
116
114
|
}
|
|
117
|
-
|
|
115
|
+
:deep(.flip-enter) { // to the ground
|
|
118
116
|
transform: translateY(-20%);
|
|
119
117
|
opacity: 0;
|
|
120
118
|
}
|
|
121
|
-
|
|
119
|
+
:deep(.flip-leave) { // in the frame
|
|
122
120
|
transform: translateY(0);
|
|
123
121
|
opacity: 1;
|
|
124
122
|
}
|
|
125
|
-
|
|
123
|
+
:deep(.flip-enter-to) { // from the ground
|
|
126
124
|
transform: translateY(0);
|
|
127
125
|
opacity: 1;
|
|
128
126
|
}
|
|
129
|
-
|
|
127
|
+
:deep(.flip-leave-to) { // to the sky
|
|
130
128
|
transform: translateY(20%);
|
|
131
129
|
opacity: 0;
|
|
132
130
|
}
|
|
133
131
|
|
|
134
|
-
|
|
132
|
+
:deep(.flip-enter-active), :deep(.flip-leave-active) {
|
|
135
133
|
transition: all 150ms;
|
|
136
134
|
&.apos-admin-bar__control-set__group {
|
|
137
135
|
position: absolute;
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<ul class="apos-admin-bar__items">
|
|
3
|
-
<li class="apos-admin-bar__item"
|
|
3
|
+
<li v-if="pageTree" class="apos-admin-bar__item">
|
|
4
4
|
<AposButton
|
|
5
|
-
type="subtle"
|
|
5
|
+
type="subtle"
|
|
6
|
+
label="apostrophe:pages"
|
|
6
7
|
class="apos-admin-bar__btn"
|
|
7
8
|
:modifiers="['no-motion']"
|
|
8
9
|
@click="emitEvent('@apostrophecms/page:manager')"
|
|
9
10
|
/>
|
|
10
11
|
</li>
|
|
11
12
|
<li
|
|
12
|
-
v-for="item in menuItems"
|
|
13
|
+
v-for="item in menuItems"
|
|
14
|
+
:key="item.name"
|
|
13
15
|
class="apos-admin-bar__item"
|
|
14
16
|
>
|
|
15
17
|
<AposContextMenu
|
|
16
|
-
v-if="item.items"
|
|
17
|
-
|
|
18
|
+
v-if="item.items"
|
|
19
|
+
class="apos-admin-bar__sub"
|
|
20
|
+
:menu="item.items"
|
|
21
|
+
:button="{
|
|
18
22
|
label: item.label,
|
|
19
23
|
modifiers: ['no-motion'],
|
|
20
24
|
class: 'apos-admin-bar__btn',
|
|
@@ -23,16 +27,16 @@
|
|
|
23
27
|
@item-clicked="emitEvent"
|
|
24
28
|
/>
|
|
25
29
|
<Component
|
|
26
|
-
v-else
|
|
27
30
|
:is="item.options && item.options.component || 'AposButton'"
|
|
31
|
+
v-else
|
|
28
32
|
type="subtle"
|
|
29
|
-
@click="emitEvent(item.action)"
|
|
30
33
|
:label="item.label"
|
|
31
34
|
:modifiers="['no-motion']"
|
|
32
35
|
class="apos-admin-bar__btn"
|
|
36
|
+
@click="emitEvent(item.action)"
|
|
33
37
|
/>
|
|
34
38
|
</li>
|
|
35
|
-
<li
|
|
39
|
+
<li v-if="createMenu.length > 0" class="apos-admin-bar__item">
|
|
36
40
|
<AposContextMenu
|
|
37
41
|
class="apos-admin-bar__create"
|
|
38
42
|
:menu="createMenu"
|
|
@@ -52,16 +56,19 @@
|
|
|
52
56
|
>
|
|
53
57
|
<template v-for="item in trayItems">
|
|
54
58
|
<Component
|
|
55
|
-
v-if="item.options.component"
|
|
56
59
|
:is="item.options.component"
|
|
60
|
+
v-if="item.options.component"
|
|
57
61
|
:key="`${item.name}.component`"
|
|
58
62
|
/>
|
|
59
63
|
<AposButton
|
|
60
64
|
v-else
|
|
61
65
|
:key="`${item.name}.fallback`"
|
|
62
|
-
type="subtle"
|
|
63
|
-
:
|
|
64
|
-
:
|
|
66
|
+
type="subtle"
|
|
67
|
+
:modifiers="['small', 'no-motion']"
|
|
68
|
+
:tooltip="trayItemTooltip(item)"
|
|
69
|
+
class="apos-admin-bar__context-button"
|
|
70
|
+
:icon="item.options.icon"
|
|
71
|
+
:icon-only="true"
|
|
65
72
|
:label="item.label"
|
|
66
73
|
:state="trayItemState[item.name] ? [ 'active' ] : []"
|
|
67
74
|
@click="emitEvent(item.action)"
|
|
@@ -177,15 +184,15 @@ export default {
|
|
|
177
184
|
align-items: center;
|
|
178
185
|
}
|
|
179
186
|
|
|
180
|
-
.apos-admin-bar__sub
|
|
187
|
+
.apos-admin-bar__sub :deep(.apos-context-menu__btn) {
|
|
181
188
|
border-radius: 0;
|
|
182
189
|
}
|
|
183
190
|
|
|
184
|
-
.apos-admin-bar__sub
|
|
191
|
+
.apos-admin-bar__sub :deep(.apos-context-menu__popup) {
|
|
185
192
|
top: calc(100% + 5px);
|
|
186
193
|
}
|
|
187
194
|
|
|
188
|
-
|
|
195
|
+
:deep(.apos-admin-bar__create) {
|
|
189
196
|
margin-left: 10px;
|
|
190
197
|
|
|
191
198
|
.apos-context-menu__btn {
|
|
@@ -54,12 +54,12 @@ export default {
|
|
|
54
54
|
display: inline-flex;
|
|
55
55
|
align-items: center;
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
:deep(.apos-button) {
|
|
58
58
|
@include type-base;
|
|
59
59
|
color: var(--a-text-primary);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
:deep(.apos-context-menu__popup) {
|
|
63
63
|
right: 0;
|
|
64
64
|
transform: translatex(10px);
|
|
65
65
|
}
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
:v-if="editMode"
|
|
6
6
|
:can-undo="canUndo"
|
|
7
7
|
:can-redo="canRedo"
|
|
8
|
-
@undo="undo"
|
|
9
|
-
@redo="redo"
|
|
10
8
|
:retrying="retrying"
|
|
11
9
|
:editing="editing"
|
|
12
10
|
:saving="saving"
|
|
13
11
|
:saved="saved"
|
|
12
|
+
@undo="undo"
|
|
13
|
+
@redo="redo"
|
|
14
14
|
/>
|
|
15
15
|
<TheAposContextTitle
|
|
16
16
|
v-if="!hasCustomUi"
|
|
@@ -531,12 +531,17 @@ export default {
|
|
|
531
531
|
}
|
|
532
532
|
|
|
533
533
|
const { action } = window.apos.modules[this.context.type];
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
534
|
+
let doc;
|
|
535
|
+
try {
|
|
536
|
+
doc = await apos.http.get(`${action}/${this.context.aposDocId}`, {
|
|
537
|
+
qs: {
|
|
538
|
+
aposMode: this.draftMode,
|
|
539
|
+
project: { _url: 1 }
|
|
540
|
+
}
|
|
541
|
+
});
|
|
542
|
+
} catch (err) {
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
540
545
|
|
|
541
546
|
if (this.urlDiffers(doc._url)) {
|
|
542
547
|
// Slug changed, change browser URL to reflect the actual url of the doc
|
package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextModeAndSettings.vue
CHANGED
|
@@ -11,12 +11,14 @@
|
|
|
11
11
|
further illustrate this concept.
|
|
12
12
|
-->
|
|
13
13
|
<div
|
|
14
|
-
v-if="!editMode"
|
|
14
|
+
v-if="!editMode"
|
|
15
|
+
:key="'switchToEditMode'"
|
|
15
16
|
class="apos-admin-bar__control-set__group"
|
|
16
17
|
>
|
|
17
18
|
<AposButton
|
|
18
19
|
class="apos-admin-bar__context-button"
|
|
19
|
-
label="apostrophe:edit"
|
|
20
|
+
label="apostrophe:edit"
|
|
21
|
+
type="subtle"
|
|
20
22
|
:modifiers="['small', 'no-motion']"
|
|
21
23
|
:tooltip="{
|
|
22
24
|
content: 'apostrophe:toggleEditMode',
|
|
@@ -38,20 +40,23 @@
|
|
|
38
40
|
<AposButton
|
|
39
41
|
v-if="canSwitchToPreviewMode && !isAutopublished"
|
|
40
42
|
class="apos-admin-bar__context-button"
|
|
41
|
-
label="apostrophe:preview"
|
|
43
|
+
label="apostrophe:preview"
|
|
44
|
+
:tooltip="{
|
|
42
45
|
content: 'apostrophe:previewTooltip',
|
|
43
46
|
placement: 'bottom'
|
|
44
47
|
}"
|
|
45
|
-
type="subtle"
|
|
48
|
+
type="subtle"
|
|
49
|
+
:modifiers="['small', 'no-motion']"
|
|
46
50
|
@click="switchEditMode(false)"
|
|
47
51
|
/>
|
|
48
52
|
<AposButton
|
|
49
53
|
v-if="editMode && !isAutopublished"
|
|
50
|
-
type="primary"
|
|
54
|
+
type="primary"
|
|
55
|
+
:label="publishLabel"
|
|
51
56
|
:disabled="!readyToPublish"
|
|
52
57
|
class="apos-admin-bar__btn apos-admin-bar__context-button"
|
|
53
|
-
@click="onPublish"
|
|
54
58
|
:modifiers="['no-motion']"
|
|
59
|
+
@click="onPublish"
|
|
55
60
|
/>
|
|
56
61
|
</div>
|
|
57
62
|
</transition-group>
|
|
@@ -66,7 +71,10 @@ export default {
|
|
|
66
71
|
return null;
|
|
67
72
|
}
|
|
68
73
|
},
|
|
69
|
-
hasCustomUi:
|
|
74
|
+
hasCustomUi: {
|
|
75
|
+
type: Boolean,
|
|
76
|
+
required: true
|
|
77
|
+
},
|
|
70
78
|
context: {
|
|
71
79
|
type: Object,
|
|
72
80
|
required: true
|
|
@@ -135,7 +143,7 @@ export default {
|
|
|
135
143
|
return !this.editMode;
|
|
136
144
|
},
|
|
137
145
|
canSwitchToPreviewMode() {
|
|
138
|
-
return this.editMode && !this.
|
|
146
|
+
return this.editMode && !this.hasCustomUi;
|
|
139
147
|
}
|
|
140
148
|
},
|
|
141
149
|
mounted() {
|
|
@@ -143,7 +151,7 @@ export default {
|
|
|
143
151
|
apos.bus.$on('command-menu-admin-bar-toggle-edit-preview', this.toggleEditPreviewMode);
|
|
144
152
|
apos.bus.$on('command-menu-admin-bar-publish-draft', this.onPublish);
|
|
145
153
|
},
|
|
146
|
-
|
|
154
|
+
unmounted() {
|
|
147
155
|
apos.bus.$off('command-menu-admin-bar-toggle-edit-preview', this.toggleEditPreviewMode);
|
|
148
156
|
apos.bus.$off('command-menu-admin-bar-publish-draft', this.onPublish);
|
|
149
157
|
},
|
|
@@ -179,7 +187,7 @@ export default {
|
|
|
179
187
|
<style lang="scss" scoped>
|
|
180
188
|
.apos-admin-bar__control-set--mode-and-settings {
|
|
181
189
|
justify-content: flex-end;
|
|
182
|
-
|
|
190
|
+
&:deep(.apos-button) {
|
|
183
191
|
margin-left: 4px;
|
|
184
192
|
}
|
|
185
193
|
}
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
>
|
|
7
7
|
<span
|
|
8
8
|
v-show="true"
|
|
9
|
-
class="apos-admin-bar__title"
|
|
10
9
|
:key="'title'"
|
|
10
|
+
class="apos-admin-bar__title"
|
|
11
11
|
>
|
|
12
12
|
<AposIndicator
|
|
13
13
|
icon="information-outline-icon"
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
:button="draftButton"
|
|
32
32
|
:menu="draftMenu"
|
|
33
33
|
:disabled="hasCustomUi || isUnpublished"
|
|
34
|
-
@item-clicked="switchDraftMode"
|
|
35
34
|
menu-offset="13, 10"
|
|
36
35
|
menu-placement="bottom-end"
|
|
36
|
+
@item-clicked="switchDraftMode"
|
|
37
37
|
/>
|
|
38
38
|
<AposLabel
|
|
39
39
|
v-else
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
/>
|
|
44
44
|
</div>
|
|
45
45
|
<AposLabel
|
|
46
|
-
class="apos-admin-bar__title-context-label"
|
|
47
46
|
v-for="{id, label, tooltip = '', modifiers = []} in moduleOptions.contextLabels"
|
|
48
47
|
:key="id"
|
|
48
|
+
class="apos-admin-bar__title-context-label"
|
|
49
49
|
:label="label"
|
|
50
50
|
:tooltip="tooltip"
|
|
51
51
|
:modifiers="modifiers"
|
|
@@ -130,7 +130,7 @@ export default {
|
|
|
130
130
|
mounted() {
|
|
131
131
|
apos.bus.$on('command-menu-admin-bar-toggle-publish-draft', this.togglePublishDraftMode);
|
|
132
132
|
},
|
|
133
|
-
|
|
133
|
+
unmounted() {
|
|
134
134
|
apos.bus.$off('command-menu-admin-bar-toggle-publish-draft', this.togglePublishDraftMode);
|
|
135
135
|
},
|
|
136
136
|
methods: {
|
|
@@ -11,9 +11,12 @@
|
|
|
11
11
|
>
|
|
12
12
|
<AposButton
|
|
13
13
|
:disabled="!canUndo"
|
|
14
|
-
type="subtle"
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
type="subtle"
|
|
15
|
+
:modifiers="['small', 'no-motion']"
|
|
16
|
+
label="apostrophe:undo"
|
|
17
|
+
class="apos-admin-bar__context-button"
|
|
18
|
+
icon="undo-icon"
|
|
19
|
+
:icon-only="true"
|
|
17
20
|
@click="undo"
|
|
18
21
|
/>
|
|
19
22
|
</div>
|
|
@@ -23,9 +26,12 @@
|
|
|
23
26
|
>
|
|
24
27
|
<AposButton
|
|
25
28
|
:disabled="!canRedo"
|
|
26
|
-
type="subtle"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
type="subtle"
|
|
30
|
+
:modifiers="['small', 'no-motion']"
|
|
31
|
+
label="apostrophe:redo"
|
|
32
|
+
class="apos-admin-bar__context-button"
|
|
33
|
+
icon="redo-icon"
|
|
34
|
+
:icon-only="true"
|
|
29
35
|
@click="redo"
|
|
30
36
|
/>
|
|
31
37
|
</div>
|
|
@@ -74,7 +80,7 @@ export default {
|
|
|
74
80
|
apos.bus.$on('command-menu-admin-bar-undo', this.undo);
|
|
75
81
|
apos.bus.$on('command-menu-admin-bar-redo', this.redo);
|
|
76
82
|
},
|
|
77
|
-
|
|
83
|
+
unmounted() {
|
|
78
84
|
apos.bus.$off('command-menu-admin-bar-undo', this.undo);
|
|
79
85
|
apos.bus.$off('command-menu-admin-bar-redo', this.redo);
|
|
80
86
|
},
|
|
@@ -93,7 +99,7 @@ export default {
|
|
|
93
99
|
};
|
|
94
100
|
</script>
|
|
95
101
|
<style lang="scss" scoped>
|
|
96
|
-
|
|
102
|
+
:deep(.apos-admin-bar__context-button.apos-button__wrapper) {
|
|
97
103
|
display: flex;
|
|
98
104
|
}
|
|
99
105
|
</style>
|
|
@@ -6,10 +6,11 @@
|
|
|
6
6
|
<span class="apos-admin-bar__status__inner">
|
|
7
7
|
<component
|
|
8
8
|
:is="savingIndicator.componentName"
|
|
9
|
+
v-if="savingIndicator?.componentName"
|
|
9
10
|
v-bind="savingIndicator.options"
|
|
10
11
|
class="apos-admin-bar__status__icon"
|
|
11
12
|
/>
|
|
12
|
-
<div class="apos-admin-bar__status__label"
|
|
13
|
+
<div ref="statusLabel" class="apos-admin-bar__status__label">
|
|
13
14
|
{{ $t(savingLabel) }}
|
|
14
15
|
</div>
|
|
15
16
|
</span>
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable vue/one-component-per-file */
|
|
2
|
+
import createApp from 'Modules/@apostrophecms/ui/lib/vue';
|
|
2
3
|
import { klona } from 'klona';
|
|
3
4
|
|
|
4
5
|
export default function() {
|
|
5
6
|
|
|
7
|
+
const component = apos.vueComponents.AposAreaEditor;
|
|
8
|
+
|
|
6
9
|
let widgetsRendering = 0;
|
|
7
10
|
|
|
8
11
|
apos.area.widgetOptions = [];
|
|
@@ -90,8 +93,6 @@ export default function() {
|
|
|
90
93
|
}
|
|
91
94
|
el.removeAttribute('data-apos-area-newly-editable');
|
|
92
95
|
|
|
93
|
-
const component = window.apos.area.components.editor;
|
|
94
|
-
|
|
95
96
|
if (apos.area.activeEditor && (apos.area.activeEditor.id === data._id)) {
|
|
96
97
|
// Editing a piece causes a refresh of the main content area,
|
|
97
98
|
// but this may contain the area we originally intended to add
|
|
@@ -101,68 +102,49 @@ export default function() {
|
|
|
101
102
|
|
|
102
103
|
el.parentNode.replaceChild(apos.area.activeEditor.$el, el);
|
|
103
104
|
} else {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
docId: _docId,
|
|
113
|
-
fieldId,
|
|
114
|
-
renderings
|
|
115
|
-
};
|
|
116
|
-
},
|
|
117
|
-
render(h) {
|
|
118
|
-
return h(component, {
|
|
119
|
-
props: {
|
|
120
|
-
options: this.options,
|
|
121
|
-
items: this.items,
|
|
122
|
-
choices: this.choices,
|
|
123
|
-
id: this.id,
|
|
124
|
-
docId: this.docId,
|
|
125
|
-
fieldId: this.fieldId,
|
|
126
|
-
renderings: this.renderings
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}
|
|
105
|
+
const app = createApp(component, {
|
|
106
|
+
options,
|
|
107
|
+
id: data._id,
|
|
108
|
+
items: data.items,
|
|
109
|
+
choices,
|
|
110
|
+
docId: _docId,
|
|
111
|
+
fieldId,
|
|
112
|
+
renderings
|
|
130
113
|
});
|
|
114
|
+
|
|
115
|
+
app.mount(el);
|
|
131
116
|
}
|
|
132
117
|
}
|
|
133
118
|
|
|
134
119
|
function createWidgetClipboardApp() {
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
el: null,
|
|
138
|
-
data: () => {
|
|
120
|
+
class Clipboard {
|
|
121
|
+
constructor() {
|
|
139
122
|
const existing = window.localStorage.getItem('aposWidgetClipboard');
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
};
|
|
143
|
-
},
|
|
144
|
-
mounted() {
|
|
123
|
+
this.widgetClipboard = existing ? JSON.parse(existing) : null;
|
|
124
|
+
|
|
145
125
|
window.addEventListener('storage', this.onStorage);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
set(widget) {
|
|
129
|
+
this.widgetClipboard = widget;
|
|
130
|
+
localStorage.setItem('aposWidgetClipboard', JSON.stringify(this.widgetClipboard));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
get() {
|
|
153
134
|
// If we don't clone, the second paste will be a duplicate key error
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
135
|
+
return klona(this.widgetClipboard);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
onStorage() {
|
|
157
139
|
// When local storage changes, dump the list to
|
|
158
140
|
// the console.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
141
|
+
const contents = window.localStorage.getItem('aposWidgetClipboard');
|
|
142
|
+
if (contents) {
|
|
143
|
+
this.widgetClipboard = JSON.parse(contents);
|
|
163
144
|
}
|
|
164
145
|
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
146
|
+
}
|
|
167
147
|
|
|
148
|
+
apos.area.widgetClipboard = new Clipboard();
|
|
149
|
+
}
|
|
168
150
|
}
|