@owdproject/core 3.4.0 → 4.0.0-alpha.4

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 (108) hide show
  1. package/README.md +112 -13
  2. package/dist/dom/index.d.mts +65 -0
  3. package/dist/dom/index.d.ts +65 -0
  4. package/dist/dom/index.mjs +224 -0
  5. package/dist/events/index.d.mts +70 -0
  6. package/dist/events/index.d.ts +70 -0
  7. package/dist/events/index.mjs +3 -0
  8. package/dist/index.d.mts +73 -0
  9. package/dist/index.d.ts +73 -0
  10. package/dist/index.mjs +115 -0
  11. package/dist/layout/index.d.mts +41 -0
  12. package/dist/layout/index.d.ts +41 -0
  13. package/dist/layout/index.mjs +64 -0
  14. package/dist/machines/index.d.mts +31 -0
  15. package/dist/machines/index.d.ts +31 -0
  16. package/dist/machines/index.mjs +2 -0
  17. package/dist/managers/index.d.mts +118 -0
  18. package/dist/managers/index.d.ts +118 -0
  19. package/dist/managers/index.mjs +6 -0
  20. package/dist/session/index.d.mts +57 -0
  21. package/dist/session/index.d.ts +57 -0
  22. package/dist/session/index.mjs +65 -0
  23. package/dist/shared/core.B1XxB289.mjs +239 -0
  24. package/dist/shared/core.B3mp7ztE.mjs +237 -0
  25. package/dist/shared/core.BOvFdEVQ.d.ts +114 -0
  26. package/dist/shared/core.CsDFgGnX.mjs +40 -0
  27. package/dist/shared/core.Di1eFcr_.d.mts +114 -0
  28. package/dist/shared/core.Pd_Ogt4g.mjs +101 -0
  29. package/dist/shared/core.b3Xldzyu.mjs +29 -0
  30. package/dist/shared/core.d_A3q1kZ.mjs +869 -0
  31. package/dist/types/index.d.mts +266 -0
  32. package/dist/types/index.d.ts +266 -0
  33. package/dist/types/index.mjs +1 -0
  34. package/package.json +56 -112
  35. package/CHANGELOG.md +0 -98
  36. package/DESKTOP_KERNEL.md +0 -232
  37. package/MIGRATION_3.3.2.md +0 -23
  38. package/MIGRATION_3.4.md +0 -126
  39. package/PLAYGROUND.md +0 -91
  40. package/dist/module.d.mts +0 -13
  41. package/dist/module.json +0 -9
  42. package/dist/module.mjs +0 -254
  43. package/dist/types.d.mts +0 -7
  44. package/index.ts +0 -8
  45. package/kit/authoring.ts +0 -340
  46. package/kit/defineDesktopApp.ts +0 -56
  47. package/module.ts +0 -203
  48. package/runtime/components/Application/DesktopCoreApplicationRender.vue +0 -20
  49. package/runtime/components/Application/DesktopCoreApplicationWindowsRender.vue +0 -38
  50. package/runtime/components/background/DesktopCoreBackground.vue +0 -16
  51. package/runtime/components/core/DesktopCore.vue +0 -43
  52. package/runtime/components/time/DesktopCoreTime.vue +0 -56
  53. package/runtime/components/window/DesktopCoreWindow.vue +0 -215
  54. package/runtime/components/window/DesktopCoreWindowContent.vue +0 -28
  55. package/runtime/components/window/DesktopCoreWindowNav.vue +0 -66
  56. package/runtime/components/window/DesktopCoreWindowSnapHintsBase.vue +0 -74
  57. package/runtime/components/workspace/DesktopCoreWorkspaceEdgeHintsBase.vue +0 -84
  58. package/runtime/composables/useApplicationEntries.ts +0 -51
  59. package/runtime/composables/useApplicationManager.ts +0 -285
  60. package/runtime/composables/useBlockNonInputContextMenu.ts +0 -30
  61. package/runtime/composables/useDesktopConfig.ts +0 -8
  62. package/runtime/composables/useDesktopDialogs.ts +0 -16
  63. package/runtime/composables/useDesktopExtension.ts +0 -8
  64. package/runtime/composables/useDesktopManager.ts +0 -51
  65. package/runtime/composables/useDesktopManifest.ts +0 -17
  66. package/runtime/composables/useDesktopSession.ts +0 -27
  67. package/runtime/composables/useDesktopShellIdentity.ts +0 -99
  68. package/runtime/composables/useDesktopShellOptions.ts +0 -36
  69. package/runtime/composables/useDesktopShellReady.ts +0 -7
  70. package/runtime/composables/useDesktopWorkArea.ts +0 -93
  71. package/runtime/composables/useTerminalManager.ts +0 -159
  72. package/runtime/composables/useToggleWindowMaximize.ts +0 -35
  73. package/runtime/composables/useWindowDragHandlers.ts +0 -47
  74. package/runtime/composables/useWindowSnapDrop.ts +0 -112
  75. package/runtime/composables/useWorkspaceEdgeDrop.ts +0 -176
  76. package/runtime/composables/useWorkspaceManager.ts +0 -67
  77. package/runtime/composables/useWorkspaceOverviewCapture.ts +0 -92
  78. package/runtime/composables/useWorkspaceOverviewLiveScale.ts +0 -151
  79. package/runtime/constants/desktopShellKeys.ts +0 -12
  80. package/runtime/constants/shellLayout.ts +0 -5
  81. package/runtime/dialogs/desktopDialogProvider.ts +0 -73
  82. package/runtime/internal/controllers/ApplicationController.ts +0 -351
  83. package/runtime/internal/controllers/WindowController.ts +0 -547
  84. package/runtime/plugins/01.desktop-shell-init.client.ts +0 -28
  85. package/runtime/plugins/02.desktop-register-desktop-apps.client.ts +0 -13
  86. package/runtime/plugins/resize.client.ts +0 -6
  87. package/runtime/stores/storeApplicationMeta.ts +0 -60
  88. package/runtime/stores/storeApplicationWindows.ts +0 -21
  89. package/runtime/stores/storeDesktop.ts +0 -71
  90. package/runtime/stores/storeDesktopDefaultApps.ts +0 -54
  91. package/runtime/stores/storeDesktopVolume.ts +0 -19
  92. package/runtime/stores/storeDesktopWindow.ts +0 -38
  93. package/runtime/stores/storeDesktopWorkspace.ts +0 -105
  94. package/runtime/stores/storeIds.ts +0 -35
  95. package/runtime/types/desktopMenu.ts +0 -10
  96. package/runtime/utils/initDesktopShell.ts +0 -80
  97. package/runtime/utils/migratePersistedStoreIds.ts +0 -57
  98. package/runtime/utils/utilApp.ts +0 -25
  99. package/runtime/utils/utilCaptureElementToCanvas.ts +0 -21
  100. package/runtime/utils/utilCommon.ts +0 -26
  101. package/runtime/utils/utilDebug.ts +0 -30
  102. package/runtime/utils/utilDetectSnapZone.ts +0 -57
  103. package/runtime/utils/utilTerminal.ts +0 -6
  104. package/runtime/utils/utilWindowControllerAdapter.ts +0 -15
  105. package/runtime/utils/utilWindowLayout.ts +0 -82
  106. package/runtime/utils/utilWindowMaximizeLayout.ts +0 -44
  107. package/runtime/utils/utilWorkspaceWindows.ts +0 -33
  108. package/types/index.d.ts +0 -531
