apostrophe 3.63.3 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/.eslintrc +13 -4
  2. package/CHANGELOG.md +37 -5
  3. package/defaults.js +2 -1
  4. package/modules/@apostrophecms/admin-bar/ui/apos/apps/AposAdminBar.js +7 -17
  5. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBar.vue +14 -16
  6. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarLocale.vue +1 -1
  7. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarMenu.vue +22 -15
  8. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarUser.vue +2 -2
  9. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextBar.vue +13 -8
  10. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextModeAndSettings.vue +18 -10
  11. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextTitle.vue +4 -4
  12. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextUndoRedo.vue +14 -8
  13. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposSavingIndicator.vue +2 -1
  14. package/modules/@apostrophecms/area/ui/apos/apps/AposAreas.js +36 -54
  15. package/modules/@apostrophecms/area/ui/apos/components/AposAreaContextualMenu.vue +20 -25
  16. package/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +5 -12
  17. package/modules/@apostrophecms/area/ui/apos/components/AposAreaExpandedMenu.vue +11 -3
  18. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenu.vue +6 -6
  19. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenuItem.vue +3 -2
  20. package/modules/@apostrophecms/area/ui/apos/components/AposAreaWidget.vue +31 -44
  21. package/modules/@apostrophecms/area/ui/apos/components/AposWidgetControls.vue +16 -16
  22. package/modules/@apostrophecms/asset/index.js +25 -12
  23. package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.config.js +3 -3
  24. package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.vue.js +7 -1
  25. package/modules/@apostrophecms/attachment/index.js +2 -1
  26. package/modules/@apostrophecms/attachment/public/img/missing-icon.svg +14 -0
  27. package/modules/@apostrophecms/busy/ui/apos/apps/AposBusy.js +8 -7
  28. package/modules/@apostrophecms/busy/ui/apos/components/TheAposBusy.vue +1 -1
  29. package/modules/@apostrophecms/command-menu/ui/apos/apps/AposCommandMenu.js +11 -29
  30. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuKey.vue +1 -1
  31. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuShortcut.vue +6 -6
  32. package/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +10 -7
  33. package/modules/@apostrophecms/doc-type/index.js +34 -13
  34. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocContextMenu.vue +3 -3
  35. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +20 -15
  36. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +1 -1
  37. package/modules/@apostrophecms/i18n/i18n/en.json +13 -0
  38. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +209 -33
  39. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalizeErrors.vue +3 -3
  40. package/modules/@apostrophecms/image/ui/apos/components/AposImageCropper.vue +5 -5
  41. package/modules/@apostrophecms/image/ui/apos/components/AposImageRelationshipEditor.vue +6 -6
  42. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +23 -16
  43. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +11 -11
  44. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +28 -21
  45. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +4 -3
  46. package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +5 -4
  47. package/modules/@apostrophecms/login/index.js +18 -1
  48. package/modules/@apostrophecms/login/ui/apos/apps/AposLogin.js +6 -7
  49. package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -3
  50. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +10 -10
  51. package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +3 -3
  52. package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -2
  53. package/modules/@apostrophecms/login/ui/apos/logic/AposLoginForm.js +1 -16
  54. package/modules/@apostrophecms/modal/ui/apos/apps/AposModals.js +60 -87
  55. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +15 -11
  56. package/modules/@apostrophecms/modal/ui/apos/components/AposModal.vue +17 -11
  57. package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +7 -4
  58. package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +9 -9
  59. package/modules/@apostrophecms/modal/ui/apos/components/AposModalLip.vue +2 -2
  60. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -8
  61. package/modules/@apostrophecms/modal/ui/apos/components/AposModalTabs.vue +4 -3
  62. package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +7 -7
  63. package/modules/@apostrophecms/modal/ui/apos/components/TheAposModals.vue +22 -4
  64. package/modules/@apostrophecms/modal/ui/apos/composables/AposFocus.js +95 -0
  65. package/modules/@apostrophecms/modal/ui/apos/mixins/AposDocsManagerMixin.js +2 -3
  66. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +6 -0
  67. package/modules/@apostrophecms/notification/index.js +4 -4
  68. package/modules/@apostrophecms/notification/ui/apos/apps/AposNotification.js +6 -9
  69. package/modules/@apostrophecms/notification/ui/apos/components/AposNotification.vue +12 -8
  70. package/modules/@apostrophecms/notification/ui/apos/components/TheAposNotifications.vue +4 -2
  71. package/modules/@apostrophecms/oembed-field/ui/apos/components/AposInputOembed.vue +12 -10
  72. package/modules/@apostrophecms/page/index.js +1 -0
  73. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +15 -11
  74. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +1 -1
  75. package/modules/@apostrophecms/permission/ui/apos/components/AposInputRole.vue +3 -3
  76. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +25 -17
  77. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerDisplay.vue +24 -20
  78. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerSelectBox.vue +9 -5
  79. package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +15 -11
  80. package/modules/@apostrophecms/rich-text-widget/index.js +1 -0
  81. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +7 -6
  82. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +31 -30
  83. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +12 -10
  84. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapButton.vue +1 -1
  85. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapImage.vue +1 -1
  86. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +9 -8
  87. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapStyles.vue +3 -3
  88. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapTable.vue +3 -3
  89. package/modules/@apostrophecms/schema/index.js +69 -8
  90. package/modules/@apostrophecms/schema/lib/addFieldTypes.js +1 -1
  91. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +10 -8
  92. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +5 -3
  93. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +81 -277
  94. package/modules/@apostrophecms/schema/ui/apos/components/AposInputAttachment.vue +4 -2
  95. package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +24 -14
  96. package/modules/@apostrophecms/schema/ui/apos/components/AposInputCheckboxes.vue +7 -6
  97. package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +10 -7
  98. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +3 -3
  99. package/modules/@apostrophecms/schema/ui/apos/components/AposInputPassword.vue +6 -4
  100. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +5 -4
  101. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRange.vue +9 -6
  102. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +15 -12
  103. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSelect.vue +1 -1
  104. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +16 -12
  105. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +19 -11
  106. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +15 -12
  107. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +75 -22
  108. package/modules/@apostrophecms/schema/ui/apos/components/AposSearchList.vue +1 -1
  109. package/modules/@apostrophecms/schema/ui/apos/components/AposSubform.vue +2 -2
  110. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +0 -4
  111. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +3 -3
  112. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +15 -4
  113. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputAttachment.js +3 -3
  114. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputCheckboxes.js +7 -7
  115. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputColor.js +5 -8
  116. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputDateAndTime.js +1 -1
  117. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +1 -1
  118. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRadio.js +1 -1
  119. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +12 -9
  120. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSelect.js +3 -3
  121. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +7 -9
  122. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputWrapper.js +4 -4
  123. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +42 -13
  124. package/modules/@apostrophecms/schema/ui/apos/logic/AposSubform.js +1 -1
  125. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +9 -9
  126. package/modules/@apostrophecms/schema/ui/apos/scss/AposInputArray.scss +205 -0
  127. package/modules/@apostrophecms/settings/ui/apos/components/AposSettingsManager.vue +5 -5
  128. package/modules/@apostrophecms/settings/ui/apos/logic/AposSettingsManager.js +4 -4
  129. package/modules/@apostrophecms/submitted-draft/ui/apos/components/AposSubmittedDraftIcon.vue +5 -4
  130. package/modules/@apostrophecms/task/index.js +2 -0
  131. package/modules/@apostrophecms/translation/index.js +233 -0
  132. package/modules/@apostrophecms/translation/ui/apos/components/AposTranslationIndicator.vue +84 -0
  133. package/modules/@apostrophecms/ui/ui/apos/components/AposAvatar.vue +2 -1
  134. package/modules/@apostrophecms/ui/ui/apos/components/AposButton.vue +4 -4
  135. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonGroup.vue +6 -6
  136. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonSplit.vue +120 -113
  137. package/modules/@apostrophecms/ui/ui/apos/components/AposCellButton.vue +2 -1
  138. package/modules/@apostrophecms/ui/ui/apos/components/AposCellLabels.vue +49 -5
  139. package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +19 -19
  140. package/modules/@apostrophecms/ui/ui/apos/components/AposCloudUploadIcon.vue +10 -5
  141. package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +15 -15
  142. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +214 -191
  143. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuDialog.vue +77 -65
  144. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuItem.vue +1 -1
  145. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuTip.vue +28 -50
  146. package/modules/@apostrophecms/ui/ui/apos/components/AposEmptyState.vue +3 -3
  147. package/modules/@apostrophecms/ui/ui/apos/components/AposFile.vue +5 -5
  148. package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +4 -4
  149. package/modules/@apostrophecms/ui/ui/apos/components/AposIndicator.vue +1 -1
  150. package/modules/@apostrophecms/ui/ui/apos/components/AposLabel.vue +1 -1
  151. package/modules/@apostrophecms/ui/ui/apos/components/AposMinMaxCount.vue +5 -5
  152. package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +14 -8
  153. package/modules/@apostrophecms/ui/ui/apos/components/AposPagerDots.vue +2 -1
  154. package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +13 -12
  155. package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +53 -59
  156. package/modules/@apostrophecms/ui/ui/apos/components/AposSpinner.vue +2 -2
  157. package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +2 -2
  158. package/modules/@apostrophecms/ui/ui/apos/components/AposTag.vue +3 -2
  159. package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +40 -35
  160. package/modules/@apostrophecms/ui/ui/apos/components/AposTagListItem.vue +2 -1
  161. package/modules/@apostrophecms/ui/ui/apos/components/AposToggle.vue +2 -2
  162. package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +9 -11
  163. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeHeader.vue +5 -3
  164. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +129 -129
  165. package/modules/@apostrophecms/ui/ui/apos/composables/AposTheme.js +11 -0
  166. package/modules/@apostrophecms/ui/ui/apos/lib/click-outside-element.js +4 -4
  167. package/modules/@apostrophecms/ui/ui/apos/lib/i18next.js +56 -50
  168. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip.js +191 -0
  169. package/modules/@apostrophecms/ui/ui/apos/lib/vue.js +19 -10
  170. package/modules/@apostrophecms/ui/ui/apos/mixins/AposAdvisoryLockMixin.js +1 -1
  171. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tables.scss +1 -1
  172. package/modules/@apostrophecms/ui/ui/apos/scss/global/_theme.scss +1 -0
  173. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tooltips.scss +6 -22
  174. package/modules/@apostrophecms/ui/ui/apos/scss/shared/_table-rows.scss +1 -1
  175. package/modules/@apostrophecms/widget-type/index.js +8 -2
  176. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +26 -22
  177. package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +4 -4
  178. package/package.json +31 -44
  179. package/test/attachments.js +5 -0
  180. package/test/schemas.js +138 -0
  181. package/test/translation.js +538 -0
  182. package/test-lib/util.js +21 -0
  183. package/modules/@apostrophecms/ui/ui/apos/lib/localized-v-tooltip.js +0 -63
  184. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip-options.js +0 -13
