apostrophe 3.63.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/.eslintrc +13 -4
  2. package/CHANGELOG.md +21 -0
  3. package/defaults.js +1 -0
  4. package/modules/@apostrophecms/admin-bar/ui/apos/apps/AposAdminBar.js +7 -17
  5. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBar.vue +14 -16
  6. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarLocale.vue +1 -1
  7. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarMenu.vue +22 -15
  8. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarUser.vue +2 -2
  9. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextBar.vue +13 -8
  10. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextModeAndSettings.vue +18 -10
  11. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextTitle.vue +4 -4
  12. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextUndoRedo.vue +14 -8
  13. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposSavingIndicator.vue +2 -1
  14. package/modules/@apostrophecms/area/ui/apos/apps/AposAreas.js +36 -54
  15. package/modules/@apostrophecms/area/ui/apos/components/AposAreaContextualMenu.vue +20 -25
  16. package/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +5 -12
  17. package/modules/@apostrophecms/area/ui/apos/components/AposAreaExpandedMenu.vue +11 -3
  18. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenu.vue +6 -6
  19. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenuItem.vue +3 -2
  20. package/modules/@apostrophecms/area/ui/apos/components/AposAreaWidget.vue +31 -44
  21. package/modules/@apostrophecms/area/ui/apos/components/AposWidgetControls.vue +6 -6
  22. package/modules/@apostrophecms/asset/index.js +25 -12
  23. package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.config.js +3 -3
  24. package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.vue.js +7 -1
  25. package/modules/@apostrophecms/busy/ui/apos/apps/AposBusy.js +8 -7
  26. package/modules/@apostrophecms/busy/ui/apos/components/TheAposBusy.vue +1 -1
  27. package/modules/@apostrophecms/command-menu/ui/apos/apps/AposCommandMenu.js +11 -29
  28. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuShortcut.vue +6 -6
  29. package/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +10 -7
  30. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +20 -15
  31. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +1 -1
  32. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +36 -27
  33. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalizeErrors.vue +3 -3
  34. package/modules/@apostrophecms/image/ui/apos/components/AposImageCropper.vue +5 -5
  35. package/modules/@apostrophecms/image/ui/apos/components/AposImageRelationshipEditor.vue +6 -6
  36. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +23 -16
  37. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +11 -11
  38. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +28 -21
  39. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +1 -1
  40. package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +5 -4
  41. package/modules/@apostrophecms/login/ui/apos/apps/AposLogin.js +6 -7
  42. package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -3
  43. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +10 -10
  44. package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +1 -1
  45. package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -2
  46. package/modules/@apostrophecms/modal/ui/apos/apps/AposModals.js +60 -87
  47. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +15 -11
  48. package/modules/@apostrophecms/modal/ui/apos/components/AposModal.vue +8 -2
  49. package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +7 -4
  50. package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +5 -5
  51. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -8
  52. package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +7 -7
  53. package/modules/@apostrophecms/modal/ui/apos/components/TheAposModals.vue +22 -4
  54. package/modules/@apostrophecms/modal/ui/apos/composables/AposFocus.js +95 -0
  55. package/modules/@apostrophecms/modal/ui/apos/mixins/AposDocsManagerMixin.js +2 -3
  56. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +6 -0
  57. package/modules/@apostrophecms/multisite-i18n/i18n/aposMultisite/en.json +48 -0
  58. package/modules/@apostrophecms/multisite-i18n/index.js +7 -0
  59. package/modules/@apostrophecms/notification/index.js +4 -4
  60. package/modules/@apostrophecms/notification/ui/apos/apps/AposNotification.js +6 -9
  61. package/modules/@apostrophecms/notification/ui/apos/components/AposNotification.vue +12 -8
  62. package/modules/@apostrophecms/oembed-field/ui/apos/components/AposInputOembed.vue +4 -4
  63. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +15 -11
  64. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +1 -1
  65. package/modules/@apostrophecms/permission/ui/apos/components/AposInputRole.vue +3 -3
  66. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +25 -17
  67. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerDisplay.vue +24 -20
  68. package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +15 -11
  69. package/modules/@apostrophecms/rich-text-widget/index.js +1 -0
  70. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +7 -6
  71. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +31 -30
  72. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +12 -10
  73. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +9 -8
  74. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapStyles.vue +3 -3
  75. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapTable.vue +3 -3
  76. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +10 -8
  77. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +5 -3
  78. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +81 -277
  79. package/modules/@apostrophecms/schema/ui/apos/components/AposInputAttachment.vue +4 -2
  80. package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +24 -14
  81. package/modules/@apostrophecms/schema/ui/apos/components/AposInputCheckboxes.vue +7 -6
  82. package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +10 -7
  83. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +3 -3
  84. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +5 -4
  85. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +15 -12
  86. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSelect.vue +1 -1
  87. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +16 -12
  88. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +19 -11
  89. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +1 -1
  90. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +65 -21
  91. package/modules/@apostrophecms/schema/ui/apos/components/AposSubform.vue +2 -2
  92. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +0 -4
  93. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +3 -3
  94. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +15 -4
  95. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputAttachment.js +3 -3
  96. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputCheckboxes.js +7 -7
  97. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputColor.js +5 -8
  98. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputDateAndTime.js +1 -1
  99. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +1 -1
  100. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRadio.js +1 -1
  101. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +12 -9
  102. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSelect.js +2 -2
  103. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +6 -8
  104. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +39 -13
  105. package/modules/@apostrophecms/schema/ui/apos/logic/AposSubform.js +1 -1
  106. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +9 -9
  107. package/modules/@apostrophecms/schema/ui/apos/scss/AposInputArray.scss +205 -0
  108. package/modules/@apostrophecms/settings/ui/apos/components/AposSettingsManager.vue +4 -4
  109. package/modules/@apostrophecms/settings/ui/apos/logic/AposSettingsManager.js +4 -4
  110. package/modules/@apostrophecms/submitted-draft/ui/apos/components/AposSubmittedDraftIcon.vue +5 -4
  111. package/modules/@apostrophecms/ui/ui/apos/components/AposButton.vue +4 -4
  112. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonGroup.vue +6 -6
  113. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonSplit.vue +120 -113
  114. package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +19 -19
  115. package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +15 -15
  116. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +216 -191
  117. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuDialog.vue +77 -65
  118. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuItem.vue +1 -1
  119. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuTip.vue +28 -50
  120. package/modules/@apostrophecms/ui/ui/apos/components/AposFile.vue +5 -5
  121. package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +4 -4
  122. package/modules/@apostrophecms/ui/ui/apos/components/AposMinMaxCount.vue +5 -5
  123. package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +14 -8
  124. package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +2 -2
  125. package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +53 -59
  126. package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +2 -2
  127. package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +40 -35
  128. package/modules/@apostrophecms/ui/ui/apos/components/AposToggle.vue +2 -2
  129. package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +9 -11
  130. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeHeader.vue +5 -3
  131. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +129 -129
  132. package/modules/@apostrophecms/ui/ui/apos/composables/AposTheme.js +11 -0
  133. package/modules/@apostrophecms/ui/ui/apos/lib/click-outside-element.js +4 -4
  134. package/modules/@apostrophecms/ui/ui/apos/lib/i18next.js +56 -50
  135. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip.js +191 -0
  136. package/modules/@apostrophecms/ui/ui/apos/lib/vue.js +19 -10
  137. package/modules/@apostrophecms/ui/ui/apos/mixins/AposAdvisoryLockMixin.js +1 -1
  138. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tables.scss +1 -1
  139. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tooltips.scss +6 -22
  140. package/modules/@apostrophecms/ui/ui/apos/scss/shared/_table-rows.scss +1 -1
  141. package/modules/@apostrophecms/widget-type/index.js +8 -2
  142. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +26 -22
  143. package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +4 -4
  144. package/package.json +31 -44
  145. package/modules/@apostrophecms/ui/ui/apos/lib/localized-v-tooltip.js +0 -63
  146. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip-options.js +0 -13