@@ -1,43 +0,0 @@
1
- <script setup lang="ts">
2
- import { useAttrs, computed } from 'vue'
3
- import { useAppConfig } from 'nuxt/app'
4
-
5
- defineOptions({ inheritAttrs: false })
6
-
7
- defineProps<{
8
- windows?: DesktopWindowsConfig
9
- systemBar?: DesktopSystemBarConfig
10
- dockBar?: DesktopDockBarConfig
11
- workspaces?: DesktopWorkspacesConfig
12
- }>()
13
-
14
- const appConfig = useAppConfig()
15
- const attrs = useAttrs()
16
-
17
- const classes = computed(() => {
18
- const list = ['owd-desktop']
19
-
20
- if (appConfig.desktop?.name) {
21
- list.push(`owd-desktop--${appConfig.desktop.name}`)
22
- }
23
-
24
- return list
25
- })
26
-
27
- const rootClass = computed(() => [classes.value, attrs.class])
28
- const rootStyle = computed(() => attrs.style)
29
- </script>
30
-
31
- <template>
32
- <div :class="rootClass" :style="rootStyle">
33
- <slot />
34
- </div>
35
- </template>
36
-
37
- <style scoped lang="scss">
38
- .owd-desktop {
39
- width: 100vw;
40
- height: 100dvh;
41
- user-select: none;
42
- }
43
- </style>
@@ -1,56 +0,0 @@
1
- <script setup lang="ts">
2
- import { ref, onMounted, onUnmounted } from 'vue'
3
- import { computed } from '@vue/reactivity'
4
- import { useI18n } from 'vue-i18n'
5
-
6
- const date: Ref<Date> = ref(new Date())
7
- const { locale } = useI18n()
8
-
9
- let minuteTimeout: any
10
-
11
- onMounted(() => {
12
- function scheduleNextMinute() {
13
- const now = new Date()
14
- const millisecondsToNextMinute =
15
- (60 - now.getSeconds()) * 1000 - now.getMilliseconds()
16
- minuteTimeout = setTimeout(() => {
17
- date.value = new Date()
18
- scheduleNextMinute()
19
- }, millisecondsToNextMinute)
20
- }
21
- scheduleNextMinute()
22
- })
23
-
24
- onUnmounted(() => {
25
- clearTimeout(minuteTimeout)
26
- })
27
-
28
- const time = computed(() => {
29
- if (!date.value) {
30
- return ''
31
- }
32
-
33
- let hours = date.value.getHours()
34
- let minutes: string = date.value.getMinutes().toString()
35
- let period = 'AM'
36
-
37
- if (locale.value !== 'it') {
38
- if (hours >= 12) {
39
- period = 'PM'
40
- if (hours > 12) hours -= 12
41
- } else if (hours === 0) {
42
- hours = 12
43
- }
44
- }
45
-
46
- if (minutes.length === 1) minutes = `0${minutes}`
47
-
48
- return locale.value === 'it'
49
- ? `${hours}:${minutes}`
50
- : `${hours}:${minutes} ${period}`
51
- })
52
- </script>
53
-
54
- <template>
55
- <time class="owd-time" v-text="time" />
56
- </template>
@@ -1,215 +0,0 @@
1
- <script setup lang="ts">
2
- import { ref, provide, onMounted } from 'vue'
3
- import { computed } from '@vue/reactivity'
4
- import { useAppConfig } from 'nuxt/app'
5
- import { handleWindowControllerProps } from '../../utils/utilWindowControllerAdapter'
6
- import { useDesktopWorkspaceStore } from '../../stores/storeDesktopWorkspace'
7
-
8
- const props = defineProps<{
9
- window?: IWindowController
10
- content?: WindowContent
11
- }>()
12
-
13
- const desktopWorkspaceStore = useDesktopWorkspaceStore()
14
-
15
- const emit = defineEmits([
16
- 'resize:start',
17
- 'resize:move',
18
- 'resize:end',
19
- 'drag:start',
20
- 'drag:move',
21
- 'drag:end',
22
- 'close',
23
- 'open',
24
- 'blur',
25
- 'focus',
26
- 'minimize',
27
- 'restore',
28
- 'maximize',
29
- 'unmaximize',
30
- 'toggle-maximize',
31
- ])
32
-
33
- const appConfig = useAppConfig()
34
- const windowController: IWindowController = handleWindowControllerProps(
35
- props.window,
36
- )
37
-
38
- provide<IWindowController>('windowController', windowController)
39
- provide<WindowContent>('windowContent', props.content ?? {})
40
-
41
- const isDragging = ref(false)
42
- const isResizing = ref(false)
43
-
44
- onMounted(() => {
45
- if (windowController?.state?.focused) {
46
- windowController.actions.bringToFront()
47
- }
48
- })
49
-
50
- function onWindowPointerDown() {
51
- windowController?.actions?.setActive(true)
52
- windowController?.actions?.bringToFront()
53
- }
54
-
55
- function onWindowDragStart(data: any) {
56
- isDragging.value = true
57
-
58
- emit('drag:start', data)
59
- }
60
-
61
- function onWindowDragMove(data: any) {
62
- emit('drag:move', data)
63
- }
64
-
65
- function onWindowDragEnd(data: { left: number; top: number }) {
66
- windowController?.actions?.setPosition({
67
- x: data.left,
68
- y: data.top,
69
- })
70
-
71
- isDragging.value = false
72
-
73
- emit('drag:end', data)
74
- }
75
-
76
- function onWindowResizeStart(data: any) {
77
- isResizing.value = true
78
-
79
- emit('resize:start', data)
80
- }
81
-
82
- function onWindowResizeMove(data: any) {
83
- emit('resize:move', data)
84
- }
85
-
86
- /**
87
- * Window end resize event
88
- */
89
- function onWindowResizeEnd(data: {
90
- left: number
91
- top: number
92
- width: number
93
- height: number
94
- }) {
95
- isResizing.value = false
96
-
97
- windowController?.actions?.setPosition({
98
- x: data.left,
99
- y: data.top,
100
- })
101
-
102
- windowController?.actions?.setSize({
103
- width: data.width,
104
- height: data.height,
105
- })
106
-
107
- emit('resize:end', data)
108
- }
109
-
110
- const classes = computed(() => {
111
- const list = ['owd-window']
112
-
113
- if (windowController?.state.focused) {
114
- list.push('owd-window--focused')
115
- }
116
-
117
- if (isDragging.value) {
118
- list.push('owd-window--dragging')
119
- }
120
-
121
- if (isResizing.value) {
122
- list.push('owd-window--resizing')
123
- }
124
-
125
- return list
126
- })
127
-
128
- /** While workspace overview is open, disable vue-resizable chrome drag and use native HTML5 drag to move windows between desktops. */
129
- const workspaceChromeDragSelector = computed(() => {
130
- if (desktopWorkspaceStore.overview) {
131
- return '.owd-window-overview-drag-none'
132
- }
133
- return windowController?.isDraggable
134
- ? '.owd-window-nav__draggable'
135
- : '.owd-window-nav__draggable-none'
136
- })
137
-
138
- function onOverviewNativeDragStart(e: DragEvent) {
139
- if (!desktopWorkspaceStore.overview || !windowController) return
140
- e.stopPropagation()
141
- e.dataTransfer?.setData('text/plain', windowController.state.id)
142
- e.dataTransfer!.effectAllowed = 'move'
143
- try {
144
- const img = new Image()
145
- img.src =
146
- 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'
147
- e.dataTransfer?.setDragImage(img, 0, 0)
148
- } catch {
149
- /* noop */
150
- }
151
- }
152
-
153
- const windowPositionMode = computed(
154
- () => appConfig.desktop?.windows?.position ?? 'fixed',
155
- )
156
-
157
- /** `fit-parent` clamps drag/resize to the parent box — wrong for viewport-fixed shells (Win11, GNOME). */
158
- const shouldFitParent = computed(
159
- () => windowPositionMode.value !== 'fixed',
160
- )
161
- </script>
162
-
163
- <template>
164
- <vue-resizable
165
- ref="windowResizableController"
166
- :class="classes"
167
- :width="windowController?.size.width"
168
- :height="windowController?.size.height"
169
- :min-width="windowController?.size.minWidth"
170
- :min-height="windowController?.size.minHeight"
171
- :max-width="windowController?.size.maxWidth"
172
- :max-height="windowController?.size.maxHeight"
173
- :left="windowController?.position?.x"
174
- :top="windowController?.position?.y"
175
- :active="windowController?.isResizable ? undefined : []"
176
- :fit-parent="shouldFitParent"
177
- @drag:start="onWindowDragStart"
178
- @drag:move="onWindowDragMove"
179
- @drag:end="onWindowDragEnd"
180
- @resize:start="onWindowResizeStart"
181
- @resize:move="onWindowResizeMove"
182
- @resize:end="onWindowResizeEnd"
183
- :style="{ zIndex: windowController?.position?.z }"
184
- :drag-selector="workspaceChromeDragSelector"
185
- :draggable="desktopWorkspaceStore.overview"
186
- @pointerdown="onWindowPointerDown"
187
- @dragstart="onOverviewNativeDragStart"
188
- >
189
- <slot />
190
- </vue-resizable>
191
- </template>
192
-
193
- <style scoped lang="scss">
194
- /* vue-resizable sets `.resizable-component { position: relative }` — override so desktop geometry stays consistent */
195
- .owd-window.resizable-component {
196
- position: v-bind('windowPositionMode') !important;
197
- }
198
-
199
- .owd-window {
200
- position: v-bind('windowPositionMode');
201
-
202
- &--dragging,
203
- &--resizing {
204
- :deep(.owd-window__content) {
205
- pointer-events: none;
206
- }
207
- }
208
-
209
- :deep(.owd-window__content) {
210
- overflow-y: auto;
211
- height: 100%;
212
- min-height: 0;
213
- }
214
- }
215
- </style>
@@ -1,28 +0,0 @@
1
- <script setup lang="ts">
2
- import { inject } from 'vue'
3
- import { computed } from '@vue/reactivity'
4
-
5
- const windowContent = inject<WindowContent>('windowContent')
6
-
7
- const classes = computed(() => {
8
- const list = ['owd-window__content']
9
-
10
- if (windowContent?.centered) {
11
- list.push('owd-window__content--centered')
12
- }
13
-
14
- if (windowContent?.padded) {
15
- list.push('owd-window__content--padded')
16
- }
17
-
18
- return list
19
- })
20
- </script>
21
-
22
- <template>
23
- <div :class="classes">
24
- <slot />
25
- </div>
26
- </template>
27
-
28
- <style scoped lang="scss"></style>
@@ -1,66 +0,0 @@
1
- <script setup lang="ts">
2
- import { inject } from 'vue'
3
- import { computed } from '@vue/reactivity'
4
-
5
- const windowController = inject<IWindowController>('windowController')
6
-
7
- const classes = computed(() => {
8
- const list = ['owd-window-nav']
9
-
10
- if (
11
- typeof windowController?.state.active === 'undefined' ||
12
- !!windowController?.state.active
13
- ) {
14
- list.push('owd-window-nav--active')
15
- }
16
-
17
- if (windowController?.state.focused) {
18
- list.push('owd-window-nav--focused')
19
- }
20
-
21
- return list
22
- })
23
- </script>
24
-
25
- <template>
26
- <div :class="classes">
27
- <div class="owd-window-nav__draggable" />
28
-
29
- <slot />
30
- </div>
31
- </template>
32
-
33
- <style lang="scss">
34
- /**
35
- * Title/icon sit above the drag layer in DOM order; use pointer-events so
36
- * mousedown reaches `.owd-window-nav__draggable` for vue-resizable. Window
37
- * controls stay clickable.
38
- */
39
- .owd-window-nav {
40
- position: relative;
41
- display: flex;
42
- align-items: stretch;
43
- width: 100%;
44
- min-height: 0;
45
-
46
- &__draggable {
47
- position: absolute;
48
- inset: 0;
49
- z-index: 1;
50
- }
51
-
52
- > :not(.owd-window-nav__draggable) {
53
- position: relative;
54
- z-index: 2;
55
- pointer-events: none;
56
- }
57
-
58
- > .owd-window-nav__btn-group {
59
- pointer-events: auto;
60
- }
61
-
62
- > .owd-window-nav__interactive {
63
- pointer-events: auto;
64
- }
65
- }
66
- </style>
@@ -1,74 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { useDesktopWorkspaceStore } from '@owdproject/core/runtime/stores/storeDesktopWorkspace'
4
- import { useWindowSnapDrop } from '@owdproject/core/runtime/composables/useWindowSnapDrop'
5
-
6
- const props = defineProps<{
7
- enabled?: boolean
8
- }>()
9
-
10
- const desktopWorkspaceStore = useDesktopWorkspaceStore()
11
- const { snapHint, snapHintRect, isSnapDragActive } = useWindowSnapDrop()
12
-
13
- const visible = computed(
14
- () =>
15
- props.enabled !== false &&
16
- !desktopWorkspaceStore.overview &&
17
- isSnapDragActive.value &&
18
- snapHint.value !== null &&
19
- snapHintRect.value !== null,
20
- )
21
-
22
- const hintStyle = computed(() => {
23
- const rect = snapHintRect.value
24
- if (!rect) return undefined
25
-
26
- return {
27
- left: `${rect.x}px`,
28
- top: `${rect.y}px`,
29
- width: `${rect.width}px`,
30
- height: `${rect.height}px`,
31
- }
32
- })
33
- </script>
34
-
35
- <template>
36
- <div
37
- v-if="visible"
38
- class="owd-window-snap-hints"
39
- aria-hidden="true"
40
- >
41
- <div
42
- class="owd-window-snap-hints__zone"
43
- :class="`owd-window-snap-hints__zone--${snapHint}`"
44
- :style="hintStyle"
45
- >
46
- <slot
47
- :zone="snapHint"
48
- :rect="snapHintRect"
49
- />
50
- </div>
51
- </div>
52
- </template>
53
-
54
- <style scoped>
55
- .owd-window-snap-hints {
56
- position: fixed;
57
- inset: 0;
58
- pointer-events: none;
59
- z-index: 999998;
60
- }
61
-
62
- .owd-window-snap-hints__zone {
63
- position: fixed;
64
- box-sizing: border-box;
65
- border: 2px solid rgba(96, 165, 250, 0.85);
66
- background: rgba(96, 165, 250, 0.18);
67
- border-radius: 4px;
68
- transition:
69
- left 80ms ease,
70
- top 80ms ease,
71
- width 80ms ease,
72
- height 80ms ease;
73
- }
74
- </style>
@@ -1,84 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from 'vue'
3
- import { useWorkspaceEdgeDrop } from '@owdproject/core/runtime/composables/useWorkspaceEdgeDrop'
4
- import { useDesktopWorkspaceStore } from '@owdproject/core/runtime/stores/storeDesktopWorkspace'
5
-
6
- const props = defineProps<{
7
- enabled?: boolean
8
- }>()
9
-
10
- const desktopWorkspaceStore = useDesktopWorkspaceStore()
11
- const { edgeHint, edgeTargetDesktopIndex } = useWorkspaceEdgeDrop()
12
-
13
- const visible = computed(
14
- () =>
15
- props.enabled !== false &&
16
- !desktopWorkspaceStore.overview &&
17
- desktopWorkspaceStore.list.length > 1 &&
18
- edgeHint.value !== null &&
19
- edgeTargetDesktopIndex.value !== null,
20
- )
21
- </script>
22
-
23
- <template>
24
- <div
25
- v-if="visible"
26
- class="owd-workspace-edge-hints"
27
- aria-hidden="true"
28
- >
29
- <div
30
- class="owd-workspace-edge-hints__zone owd-workspace-edge-hints__zone--left"
31
- :class="{
32
- 'owd-workspace-edge-hints__zone--active': edgeHint === 'left',
33
- }"
34
- >
35
- <slot
36
- name="left"
37
- :desktop-index="edgeTargetDesktopIndex"
38
- :side="'left' as const"
39
- />
40
- </div>
41
- <div
42
- class="owd-workspace-edge-hints__zone owd-workspace-edge-hints__zone--right"
43
- :class="{
44
- 'owd-workspace-edge-hints__zone--active': edgeHint === 'right',
45
- }"
46
- >
47
- <slot
48
- name="right"
49
- :desktop-index="edgeTargetDesktopIndex"
50
- :side="'right' as const"
51
- />
52
- </div>
53
- </div>
54
- </template>
55
-
56
- <style scoped>
57
- .owd-workspace-edge-hints {
58
- position: fixed;
59
- inset: 0;
60
- pointer-events: none;
61
- z-index: 999998;
62
- }
63
-
64
- .owd-workspace-edge-hints__zone {
65
- position: fixed;
66
- top: 0;
67
- bottom: 0;
68
- width: 72px;
69
- opacity: 0;
70
- transition: opacity 120ms ease;
71
- }
72
-
73
- .owd-workspace-edge-hints__zone--left {
74
- left: 0;
75
- }
76
-
77
- .owd-workspace-edge-hints__zone--right {
78
- right: 0;
79
- }
80
-
81
- .owd-workspace-edge-hints__zone--active {
82
- opacity: 1;
83
- }
84
- </style>
@@ -1,51 +0,0 @@
1
- import { useApplicationManager } from './useApplicationManager'
2
- import { computed } from '@vue/reactivity'
3
-
4
- type SortBy =
5
- | 'title'
6
- | 'category'
7
- | ((
8
- a: ApplicationEntryWithInherited,
9
- b: ApplicationEntryWithInherited,
10
- ) => number)
11
- type Visibility =
12
- | 'primary'
13
- | 'all'
14
- | ((entry: ApplicationEntryWithInherited) => boolean)
15
-
16
- export function useApplicationEntries() {
17
- const applicationManager = useApplicationManager()
18
-
19
- const sortedAppEntries = function (
20
- sortBy: SortBy = 'title',
21
- visibility: Visibility = 'primary',
22
- ): Ref<ApplicationEntryWithInherited[]> {
23
- return computed(() => {
24
- const currentEntries = [...applicationManager.appsEntries.value]
25
-
26
- // filtering
27
- const filtered =
28
- typeof visibility === 'function'
29
- ? currentEntries.filter(visibility)
30
- : visibility === 'primary'
31
- ? currentEntries.filter((e) => e.visibility !== 'secondary')
32
- : currentEntries
33
-
34
- // sorting
35
- const sorted =
36
- typeof sortBy === 'function'
37
- ? filtered.sort(sortBy)
38
- : sortBy === 'title'
39
- ? filtered.sort((a, b) =>
40
- (a.title || '').localeCompare(b.title || ''),
41
- )
42
- : filtered.sort((a, b) =>
43
- (a.category || '').localeCompare(b.category || ''),
44
- )
45
-
46
- return sorted
47
- })
48
- }
49
-
50
- return { sortedAppEntries }
51
- }