@@ -1,55 +1,60 @@
1
1
  <template>
2
2
  <AposContextMenu
3
- @open="open = $event"
4
3
  menu-placement="bottom-end"
4
+ @open="open = $event"
5
5
  >
6
6
  <div class="apos-apply-tag-menu__inner">
7
7
  <AposInputString
8
- @input="updateSearchInput"
8
+ ref="textInput"
9
+ :field="searchField"
10
+ :model-value="searchValue"
11
+ :status="searchStatus"
12
+ @update:model-value="updateSearchInput"
9
13
  @return="create"
10
- :field="searchField" :value="searchValue"
11
- :status="searchStatus" ref="textInput"
12
14
  />
13
15
  <div class="apos-apply-tag__create">
14
16
  <AposButton
15
- @click="create"
16
17
  :label="createLabel"
17
18
  type="quiet"
18
19
  :disabled="disabledCreate"
19
20
  :disable-focus="!open"
21
+ @click="create"
20
22
  />
21
23
  </div>
22
24
  <transition name="fade">
23
- <ol v-if="searchTags.length && !creating" class="apos-apply-tag-menu__tags">
24
- <li
25
- class="apos-apply-tag-menu__tag" v-for="tag in searchTags"
26
- :key="`${keyPrefix}-${tag.slug}`"
27
- >
28
- <AposCheckbox
29
- v-if="checkboxes[tag.slug]"
30
- :field="checkboxes[tag.slug].field"
31
- :status="checkboxes[tag.slug].status"
32
- :choice="checkboxes[tag.slug].choice"
33
- v-model="checked"
34
- @updated="updateTag"
35
- :disable-focus="!open"
36
- />
37
- </li>
38
- </ol>
39
- <div v-if="(!searchTags.length && myTags.length) && !creating" class="apos-apply-tag-menu__empty">
40
- <p class="apos-apply-tag-menu__empty-message">
41
- We couldn't find any matching tags. Perhaps
42
- <AposButton
43
- @click="create"
44
- :label="`create ${searchInputValue} ?`"
45
- type="quiet"
46
- :disabled="disabledCreate"
47
- :disable-focus="!open"
48
- />
49
- </p>
50
- <span class="apos-apply-tag-menu__empty-icon">
51
- 🌾
52
- </span>
25
+ <div>
26
+ <ol v-if="searchTags.length && !creating" class="apos-apply-tag-menu__tags">
27
+ <li
28
+ v-for="tag in searchTags"
29
+ :key="`${keyPrefix}-${tag.slug}`"
30
+ class="apos-apply-tag-menu__tag"
31
+ >
32
+ <AposCheckbox
33
+ v-if="checkboxes[tag.slug]"
34
+ v-model="checked"
35
+ :field="checkboxes[tag.slug].field"
36
+ :status="checkboxes[tag.slug].status"
37
+ :choice="checkboxes[tag.slug].choice"
38
+ :disable-focus="!open"
39
+ @updated="updateTag"
40
+ />
41
+ </li>
42
+ </ol>
43
+ <div v-if="(!searchTags.length && myTags.length) && !creating" class="apos-apply-tag-menu__empty">
44
+ <p class="apos-apply-tag-menu__empty-message">
45
+ We couldn't find any matching tags. Perhaps
46
+ <AposButton
47
+ :label="`create ${searchInputValue} ?`"
48
+ type="quiet"
49
+ :disabled="disabledCreate"
50
+ :disable-focus="!open"
51
+ @click="create"
52
+ />
53
+ </p>
54
+ <span class="apos-apply-tag-menu__empty-icon">
55
+ 🌾
56
+ </span>
57
+ </div>
53
58
  </div>