@@ -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' ],
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
  });
@@ -4,11 +4,14 @@
4
4
  // each app
5
5
 
6
6
  import i18next from 'i18next';
7
+ let i18n;
7
8
 
8
9
  export default {
9
10
 
10
- install(Vue, options) {
11
- const i18n = options.i18n;
11
+ install(app, options) {
12
+ if (!i18n) {
13
+ i18n = options.i18n;
14
+ }
12
15
 
13
16
  const fallbackLng = [ i18n.defaultLocale ];
14
17
  // In case the default locale also has inadequate admin UI phrases
@@ -67,56 +70,59 @@ export default {
67
70
  // property for instance. You may also specify
68
71
  // `localize: false` to pass a string through without
69
72
  // invoking i18next.
70
- Vue.prototype.$t = (key, options = {}) => {
71
- if ((key !== null) && ((typeof key) === 'object')) {
72
- options = key;
73
- key = options.key;
74
- }
75
- if (options.localize === false) {
76
- return key;
77
- }
78
- // Check carefully for empty string and equivalent scenarios
79
- // before doing any work
80
- if (key == null) {
81
- return '';
82
- }
83
- key += '';
84
- if (!key.length) {
85
- return '';
86
- }
87
- const result = i18next.t(key, {
88
- lng: i18n.adminLocale,
89
- ...options
90
- });
91
- if (i18n.show) {
92
- if (result === key) {
93
- if (key.match(/^\S+:/)) {
94
- // The l10n key does not have a value assigned (or the key is
95
- // actually the same as the phrase). The key seems to have a
96
- // namespace, so might be from the Apostrophe UI.
97
- return `❌ ${result}`;
98
- } else {
99
- // The l10n key does not have a value assigned (or the key is
100
- // actually the same as the phrase). It is in the default namespace.
101
- return `🕳 ${result}`;
102
- }
103
- } else {
104
- // The phrase is fully localized.
105
- return `🌍 ${result}`;
106
- }
107
- } else {
108
- return result;
109
- }
110
- };
73
+ app.config.globalProperties.$t = $t;
74
+ }
75
+ };
111
76
 
112
- function canonicalize(locale) {
113
- const [ language, territory ] = locale.split('-');
114
- if (territory) {
115
- return `${language}-${territory.toUpperCase()}`;
77
+ export function $t(key, options = {}) {
78
+ if (!i18n) {
79
+ return '';
80
+ }
81
+ if ((key !== null) && ((typeof key) === 'object')) {
82
+ options = key;
83
+ key = options.key;
84
+ }
85
+ if (options.localize === false) {
86
+ return key;
87
+ }
88
+ // Check carefully for empty string and equivalent scenarios
89
+ // before doing any work
90
+ if (key == null) {
91
+ return '';
92
+ }
93
+ key += '';
94
+ if (!key.length) {
95
+ return '';
96
+ }
97
+ const result = i18next.t(key, {
98
+ lng: i18n.adminLocale,
99
+ ...options
100
+ });
101
+ if (i18n.show) {
102
+ if (result === key) {
103
+ if (key.match(/^\S+:/)) {
104
+ // The l10n key does not have a value assigned (or the key is
105
+ // actually the same as the phrase). The key seems to have a
106
+ // namespace, so might be from the Apostrophe UI.
107
+ return `❌ ${result}`;
108
+ } else {
109
+ // The l10n key does not have a value assigned (or the key is
110
+ // actually the same as the phrase). It is in the default namespace.
111
+ return `🕳 ${result}`;
116
112
  }
117
- return locale;
113
+ } else {
114
+ // The phrase is fully localized.
115
+ return `🌍 ${result}`;
118
116
  }
119
-
117
+ } else {
118
+ return result;
120
119
  }
121
-
122
120
  };
121
+
122
+ function canonicalize(locale) {
123
+ const [ language, territory ] = locale.split('-');
124
+ if (territory) {
125
+ return `${language}-${territory.toUpperCase()}`;
126
+ }
127
+ return locale;
128
+ }