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.
- package/.eslintrc +13 -4
- package/CHANGELOG.md +37 -5
- package/defaults.js +2 -1
- 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 +16 -16
- 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/attachment/index.js +2 -1
- package/modules/@apostrophecms/attachment/public/img/missing-icon.svg +14 -0
- 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/AposCommandMenuKey.vue +1 -1
- 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/index.js +34 -13
- package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocContextMenu.vue +3 -3
- 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/i18n/en.json +13 -0
- package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +209 -33
- 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 +4 -3
- package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +5 -4
- package/modules/@apostrophecms/login/index.js +18 -1
- 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 +3 -3
- package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -2
- package/modules/@apostrophecms/login/ui/apos/logic/AposLoginForm.js +1 -16
- 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 +17 -11
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +7 -4
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +9 -9
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalLip.vue +2 -2
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -8
- package/modules/@apostrophecms/modal/ui/apos/components/AposModalTabs.vue +4 -3
- 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/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/notification/ui/apos/components/TheAposNotifications.vue +4 -2
- package/modules/@apostrophecms/oembed-field/ui/apos/components/AposInputOembed.vue +12 -10
- package/modules/@apostrophecms/page/index.js +1 -0
- 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/AposDocsManagerSelectBox.vue +9 -5
- package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +15 -11
- 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/AposTiptapButton.vue +1 -1
- package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapImage.vue +1 -1
- 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 +69 -8
- package/modules/@apostrophecms/schema/lib/addFieldTypes.js +1 -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/AposInputPassword.vue +6 -4
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +5 -4
- package/modules/@apostrophecms/schema/ui/apos/components/AposInputRange.vue +9 -6
- 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 +15 -12
- package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +75 -22
- package/modules/@apostrophecms/schema/ui/apos/components/AposSearchList.vue +1 -1
- 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 +3 -3
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +7 -9
- package/modules/@apostrophecms/schema/ui/apos/logic/AposInputWrapper.js +4 -4
- package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +42 -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 +5 -5
- 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/task/index.js +2 -0
- package/modules/@apostrophecms/translation/index.js +233 -0
- package/modules/@apostrophecms/translation/ui/apos/components/AposTranslationIndicator.vue +84 -0
- package/modules/@apostrophecms/ui/ui/apos/components/AposAvatar.vue +2 -1
- 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/AposCellButton.vue +2 -1
- package/modules/@apostrophecms/ui/ui/apos/components/AposCellLabels.vue +49 -5
- package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +19 -19
- package/modules/@apostrophecms/ui/ui/apos/components/AposCloudUploadIcon.vue +10 -5
- package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +15 -15
- package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +214 -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/AposEmptyState.vue +3 -3
- 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/AposIndicator.vue +1 -1
- package/modules/@apostrophecms/ui/ui/apos/components/AposLabel.vue +1 -1
- 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/AposPagerDots.vue +2 -1
- package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +13 -12
- package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +53 -59
- package/modules/@apostrophecms/ui/ui/apos/components/AposSpinner.vue +2 -2
- package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +2 -2
- package/modules/@apostrophecms/ui/ui/apos/components/AposTag.vue +3 -2
- package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +40 -35
- package/modules/@apostrophecms/ui/ui/apos/components/AposTagListItem.vue +2 -1
- 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/_theme.scss +1 -0
- 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/attachments.js +5 -0
- package/test/schemas.js +138 -0
- package/test/translation.js +538 -0
- package/test-lib/util.js +21 -0
- 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
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
<template #leftControls>
|
|
4
4
|
<AposButton
|
|
5
5
|
v-if="canSelectAll"
|
|
6
|
+
ref="selectAll"
|
|
6
7
|
label="apostrophe:select"
|
|
7
8
|
type="outline"
|
|
8
9
|
:modifiers="['small']"
|
|
9
10
|
text-color="var(--a-base-1)"
|
|
10
11
|
:icon-only="true"
|
|
11
12
|
:icon="checkboxIcon"
|
|
12
|
-
@click="selectAll"
|
|
13
|
-
ref="selectAll"
|
|
14
13
|
data-apos-test="selectAll"
|
|
14
|
+
@click="selectAll"
|
|
15
15
|
/>
|
|
16
16
|
<div
|
|
17
17
|
v-for="{
|
|
@@ -50,8 +50,10 @@
|
|
|
50
50
|
<template #rightControls>
|
|
51
51
|
<AposPager
|
|
52
52
|
v-if="!options.noPager && totalPages !== 0"
|
|
53
|
-
|
|
54
|
-
:
|
|
53
|
+
:total-pages="totalPages"
|
|
54
|
+
:current-page="currentPage"
|
|
55
|
+
@click="registerPageChange"
|
|
56
|
+
@change="registerPageChange"
|
|
55
57
|
/>
|
|
56
58
|
<AposFilterMenu
|
|
57
59
|
v-if="filters.length"
|
|
@@ -62,11 +64,13 @@
|
|
|
62
64
|
/>
|
|
63
65
|
<AposInputString
|
|
64
66
|
v-if="hasSearch"
|
|
65
|
-
|
|
67
|
+
ref="search"
|
|
66
68
|
:field="searchField.field"
|
|
67
|
-
:status="searchField.status"
|
|
69
|
+
:status="searchField.status"
|
|
70
|
+
:model-value="searchField.value"
|
|
68
71
|
:modifiers="['small']"
|
|
69
|
-
|
|
72
|
+
@update:model-value="search"
|
|
73
|
+
@return="search($event, true)"
|
|
70
74
|
/>
|
|
71
75
|
</template>
|
|
72
76
|
</AposModalToolbar>
|
|
@@ -188,7 +192,7 @@ export default {
|
|
|
188
192
|
apos.bus.$on('command-menu-manager-archive-selected', this.archiveSelected);
|
|
189
193
|
apos.bus.$on('command-menu-manager-focus-search', this.focusSearch);
|
|
190
194
|
},
|
|
191
|
-
|
|
195
|
+
unmounted () {
|
|
192
196
|
apos.bus.$off('command-menu-manager-select-all', this.selectAll);
|
|
193
197
|
apos.bus.$off('command-menu-manager-archive-selected', this.archiveSelected);
|
|
194
198
|
apos.bus.$off('command-menu-manager-focus-search', this.focusSearch);
|
|
@@ -322,11 +326,11 @@ export default {
|
|
|
322
326
|
</script>
|
|
323
327
|
|
|
324
328
|
<style lang="scss" scoped>
|
|
325
|
-
.apos-manager-toolbar
|
|
326
|
-
.apos-field--search {
|
|
329
|
+
.apos-manager-toolbar {
|
|
330
|
+
:deep(.apos-field--search) {
|
|
327
331
|
width: 250px;
|
|
328
332
|
}
|
|
329
|
-
.apos-input {
|
|
333
|
+
:deep(.apos-input) {
|
|
330
334
|
height: 32px;
|
|
331
335
|
}
|
|
332
336
|
}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<transition
|
|
3
3
|
:name="transitionType"
|
|
4
|
+
:duration="250"
|
|
4
5
|
@enter="onEnter"
|
|
5
6
|
@leave="onLeave"
|
|
6
|
-
:duration="250"
|
|
7
7
|
>
|
|
8
8
|
<section
|
|
9
9
|
v-if="modal.active"
|
|
10
|
+
ref="modalEl"
|
|
10
11
|
:class="classes"
|
|
11
12
|
role="dialog"
|
|
12
13
|
aria-modal="true"
|
|
13
14
|
:aria-labelledby="id"
|
|
14
|
-
|
|
15
|
+
data-apos-modal
|
|
15
16
|
@keydown="cycleElementsToFocus"
|
|
16
17
|
@focus.capture="storeFocusedElement"
|
|
17
|
-
data-apos-modal
|
|
18
18
|
>
|
|
19
19
|
<transition :name="transitionType">
|
|
20
20
|
<div
|
|
21
|
-
@click="close"
|
|
22
21
|
v-if="modal.showModal"
|
|
23
22
|
class="apos-modal__overlay"
|
|
23
|
+
@click="close"
|
|
24
24
|
/>
|
|
25
25
|
</transition>
|
|
26
26
|
<transition :name="transitionType" @after-leave="$emit('inactive')">
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
</div>
|
|
40
40
|
</template>
|
|
41
41
|
<template v-else>
|
|
42
|
-
<header
|
|
42
|
+
<header v-if="!modal.disableHeader" class="apos-modal__header">
|
|
43
43
|
<div class="apos-modal__header__main">
|
|
44
44
|
<div v-if="hasSecondaryControls" class="apos-modal__controls--secondary">
|
|
45
45
|
<slot name="secondaryControls" />
|
|
@@ -50,20 +50,20 @@
|
|
|
50
50
|
</span>
|
|
51
51
|
{{ $t(modalTitle) }}
|
|
52
52
|
</h2>
|
|
53
|
-
<div
|
|
54
|
-
<div class="apos-modal__locale"
|
|
53
|
+
<div v-if="hasBeenLocalized || hasPrimaryControls" class="apos-modal__controls--header">
|
|
54
|
+
<div v-if="hasBeenLocalized" class="apos-modal__locale">
|
|
55
55
|
<span class="apos-modal__locale-label">
|
|
56
56
|
{{ $t('apostrophe:locale') }}:
|
|
57
57
|
</span> <span class="apos-modal__locale-name">
|
|
58
58
|
{{ currentLocale }}
|
|
59
59
|
</span>
|
|
60
60
|
</div>
|
|
61
|
-
<div class="apos-modal__controls--primary"
|
|
61
|
+
<div v-if="hasPrimaryControls" class="apos-modal__controls--primary">
|
|
62
62
|
<slot name="primaryControls" />
|
|
63
63
|
</div>
|
|
64
64
|
</div>
|
|
65
65
|
</div>
|
|
66
|
-
<div class="apos-modal__breadcrumbs"
|
|
66
|
+
<div v-if="hasBreadcrumbs" class="apos-modal__breadcrumbs">
|
|
67
67
|
<slot class="apos-modal__breadcrumbs" name="breadcrumbs" />
|
|
68
68
|
</div>
|
|
69
69
|
</header>
|
|
@@ -308,7 +308,7 @@ export default {
|
|
|
308
308
|
top: 0;
|
|
309
309
|
bottom: 0;
|
|
310
310
|
transform: translateX(0);
|
|
311
|
-
width:
|
|
311
|
+
width: 100%;
|
|
312
312
|
border-radius: 0;
|
|
313
313
|
height: 100vh;
|
|
314
314
|
|
|
@@ -339,6 +339,12 @@ export default {
|
|
|
339
339
|
}
|
|
340
340
|
}
|
|
341
341
|
|
|
342
|
+
&.apos-modal__inner--full {
|
|
343
|
+
@media screen and (min-width: 800px) {
|
|
344
|
+
max-width: 100%;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
342
348
|
&.slide-left-enter,
|
|
343
349
|
&.slide-left-leave-to {
|
|
344
350
|
transform: translateX(100%);
|
|
@@ -448,7 +454,7 @@ export default {
|
|
|
448
454
|
justify-content: flex-end;
|
|
449
455
|
flex-grow: 1;
|
|
450
456
|
}
|
|
451
|
-
.apos-modal__controls--primary
|
|
457
|
+
:deep(.apos-modal__controls--primary) {
|
|
452
458
|
& > .apos-button__wrapper,
|
|
453
459
|
& > .apos-context-menu {
|
|
454
460
|
margin-left: 7.5px;
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
<nav :class="['apos-breadcrumb', classObj]" aria-label="breadcrumb">
|
|
3
3
|
<ol class="apos-breadcrumb__items">
|
|
4
4
|
<li
|
|
5
|
-
v-for="(item, index) in items"
|
|
5
|
+
v-for="(item, index) in items"
|
|
6
|
+
:key="index"
|
|
6
7
|
:class="`apos-breadcrumb__item ${modifier}`"
|
|
7
8
|
>
|
|
8
9
|
<component
|
|
9
|
-
:is="item.target ? 'button' : 'span'"
|
|
10
|
+
:is="item.target ? 'button' : 'span'"
|
|
11
|
+
:data-apos-target="item.target"
|
|
10
12
|
:type="item.target ? 'button' : null"
|
|
11
13
|
:aria-label="item.target ? {
|
|
12
14
|
key: 'apostrophe:returnToPage',
|
|
@@ -17,8 +19,9 @@
|
|
|
17
19
|
{{ item.label }}
|
|
18
20
|
</component>
|
|
19
21
|
<ChevronRightIcon
|
|
20
|
-
class="apos-breadcrumb__chevron" :size="13"
|
|
21
22
|
v-if="index !== last"
|
|
23
|
+
class="apos-breadcrumb__chevron"
|
|
24
|
+
:size="13"
|
|
22
25
|
/>
|
|
23
26
|
</li>
|
|
24
27
|
</ol>
|
|
@@ -26,7 +29,7 @@
|
|
|
26
29
|
</template>
|
|
27
30
|
|
|
28
31
|
<script>
|
|
29
|
-
import ChevronRightIcon from 'vue-material-design-icons/ChevronRight.vue';
|
|
32
|
+
import ChevronRightIcon from '@apostrophecms/vue-material-design-icons/ChevronRight.vue';
|
|
30
33
|
|
|
31
34
|
export default {
|
|
32
35
|
name: 'AposModalBreadcrumbs',
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
{{ localize(content.description) }}
|
|
29
29
|
</p>
|
|
30
30
|
<Component
|
|
31
|
-
v-if="content.body"
|
|
32
31
|
:is="content.body.component"
|
|
32
|
+
v-if="content.body"
|
|
33
33
|
v-bind="content.body.props"
|
|
34
34
|
/>
|
|
35
35
|
<div v-if="content.form" class="apos-confirm__schema">
|
|
@@ -48,15 +48,15 @@
|
|
|
48
48
|
@click="cancel"
|
|
49
49
|
/>
|
|
50
50
|
<AposButton
|
|
51
|
+
ref="confirm"
|
|
51
52
|
class="apos-confirm__btn"
|
|
52
53
|
:label="affirmativeLabel"
|
|
53
|
-
@click="confirm"
|
|
54
54
|
:type="content.theme || 'primary'"
|
|
55
55
|
:disabled="isDisabled"
|
|
56
|
-
|
|
56
|
+
@click="confirm"
|
|
57
57
|
/>
|
|
58
58
|
</div>
|
|
59
|
-
<p
|
|
59
|
+
<p v-if="content.note" class="apos-confirm__note">
|
|
60
60
|
{{ localize(content.note) }}
|
|
61
61
|
</p>
|
|
62
62
|
</template>
|
|
@@ -167,7 +167,7 @@ export default {
|
|
|
167
167
|
justify-content: center;
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
:deep(.apos-modal__inner) {
|
|
171
171
|
top: auto;
|
|
172
172
|
right: auto;
|
|
173
173
|
bottom: auto;
|
|
@@ -177,17 +177,17 @@ export default {
|
|
|
177
177
|
text-align: center;
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
-
|
|
180
|
+
:deep(.apos-modal__overlay) {
|
|
181
181
|
.apos-modal + .apos-confirm & {
|
|
182
182
|
display: block;
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
:deep(.apos-modal__body) {
|
|
187
187
|
padding: 60px;
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
:deep(.apos-modal__body-main) {
|
|
191
191
|
display: flex;
|
|
192
192
|
flex-direction: column;
|
|
193
193
|
align-items: center;
|
|
@@ -223,7 +223,7 @@ export default {
|
|
|
223
223
|
margin-top: $spacing-base;
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
-
|
|
226
|
+
:deep(.apos-schema .apos-field) {
|
|
227
227
|
margin-bottom: $spacing-base;
|
|
228
228
|
}
|
|
229
229
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<!-- Disabling since the SVG is mostly not active vue template code. -->
|
|
3
3
|
<!-- eslint-disable vue/max-attributes-per-line -->
|
|
4
|
-
<div class="apos-modal-lip"
|
|
4
|
+
<div ref="lip" class="apos-modal-lip">
|
|
5
5
|
<div class="apos-modal-lip__shadow">
|
|
6
6
|
<svg width="406px" height="56px" viewBox="0 0 406 56" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
7
7
|
<title>Shadow</title>
|
|
8
8
|
<defs>
|
|
9
9
|
<rect id="shadow-path-1" x="0" y="0" width="406" height="56" />
|
|
10
10
|
<rect id="shadow-path-3" x="-13" y="20" width="432" height="83" />
|
|
11
|
-
<filter x="-6.2%" y="-28.9%" width="112.5%" height="165.1%" filterUnits="objectBoundingBox"
|
|
11
|
+
<filter id="shadow-filter-4" x="-6.2%" y="-28.9%" width="112.5%" height="165.1%" filterUnits="objectBoundingBox">
|
|
12
12
|
<feMorphology radius="3" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1" />
|
|
13
13
|
<feOffset dx="0" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1" />
|
|
14
14
|
<feGaussianBlur stdDeviation="6.5" in="shadowOffsetOuter1" result="shadowBlurOuter1" />
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
class="apos-share-draft__toggle"
|
|
31
31
|
@toggle="toggle"
|
|
32
32
|
/>
|
|
33
|
-
<p
|
|
33
|
+
<p class="apos-share-draft__toggle-label" @click="toggle">
|
|
34
34
|
{{ $t('apostrophe:shareDraftEnable') }}
|
|
35
35
|
</p>
|
|
36
36
|
</div>
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
:duration="200"
|
|
43
43
|
>
|
|
44
44
|
<div
|
|
45
|
-
class="apos-share-draft__url-block"
|
|
46
45
|
v-show="!disabled"
|
|
46
|
+
class="apos-share-draft__url-block"
|
|
47
47
|
>
|
|
48
48
|
<input
|
|
49
49
|
v-model="shareUrl"
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
</template>
|
|
75
75
|
|
|
76
76
|
<script>
|
|
77
|
-
import Close from 'vue-material-design-icons/Close.vue';
|
|
78
|
-
import LinkVariant from 'vue-material-design-icons/LinkVariant.vue';
|
|
77
|
+
import Close from '@apostrophecms/vue-material-design-icons/Close.vue';
|
|
78
|
+
import LinkVariant from '@apostrophecms/vue-material-design-icons/LinkVariant.vue';
|
|
79
79
|
|
|
80
80
|
export default {
|
|
81
81
|
components: {
|
|
@@ -213,7 +213,7 @@ export default {
|
|
|
213
213
|
justify-content: center;
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
-
|
|
216
|
+
:deep(.apos-modal__inner) {
|
|
217
217
|
top: auto;
|
|
218
218
|
right: auto;
|
|
219
219
|
bottom: auto;
|
|
@@ -223,17 +223,17 @@ export default {
|
|
|
223
223
|
border-radius: 15px;
|
|
224
224
|
}
|
|
225
225
|
|
|
226
|
-
|
|
226
|
+
:deep(.apos-modal__overlay) {
|
|
227
227
|
.apos-modal + .apos-share-draft & {
|
|
228
228
|
display: block;
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
-
|
|
232
|
+
:deep(.apos-modal__body) {
|
|
233
233
|
padding: 20px;
|
|
234
234
|
}
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
:deep(.apos-modal__body-main) {
|
|
237
237
|
display: flex;
|
|
238
238
|
flex-direction: column;
|
|
239
239
|
align-items: center;
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
<div class="apos-modal-tabs">
|
|
3
3
|
<ul class="apos-modal-tabs__tabs">
|
|
4
4
|
<li
|
|
5
|
-
class="apos-modal-tabs__tab"
|
|
6
5
|
v-for="tab in tabs"
|
|
7
|
-
:key="tab.name"
|
|
8
6
|
v-show="tab.isVisible !== false"
|
|
7
|
+
:key="tab.name"
|
|
8
|
+
class="apos-modal-tabs__tab"
|
|
9
9
|
>
|
|
10
10
|
<button
|
|
11
|
-
:id="tab.name"
|
|
11
|
+
:id="tab.name"
|
|
12
|
+
class="apos-modal-tabs__btn"
|
|
12
13
|
:aria-selected="tab.name === current ? true : false"
|
|
13
14
|
@click="selectTab"
|
|
14
15
|
>
|
|
@@ -35,16 +35,16 @@ export default {
|
|
|
35
35
|
justify-content: space-between;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
.apos-toolbar__group
|
|
39
|
-
|
|
38
|
+
.apos-toolbar__group {
|
|
39
|
+
display: flex;
|
|
40
|
+
align-items: center;
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
.apos-toolbar__group--
|
|
43
|
-
margin-
|
|
43
|
+
.apos-toolbar__group--left > :deep(*) {
|
|
44
|
+
margin-right: 7.5px;
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
.apos-toolbar__group {
|
|
47
|
-
|
|
48
|
-
align-items: center;
|
|
47
|
+
.apos-toolbar__group--right > :deep(*) {
|
|
48
|
+
margin-left: 20px;
|
|
49
49
|
}
|
|
50
50
|
</style>
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
|
-
id="apos-modals"
|
|
3
|
+
id="apos-modals"
|
|
4
|
+
:class="themeClass"
|
|
4
5
|
>
|
|
5
6
|
<component
|
|
6
|
-
v-for="modal in stack" :key="modal.id"
|
|
7
|
-
:is="modal.componentName"
|
|
8
7
|
v-bind="modal.props"
|
|
8
|
+
:is="modal.componentName"
|
|
9
|
+
v-for="modal in stack"
|
|
10
|
+
:key="modal.id"
|
|
9
11
|
@modal-result="modal.result = $event"
|
|
10
12
|
@safe-close="resolve(modal)"
|
|
11
13
|
/>
|
|
@@ -64,7 +66,7 @@ export default {
|
|
|
64
66
|
},
|
|
65
67
|
methods: {
|
|
66
68
|
async execute(componentName, props) {
|
|
67
|
-
return new Promise((resolve
|
|
69
|
+
return new Promise((resolve) => {
|
|
68
70
|
const item = {
|
|
69
71
|
id: cuid(),
|
|
70
72
|
componentName,
|
|
@@ -112,6 +114,22 @@ export default {
|
|
|
112
114
|
};
|
|
113
115
|
|
|
114
116
|
return properties;
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
async confirm(content, options = {}) {
|
|
120
|
+
return this.execute(apos.modal.components.confirm, {
|
|
121
|
+
content,
|
|
122
|
+
mode: 'confirm',
|
|
123
|
+
options
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
async alert(alertContent, options = {}) {
|
|
128
|
+
return this.execute(apos.modal.components.confirm, {
|
|
129
|
+
content: alertContent,
|
|
130
|
+
mode: 'alert',
|
|
131
|
+
options
|
|
132
|
+
});
|
|
115
133
|
}
|
|
116
134
|
}
|
|
117
135
|
};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { ref } from 'vue';
|
|
2
|
+
|
|
3
|
+
export function useAposFocus() {
|
|
4
|
+
const elementsToFocus = ref([]);
|
|
5
|
+
const focusedElement = ref(null);
|
|
6
|
+
|
|
7
|
+
return {
|
|
8
|
+
elementsToFocus,
|
|
9
|
+
focusedElement,
|
|
10
|
+
cycleElementsToFocus,
|
|
11
|
+
focuslastmodalfocusedelement,
|
|
12
|
+
storeFocusedElement,
|
|
13
|
+
focusElement,
|
|
14
|
+
isElementVisible
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// Adapted from https://uxdesign.cc/how-to-trap-focus-inside-modal-to-make-it-ada-compliant-6a50f9a70700
|
|
18
|
+
// All the elements inside modal which you want to make focusable.
|
|
19
|
+
//
|
|
20
|
+
// This has been adapted to Vue logic with `this.elementsToFocus` array as a data
|
|
21
|
+
// so that any elements, not only from a modal but a menu for instance, can be focusable.
|
|
22
|
+
// `cycleElementsToFocus` listeners relies on this dynamic list which has the advantage of
|
|
23
|
+
// taking new or less elements to focus, after an update has happened inside a modal,
|
|
24
|
+
// like an XHR call to get the pieces list in the AposDocsManager modal, for instance.
|
|
25
|
+
function cycleElementsToFocus(e) {
|
|
26
|
+
if (!elementsToFocus.value.length) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const isTabPressed = e.key === 'Tab' || e.code === 'Tab';
|
|
31
|
+
if (!isTabPressed) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const firstElementToFocus = elementsToFocus.value.at(0);
|
|
36
|
+
const lastElementToFocus = elementsToFocus.value.at(-1);
|
|
37
|
+
|
|
38
|
+
// If shift key pressed for shift + tab combination
|
|
39
|
+
if (e.shiftKey) {
|
|
40
|
+
if (document.activeElement === firstElementToFocus) {
|
|
41
|
+
// Add focus for the last focusable element
|
|
42
|
+
lastElementToFocus.focus();
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
}
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// If tab key is pressed
|
|
49
|
+
if (document.activeElement === lastElementToFocus) {
|
|
50
|
+
// Add focus for the first focusable element
|
|
51
|
+
firstElementToFocus.focus();
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Focus the last focused element from the last modal.
|
|
57
|
+
// If it is not focusable (not visible/not in the DOM),
|
|
58
|
+
// fallbacks to the first focusable element from the last modal.
|
|
59
|
+
function focuslastmodalfocusedelement() {
|
|
60
|
+
const lastModal = apos.modal.stack.at(-1);
|
|
61
|
+
|
|
62
|
+
if (!lastModal) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const { focusedElement, elementsToFocus } = lastModal;
|
|
67
|
+
|
|
68
|
+
focusElement(focusedElement, elementsToFocus[0]);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function storeFocusedElement(e) {
|
|
72
|
+
focusedElement.value = e.target;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Iterate through elements given in arguments and
|
|
76
|
+
// focus the first element that exists in the DOM.
|
|
77
|
+
function focusElement(...elementsToFocus) {
|
|
78
|
+
for (const element of elementsToFocus) {
|
|
79
|
+
const isAlreadySelected = document.activeElement === element;
|
|
80
|
+
|
|
81
|
+
if (!element || !isElementVisible(element)) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (!isAlreadySelected) {
|
|
85
|
+
element.focus();
|
|
86
|
+
}
|
|
87
|
+
// Element exists in the DOM and is focused, stop iterating.
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function isElementVisible(element) {
|
|
93
|
+
return element.offsetParent !== null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -12,8 +12,7 @@ export default {
|
|
|
12
12
|
icons: {},
|
|
13
13
|
// If passing in chosen items from the relationship input, use those
|
|
14
14
|
// as initially checked.
|
|
15
|
-
checked: Array.isArray(this.chosen) ? this.chosen.map(item => item._id)
|
|
16
|
-
: [],
|
|
15
|
+
checked: Array.isArray(this.chosen) ? this.chosen.map(item => item._id) : [],
|
|
17
16
|
checkedDocs: Array.isArray(this.chosen) ? klona(this.chosen) : [],
|
|
18
17
|
// Remember relationship subfield values even if a document
|
|
19
18
|
// is temporarily deselected, easing the user's pain if they
|
|
@@ -86,7 +85,7 @@ export default {
|
|
|
86
85
|
mounted() {
|
|
87
86
|
this.docsManagerAddEventHandlers();
|
|
88
87
|
},
|
|
89
|
-
|
|
88
|
+
unmounted() {
|
|
90
89
|
this.docsManagerRemoveEventHandlers();
|
|
91
90
|
},
|
|
92
91
|
watch: {
|
|
@@ -154,7 +154,7 @@ module.exports = {
|
|
|
154
154
|
dismissed
|
|
155
155
|
});
|
|
156
156
|
|
|
157
|
-
|
|
157
|
+
await self.db.updateOne({ _id }, {
|
|
158
158
|
$set: {
|
|
159
159
|
dismissed
|
|
160
160
|
},
|
|
@@ -164,8 +164,8 @@ module.exports = {
|
|
|
164
164
|
});
|
|
165
165
|
}
|
|
166
166
|
},
|
|
167
|
-
delete(req, _id) {
|
|
168
|
-
|
|
167
|
+
async delete(req, _id) {
|
|
168
|
+
await self.db.deleteMany({ _id });
|
|
169
169
|
}
|
|
170
170
|
}),
|
|
171
171
|
apiRoutes(self) {
|
|
@@ -414,7 +414,7 @@ module.exports = {
|
|
|
414
414
|
|
|
415
415
|
async ensureCollection() {
|
|
416
416
|
self.db = self.apos.db.collection('aposNotifications');
|
|
417
|
-
|
|
417
|
+
await self.db.createIndex({
|
|
418
418
|
userId: 1,
|
|
419
419
|
createdAt: 1
|
|
420
420
|
});
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import createApp from 'Modules/@apostrophecms/ui/lib/vue';
|
|
2
2
|
|
|
3
3
|
export default function() {
|
|
4
|
-
|
|
4
|
+
const component = apos.vueComponents.TheAposNotifications;
|
|
5
|
+
const el = document.querySelector('#apos-notification');
|
|
6
|
+
if (!apos.login.user || !el) {
|
|
5
7
|
// The user scene is being used but no one is logged in
|
|
6
8
|
// (example: the login page)
|
|
7
9
|
return;
|
|
8
10
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
el: '#apos-notification',
|
|
12
|
-
render: function (h) {
|
|
13
|
-
return h('TheAposNotifications');
|
|
14
|
-
}
|
|
15
|
-
});
|
|
11
|
+
const app = createApp(component);
|
|
12
|
+
app.mount(el);
|
|
16
13
|
};
|