Skip to content

Commit ad3aa25

Browse files
committed
fix: move download and enable button to outside of details tab
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
1 parent 239c8cc commit ad3aa25

File tree

3 files changed

+239
-126
lines changed

3 files changed

+239
-126
lines changed

apps/settings/src/components/AppStoreSidebar/AppDetailsTab.vue

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -12,102 +12,6 @@
1212
<NcIconSvgWrapper :path="mdiTextBoxOutline" />
1313
</template>
1414
<div class="app-details">
15-
<div class="app-details__actions">
16-
<div v-if="app.active && canLimitToGroups(app)" class="app-details__actions-groups">
17-
<input
18-
:id="`groups_enable_${app.id}`"
19-
v-model="groupCheckedAppsData"
20-
type="checkbox"
21-
:value="app.id"
22-
class="groups-enable__checkbox checkbox"
23-
@change="setGroupLimit">
24-
<label :for="`groups_enable_${app.id}`">{{ t('settings', 'Limit to groups') }}</label>
25-
<input
26-
type="hidden"
27-
class="group_select"
28-
:title="t('settings', 'All')"
29-
value="">
30-
<br>
31-
<label for="limitToGroups">
32-
<span>{{ t('settings', 'Limit app usage to groups') }}</span>
33-
</label>
34-
<NcSelect
35-
v-if="isLimitedToGroups(app)"
36-
input-id="limitToGroups"
37-
:options="groups"
38-
:model-value="appGroups"
39-
:limit="5"
40-
label="name"
41-
:multiple="true"
42-
keep-open
43-
@option:selected="addGroupLimitation"
44-
@option:deselected="removeGroupLimitation"
45-
@search="asyncFindGroup">
46-
<span slot="noResult">{{ t('settings', 'No results') }}</span>
47-
</NcSelect>
48-
</div>
49-
<div class="app-details__actions-manage">
50-
<input
51-
v-if="app.update"
52-
class="update primary"
53-
type="button"
54-
:value="t('settings', 'Update to {version}', { version: app.update })"
55-
:disabled="installing || isLoading || isManualInstall"
56-
@click="update(app.id)">
57-
<input
58-
v-if="app.canUnInstall"
59-
class="uninstall"
60-
type="button"
61-
:value="t('settings', 'Remove')"
62-
:disabled="installing || isLoading"
63-
@click="remove(app.id, removeData)">
64-
<input
65-
v-if="app.active"
66-
class="enable"
67-
type="button"
68-
:value="disableButtonText"
69-
:disabled="installing || isLoading || isInitializing || isDeploying"
70-
@click="disable(app.id)">
71-
<input
72-
v-if="!app.active && (app.canInstall || app.isCompatible)"
73-
:title="enableButtonTooltip"
74-
:aria-label="enableButtonTooltip"
75-
class="enable primary"
76-
type="button"
77-
:value="enableButtonText"
78-
:disabled="!app.canInstall || installing || isLoading || !defaultDeployDaemonAccessible || isInitializing || isDeploying"
79-
@click="enableButtonAction">
80-
<input
81-
v-else-if="!app.active && !app.canInstall"
82-
:title="forceEnableButtonTooltip"
83-
:aria-label="forceEnableButtonTooltip"
84-
class="enable force"
85-
type="button"
86-
:value="forceEnableButtonText"
87-
:disabled="installing || isLoading"
88-
@click="forceEnable(app.id)">
89-
<NcButton
90-
v-if="app?.app_api && (app.canInstall || app.isCompatible)"
91-
:aria-label="t('settings', 'Advanced deploy options')"
92-
variant="secondary"
93-
@click="() => showDeployOptionsModal = true">
94-
<template #icon>
95-
<NcIconSvgWrapper :path="mdiToyBrickPlusOutline" />
96-
</template>
97-
{{ t('settings', 'Deploy options') }}
98-
</NcButton>
99-
</div>
100-
<p v-if="!defaultDeployDaemonAccessible" class="warning">
101-
{{ t('settings', 'Default Deploy daemon is not accessible') }}
102-
</p>
103-
<NcCheckboxRadioSwitch
104-
v-if="app.canUnInstall"
105-
:model-value="removeData"
106-
:disabled="installing || isLoading || !defaultDeployDaemonAccessible"
107-
@update:modelValue="toggleRemoveData">
108-
{{ t('settings', 'Delete data on remove') }}
109-
</NcCheckboxRadioSwitch>
110-
</div>
11115

11216
<ul class="app-details__dependencies">
11317
<li v-if="app.missingMinOwnCloudVersion">
@@ -208,10 +112,6 @@
208112
</div>
209113
</div>
210114