54
59
  </transition>
55
60
  </div>
@@ -1,7 +1,8 @@
1
1
  <template>
2
2
  <li class="apos-tag-list__item">
3
3
  <button
4
- :class="{'apos-is-active' : active}" class="apos-tag-list__button"
4
+ :class="{'apos-is-active' : active}"
5
+ class="apos-tag-list__button"
5
6
  @click="click(tag)"
6
7
  >
7
8
  <AposIndicator
@@ -2,7 +2,7 @@
2
2
  <div class="apos-toggle__container">
3
3
  <div
4
4
  class="apos-toggle__slider"
5
- :class="{'apos-toggle__slider--activated': !value}"
5
+ :class="{'apos-toggle__slider--activated': !modelValue}"
6
6
  @click="$emit('toggle')"
7
7
  />
8
8
  </div>
@@ -12,7 +12,7 @@
12
12
 
13
13
  export default {
14
14
  props: {
15
- value: {
15
+ modelValue: {
16
16
  type: Boolean,
17
17
  required: true
18
18
  }
@@ -7,22 +7,24 @@
7
7
  @calculated="setWidths"
8
8
  />
9
9
  <AposTreeHeader
10
- :headers="headers" :icons="icons"
11
- :col-widths="colWidths" :hidden="options.hideHeader"
10
+ :headers="headers"
11
+ :icons="icons"
12
+ :col-widths="colWidths"
13
+ :hidden="options.hideHeader"
12
14
  />
13
15
  <AposTreeRows
14
- v-model="checkedProxy"
16
+ v-model:checked="checkedProxy"
17
+ list-id="root"
15
18
  :rows="myItems"
16
19
  :headers="headers"
17
20
  :icons="icons"
18
21
  :col-widths="colWidths"
19
22
  :level="1"
20
23
  :nested="nested"
21
- @update="update"
22
- list-id="root"
23
24
  :options="options"
24
25
  :tree-id="treeId"
25
26
  :module-options="moduleOptions"
27
+ @update="update"
26
28
  />
27
29
  </div>
28
30
  </template>
@@ -33,10 +35,6 @@ import cuid from 'cuid';
33
35
 
34
36
  export default {
35
37
  name: 'AposTree',
36
- model: {
37
- prop: 'checked',
38
- event: 'change'
39
- },
40
38
  props: {
41
39
  headers: {
42
40
  type: Array,
@@ -79,7 +77,7 @@ export default {
79
77
  }
80
78
  }
81
79
  },
82
- emits: [ 'update', 'change' ],
80
+ emits: [ 'update', 'update:checked' ],
83
81
  data() {
84
82
  return {
85
83
  // Copy the `items` property to mutate with VueDraggable.
@@ -96,7 +94,7 @@ export default {
96
94
  return this.checked;
97
95
  },
98
96
  set(val) {
99
- this.$emit('change', val);
97
+ this.$emit('update:checked', val);
100
98
  }
101
99
  },
102
100
  spacingRow() {
@@ -1,6 +1,7 @@
1
1
  <template>
2
2
  <div
3
- class="apos-tree__row-data apos-tree__header" :class="headerClasses"
3
+ class="apos-tree__row-data apos-tree__header"
4
+ :class="headerClasses"
4
5
  :aria-hidden="spacerOnly"
5
6
  >
6
7
  <span
@@ -12,7 +13,8 @@
12
13
  :style="getCellStyles(col)"
13
14
  >
14
15
  <component
15
- v-if="col.columnHeaderIcon" :is="icons[col.columnHeaderIcon]"
16
+ :is="icons[col.columnHeaderIcon]"
17
+ v-if="col.columnHeaderIcon"
16
18
  class="apos-tree__cell__icon"
17
19
  />
18
20
  {{ $t(col.columnHeader) }}
@@ -77,7 +79,7 @@ export default {
77
79
  window.addEventListener('resize', debounce(this.calculateWidths, 100));
78
80
  }
79
81
  },
80
- destroyed() {
82
+ unmounted() {
81
83
  if (this.spacerOnly) {
82
84
  window.removeEventListener('resize', debounce(this.calculateWidths, 100));
83
85
  }
@@ -1,135 +1,136 @@
1
1
  <template>
2
- <VueDraggable
3
- tag="ol"
4
- class="apos-tree__list"
5
- :list="myRows"
2
+ <draggable
6
3
  v-bind="dragOptions"
4
+ item-key="_id"
5
+ class="apos-tree__list"
6
+ tag="ol"
7
+ :list="rows"
7
8
  @start="startDrag"
8
9
  @end="endDrag"
9
10
  >
10
- <li
11
- v-for="row in myRows" :key="row._id"
12
- :data-row-id="row._id" data-apos-tree-row
13
- :class="getRowClasses(row)"
14
- :aria-role="options.selectable ? 'button' : null"
15
- :tabindex="options.selectable ? 0 : null"
16
- v-on="options.selectable ? {
17
- 'click': selectRow,
18
- 'keydown': keydownRow
19
- } : {}"
20
- >
21
- <div class="apos-tree__row-data">
22
- <button
23
- v-if="row._children && row._children.length > 0"
24
- class="apos-tree__row__toggle" data-apos-tree-toggle
25
- :aria-label="$t('apostrophe:toggleSection')" :aria-expanded="!options.startCollapsed"
26
- @click="toggleSection($event)"
27
- >
28
- <AposIndicator
29
- icon="chevron-down-icon"
30
- class="apos-tree__row__toggle-icon"
31
- />
32
- </button>
33
- <component
34
- v-for="(col, index) in headers"
35
- :key="`${col.property}-${index}`"
36
- :is="getEffectiveType(col, row)"
37
- :draft="row"
38
- :published="row._publishedDoc"
39
- :header="col"
40
- :href="(getEffectiveType(col, row) === 'a') ? row[col.property] : false"
41
- :target="col.type === 'link' ? '_blank' : false"
42
- :class="getCellClasses(col, row)"
43
- :disabled="getCellDisabled(col, row)"
44
- :data-col="col.property"
45
- :style="getCellStyles(col.property, index)"
46
- :options="moduleOptions"
47
- @click="((getEffectiveType(col, row) === 'button') && col.action) ? $emit(col.action, row._id) : null"
48
- >
49
- <AposIndicator
50
- v-if="options.draggable && index === 0 && !row.parked"
51
- icon="drag-icon"
52
- class="apos-tree__row__icon apos-tree__row__icon--handle"
53
- />
54
- <AposIndicator
55
- v-if="index === 0 && row.parked && row.type !== '@apostrophecms/archive-page'"
56
- icon="lock-icon"
57
- class="apos-tree__row__icon apos-tree__row__icon--parked"
58
- tooltip="apostrophe:pageIsParked"
59
- />
60
- <AposIndicator
61
- v-if="index === 0 && row.type === '@apostrophecms/archive-page'"
62
- icon="lock-icon"
63
- class="apos-tree__row__icon apos-tree__row__icon--parked"
64
- tooltip="apostrophe:cannotMoveArchive"
65
- />
66
- <AposCheckbox
67
- v-if="options.bulkSelect && index === 0"
68
- class="apos-tree__row__checkbox"
69
- tabindex="-1"
70
- :field="{
71
- name: row._id,
72
- hideLabel: true,
73
- label: {
74
- key: 'apostrophe:toggleSelectionOf',
75
- title: row.title
76
- },
77
- disableFocus: true
78
- }"
79
- :choice="{ value: row._id }"
80
- v-model="checkedProxy"
81
- />
82
- <span class="apos-tree__cell__value">
11
+ <template #item="{element: row}">
12
+ <li
13
+ :data-row-id="row._id"
14
+ data-apos-tree-row
15
+ :class="getRowClasses(row)"
16
+ :aria-role="options.selectable ? 'button' : null"
17
+ :tabindex="options.selectable ? 0 : null"
18
+ v-on="options.selectable ? {
19
+ 'click': selectRow,
20
+ 'keydown': keydownRow
21
+ } : {}"
22
+ >
23
+ <div class="apos-tree__row-data">
24
+ <button
25
+ v-if="row._children && row._children.length > 0"
26
+ class="apos-tree__row__toggle"
27
+ data-apos-tree-toggle
28
+ :aria-label="$t('apostrophe:toggleSection')"
29
+ :aria-expanded="!options.startCollapsed"
30
+ @click="toggleSection($event)"
31
+ >
32
+ <AposIndicator
33
+ icon="chevron-down-icon"
34
+ class="apos-tree__row__toggle-icon"
35
+ />
36
+ </button>
37
+ <component
38
+ :is="getEffectiveType(col, row)"
39
+ v-for="(col, index) in headers"
40
+ :key="`${col.property}-${index}`"
41
+ :draft="row"
42
+ :published="row._publishedDoc"
43
+ :header="col"
44
+ :href="(getEffectiveType(col, row) === 'a') ? row[col.property] : false"
45
+ :target="col.type === 'link' ? '_blank' : false"
46
+ :class="getCellClasses(col, row)"
47
+ :disabled="getCellDisabled(col, row)"
48
+ :data-col="col.property"
49
+ :style="getCellStyles(col.property, index)"
50
+ :options="moduleOptions"
51
+ @click="((getEffectiveType(col, row) === 'button') && col.action) ? $emit(col.action, row._id) : null"
52
+ >
53
+ <AposIndicator
54
+ v-if="options.draggable && index === 0 && !row.parked"
55
+ icon="drag-icon"
56
+ class="apos-tree__row__icon apos-tree__row__icon--handle"
57
+ />
83
58
  <AposIndicator
84
- v-if="getEffectiveIcon(col, row)"
85
- :icon="getEffectiveIcon(col, row)"
86
- class="apos-tree__cell__icon"
87
- :icon-size="getEffectiveIconSize(col, row)"
59
+ v-if="index === 0 && row.parked && row.type !== '@apostrophecms/archive-page'"
60
+ icon="lock-icon"
61
+ class="apos-tree__row__icon apos-tree__row__icon--parked"
62
+ tooltip="apostrophe:pageIsParked"
88
63
  />
89
- <span class="apos-tree__cell__label" v-if="getEffectiveCellLabel(col, row)">
90
- {{ getEffectiveCellLabel(col, row) }}
64
+ <AposIndicator
65
+ v-if="index === 0 && row.type === '@apostrophecms/archive-page'"
66
+ icon="lock-icon"
67
+ class="apos-tree__row__icon apos-tree__row__icon--parked"
68
+ tooltip="apostrophe:cannotMoveArchive"
69
+ />
70
+ <AposCheckbox
71
+ v-if="options.bulkSelect && index === 0"
72
+ v-model="checkedProxy"
73
+ class="apos-tree__row__checkbox"
74
+ tabindex="-1"
75
+ :field="{
76
+ name: row._id,
77
+ hideLabel: true,
78
+ label: {
79
+ key: 'apostrophe:toggleSelectionOf',
80
+ title: row.title
81
+ },
82
+ disableFocus: true
83
+ }"
84
+ :choice="{ value: row._id }"
85
+ />
86
+ <span class="apos-tree__cell__value">
87
+ <AposIndicator
88
+ v-if="getEffectiveIcon(col, row)"
89
+ :icon="getEffectiveIcon(col, row)"
90
+ class="apos-tree__cell__icon"
91
+ :icon-size="getEffectiveIconSize(col, row)"
92
+ />
93
+ <span v-if="getEffectiveCellLabel(col, row)" class="apos-tree__cell__label">
94
+ {{ getEffectiveCellLabel(col, row) }}
95
+ </span>
91
96
  </span>
92
- </span>
93
- </component>
94
- </div>
95
- <AposTreeRows
96
- data-apos-branch-height
97
- :data-list-row="row._id"
98
- ref="tree-branches"
99
- :rows="row._children"
100
- :headers="headers"
101
- :icons="icons"
102
- :col-widths="colWidths"
103
- :level="level + 1"
104
- :nested="nested"
105
- :list-id="row._id"
106
- :tree-id="treeId"
107
- :options="options"
108
- :class="{ 'apos-is-collapsed': options.startCollapsed }"
109
- :style="{
110
- 'max-height': options.startCollapsed ? '0' : null
111
- }"
112
- :module-options="moduleOptions"
113
- @update="$emit('update', $event)"
114
- v-model="checkedProxy"
115
- />
116
- </li>
117
- </VueDraggable>
97
+ </component>
98
+ </div>
99
+ <AposTreeRows
100
+ :ref="(el) => treeBranches.push(el)"
101
+ v-model:checked="checkedProxy"
102
+ data-apos-branch-height
103
+ :data-list-row="row._id"
104
+ :rows="row._children"
105
+ :headers="headers"
106
+ :icons="icons"
107
+ :col-widths="colWidths"
108
+ :level="level + 1"
109
+ :nested="nested"
110
+ :list-id="row._id"
111
+ :tree-id="treeId"
112
+ :options="options"
113
+ :class="{ 'apos-is-collapsed': options.startCollapsed }"
114
+ :style="{
115
+ 'max-height': options.startCollapsed ? '0' : null
116
+ }"
117
+ :module-options="moduleOptions"
118
+ @update="$emit('update', $event)"
119
+ />
120
+ </li>
121
+ </template>
122
+ </draggable>
118
123
  </template>
119
124
 
120
125
  <script>
121
- import VueDraggable from 'vuedraggable';
126
+ import { Sortable } from 'sortablejs-vue3';
122
127
 
123
128
  export default {
124
129
  name: 'AposTreeRows',
125
130
  components: {
126
- VueDraggable
131
+ draggable: Sortable
127
132
  },
128
133
  // Custom model to handle the v-model connection on the parent.
129
- model: {
130
- prop: 'checked',
131
- event: 'change'
132
- },
133
134
  props: {
134
135
  headers: {
135
136
  type: Array,
@@ -189,23 +190,22 @@ export default {
189
190
  }
190
191
  }
191
192
  },
192
- emits: [ 'update', 'change' ],
193
+ emits: [ 'update', 'update:checked', 'change' ],
194
+ data() {
195
+ return {
196
+ treeBranches: []
197
+ };
198
+ },
193
199
  computed: {
194
- myRows() {
195
- return this.rows;
196
- },
197
200
  // Handle the local check state within this component.
198
201
  checkedProxy: {
199
202
  get() {
200
203
  return this.checked;
201
204
  },
202
205
  set(val) {
203
- this.$emit('change', val);
206
+ this.$emit('update:checked', val);
204
207
  }
205
208
  },
206
- isOpen() {
207
- return true;
208
- },
209
209
  dragOptions() {
210
210
  return {
211
211
  group: { name: this.treeId },
@@ -228,7 +228,7 @@ export default {
228
228
  },
229
229
  methods: {
230
230
  setHeights() {
231
- this.$refs['tree-branches'].forEach(branch => {
231
+ this.treeBranches.forEach(branch => {
232
232
  // Add padding to the max-height to avoid needing a `resize`
233
233
  // event listener updating values.
234
234
  const height = branch.$el.clientHeight + 20;
@@ -240,7 +240,7 @@ export default {
240
240
  endDrag(event) {
241
241
  this.$emit('update', event);
242
242
  this.$nextTick(() => {
243
- if (!this.$refs['tree-branches']) {
243
+ if (!this.treeBranches.length) {
244
244
  return;
245
245
  }
246
246
  this.setHeights();
@@ -505,7 +505,7 @@ export default {
505
505
  .apos-tree__row__icon {
506
506
  margin-right: 0.25em;
507
507
 
508
- ::v-deep .material-design-icon__svg {
508
+ :deep(.material-design-icon__svg) {
509
509
  transition: fill 0.2s ease;
510
510
  fill: var(--a-base-5);
511
511
  }
@@ -516,8 +516,8 @@ export default {
516
516
  &:active {
517
517
  cursor: grabbing;
518
518
  }
519
- .sortable-chosen & ::v-deep .material-design-icon__svg,
520
- &:hover ::v-deep .material-design-icon__svg {
519
+ .sortable-chosen &:deep(.material-design-icon__svg,)
520
+ &:hover :deep(.material-design-icon__svg) {
521
521
  fill: var(--a-base-2);
522
522
  }
523
523
  }
@@ -559,7 +559,7 @@ export default {
559
559
  align-self: center;
560
560
  }
561
561
 
562
- .apos-tree__cell.apos-is-published ::v-deep .apos-tree__cell__icon {
562
+ .apos-tree__cell.apos-is-published :deep(.apos-tree__cell__icon) {
563
563
  color: var(--a-success);
564
564
  }
565
565
 
@@ -0,0 +1,11 @@
1
+ import { computed } from 'vue';
2
+
3
+ export function useAposTheme () {
4
+ const themeClass = computed(() => {
5
+ const classes = [];
6
+ classes.push(`apos-theme--primary-${window.apos.ui.theme.primary}`);
7
+ return classes;
8
+ });
9
+
10
+ return { themeClass };
11
+ };
@@ -1,7 +1,7 @@
1
1
  export default {
2
- install(Vue, options) {
3
- Vue.directive('click-outside-element', {
4
- bind(el, binding) {
2
+ install(app, options) {
3
+ app.directive('click-outside-element', {
4
+ beforeMount(el, binding) {
5
5
  el.aposClickOutsideHandler = (event) => {
6
6
  if ((el !== event.target) && !el.contains(event.target) && !apos.modal.onTopOf(event.target, el)) {
7
7
  binding.value(event);
@@ -9,7 +9,7 @@ export default {
9
9
  };
10
10
  document.body.addEventListener('click', el.aposClickOutsideHandler);
11
11
  },
12
- unbind(el) {
12
+ beforeUnmount(el, binding) {
13
13
  document.body.removeEventListener('click', el.aposClickOutsideHandler);
14
14
  }
15
15
  });