211-
<AppDeployOptionsModal
212-
v-if="app?.app_api"
213-
:show.sync="showDeployOptionsModal"
214-
:app="app" />
215115
<DaemonSelectionDialog
216116
v-if="app?.app_api"
217117
:show.sync="showSelectDaemonModal"
@@ -226,12 +126,9 @@ import { mdiBugOutline, mdiFeatureSearchOutline, mdiStar, mdiTextBoxOutline, mdi
226126
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
227127
import NcAppSidebarTab from '@nextcloud/vue/components/NcAppSidebarTab'
228128
import NcButton from '@nextcloud/vue/components/NcButton'
229-
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
230129
import NcDateTime from '@nextcloud/vue/components/NcDateTime'
231130
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
232-
import NcSelect from '@nextcloud/vue/components/NcSelect'
233131
import DaemonSelectionDialog from '../AppAPI/DaemonSelectionDialog.vue'
234-
import AppDeployOptionsModal from './AppDeployOptionsModal.vue'
235132
import AppManagement from '../../mixins/AppManagement.js'
236133
import { useAppApiStore } from '../../store/app-api-store.js'
237134
import { useAppsStore } from '../../store/apps-store.js'
@@ -244,9 +141,6 @@ export default {
244141
NcButton,
245142
NcDateTime,
246143
NcIconSvgWrapper,
247-
NcSelect,
248-
NcCheckboxRadioSwitch,
249-
AppDeployOptionsModal,
250144
DaemonSelectionDialog,
251145
},
252146
@@ -440,21 +334,6 @@ export default {
440334
.app-details {
441335
padding: 20px;
442336
443-
&__actions {
444-
// app management
445-
&-manage {
446-
// if too many, shrink them and ellipsis
447-
display: flex;
448-
align-items: center;
449-
input {
450-
flex: 0 1 auto;
451-
min-width: 0;
452-
text-overflow: ellipsis;
453-
white-space: nowrap;
454-
overflow: hidden;
455-
}
456-
}
457-
}
458337
&__authors {
459338
color: var(--color-text-maxcontrast);
460339
}
Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
<!--
2+
- SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
3+
- SPDX-License-Identifier: AGPL-3.0-or-later
4+
-->
5+
6+
<template>
7+
<div class="app-sidebar-manage__actions">
8+
<div v-if="app.active && canLimitToGroups(app)" class="app-sidebar-manage__actions-groups">
9+
<input
10+
:id="`groups_enable_${app.id}`"
11+
v-model="groupCheckedAppsData"
12+
type="checkbox"
13+
:value="app.id"
14+
class="groups-enable__checkbox checkbox"
15+
@change="setGroupLimit">
16+
<label :for="`groups_enable_${app.id}`">{{ t('settings', 'Limit to groups') }}</label>
17+
<input
18+
type="hidden"
19+
class="group_select"
20+
:title="t('settings', 'All')"
21+
value="">
22+
<br>
23+
<label for="limitToGroups">
24+
<span>{{ t('settings', 'Limit app usage to groups') }}</span>
25+
</label>
26+
<NcSelect
27+
v-if="isLimitedToGroups(app)"
28+
input-id="limitToGroups"
29+
:options="groups"
30+
:model-value="appGroups"
31+
:limit="5"
32+
label="name"
33+
:multiple="true"
34+
keep-open
35+
@option:selected="addGroupLimitation"
36+
@option:deselected="removeGroupLimitation"
37+
@search="asyncFindGroup">
38+
<span slot="noResult">{{ t('settings', 'No results') }}</span>
39+
</NcSelect>
40+
</div>
41+
<div class="app-sidebar-manage__actions-manage">
42+
<input
43+
v-if="app.update"
44+
class="update primary"
45+
type="button"
46+
:value="t('settings', 'Update to {version}', { version: app.update })"
47+
:disabled="installing || isLoading || isManualInstall"
48+
@click="update(app.id)">
49+
<input
50+
v-if="app.canUnInstall"
51+
class="uninstall"
52+
type="button"
53+
:value="t('settings', 'Remove')"
54+
:disabled="installing || isLoading"
55+
@click="remove(app.id, removeData)">
56+
<input
57+
v-if="app.active"
58+
class="enable"
59+
type="button"
60+
:value="disableButtonText"
61+
:disabled="installing || isLoading || isInitializing || isDeploying"
62+
@click="disable(app.id)">
63+
<input
64+
v-if="!app.active && (app.canInstall || app.isCompatible)"
65+
:title="enableButtonTooltip"
66+
:aria-label="enableButtonTooltip"
67+
class="enable primary"
68+
type="button"
69+
:value="enableButtonText"
70+
:disabled="!app.canInstall || installing || isLoading || !defaultDeployDaemonAccessible || isInitializing || isDeploying"
71+
@click="enableButtonAction">
72+
<input
73+
v-else-if="!app.active && !app.canInstall"
74+
:title="forceEnableButtonTooltip"
75+
:aria-label="forceEnableButtonTooltip"
76+
class="enable force"
77+
type="button"
78+
:value="forceEnableButtonText"
79+
:disabled="installing || isLoading"
80+
@click="forceEnable(app.id)">
81+
<NcButton
82+
v-if="app?.app_api && (app.canInstall || app.isCompatible)"
83+
:aria-label="t('settings', 'Advanced deploy options')"
84+
variant="secondary"
85+
@click="() => showDeployOptionsModal = true">
86+
<template #icon>
87+
<NcIconSvgWrapper :path="mdiToyBrickPlusOutline" />
88+
</template>
89+
{{ t('settings', 'Deploy options') }}
90+
</NcButton>
91+
</div>
92+
<p v-if="!defaultDeployDaemonAccessible" class="warning">
93+
{{ t('settings', 'Default Deploy daemon is not accessible') }}
94+
</p>
95+
<NcCheckboxRadioSwitch
96+
v-if="app.canUnInstall"
97+
:model-value="removeData"
98+
:disabled="installing || isLoading || !defaultDeployDaemonAccessible"
99+
@update:modelValue="toggleRemoveData">
100+
{{ t('settings', 'Delete data on remove') }}
101+
</NcCheckboxRadioSwitch>
102+
103+
<AppDeployOptionsModal
104+
v-if="app?.app_api"
105+
:show.sync="showDeployOptionsModal"
106+
:app="app" />
107+
</div>
108+
</template>
109+
110+
<script>
111+
import { mdiToyBrickPlusOutline } from '@mdi/js'
112+
import { emit } from '@nextcloud/event-bus'
113+
import { translate as t } from '@nextcloud/l10n'
114+
import NcButton from '@nextcloud/vue/components/NcButton'
115+
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
116+
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
117+
import AppDeployOptionsModal from './AppDeployOptionsModal.vue'
118+
import AppManagement from '../../mixins/AppManagement.js'
119+
import { useAppApiStore } from '../../store/app-api-store.js'
120+
import { useAppsStore } from '../../store/apps-store.js'
121+
122+
export default {
123+
name: 'AppStoreSidebarManageActions',
124+
125+
components: {
126+
NcButton,
127+
NcCheckboxRadioSwitch,
128+
NcIconSvgWrapper,
129+
AppDeployOptionsModal,
130+
},
131+
132+
mixins: [AppManagement],
133+
134+
props: {
135+
app: {
136+
type: Object,
137+
required: true,
138+
},
139+
},
140+
141+
setup() {
142+
const store = useAppsStore()
143+
const appApiStore = useAppApiStore()
144+
return {
145+
store,
146+
appApiStore,
147+
t,
148+
mdiToyBrickPlusOutline,
149+
}
150+
},
151+
152+
data() {
153+
return {
154+
removeData: false,
155+
showDeployOptionsModal: false,
156+
}
157+
},
158+
159+
methods: {
160+
toggleRemoveData() {
161+
this.removeData = !this.removeData
162+
},
163+
164+
async enableButtonAction() {
165+
if (!this.app?.app_api) {
166+
this.enable(this.app.id)
167+
return
168+
}
169+
await this.appApiStore.fetchDockerDaemons()
170+
if (this.appApiStore.dockerDaemons.length === 1 && this.app.needsDownload) {
171+
this.enable(this.app.id, this.appApiStore.dockerDaemons[0])
172+
} else if (this.app.needsDownload) {
173+
emit('showDaemonSelectionModal')
174+
} else {
175+
this.enable(this.app.id, this.app.daemon)
176+
}
177+
},
178+
},
179+
}
180+
</script>
181+
182+
<style scoped lang="scss">
183+
.app-sidebar-manage {
184+
&__actions {
185+
display: flex;
186+
align-items: center;
187+
flex-wrap: wrap;
188+
gap: 4px;
189+
190+
&-manage {
191+
display: flex;
192+
align-items: center;
193+
input {
194+
flex: 0 1 auto;
195+
min-width: 0;
196+
text-overflow: ellipsis;
197+
white-space: nowrap;
198+
overflow: hidden;
199+
}
200+
}
201+
}
202+
}
203+
204+
.force {
205+
color: var(--color-text-error);
206+
border-color: var(--color-border-error);
207+
background: var(--color-main-background);
208+
}
209+
210+
.force:hover,
211+
.force:active {
212+
color: var(--color-main-background);
213+
border-color: var(--color-border-error) !important;
214+
background: var(--color-error);
215+
}
216+
</style>

0 commit comments

Comments
 (0)