Skip to content

Commit 0aba672

Browse files
committed
add frontend handling of locked form
Signed-off-by: Christian Hartmann <chris-hartmann@gmx.de>
1 parent 8cd16fc commit 0aba672

12 files changed

Lines changed: 178 additions & 20 deletions

src/components/PillMenu.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
:key="option.id"
1111
:aria-label="isMobile ? option.ariaLabel : null"
1212
:checked="active.id"
13-
:disabled="disabled"
13+
:disabled="disabled || option.disabled"
1414
class="pill-menu__toggle"
1515
:class="{ 'pill-menu__toggle--icon-only': isMobile && option.icon }"
1616
button-variant

src/components/SidebarTabs/SettingsSidebarTab.vue

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,20 @@
55

66
<template>
77
<div class="sidebar-tabs__content">
8+
<NcNoteCard
9+
v-if="locked"
10+
type="info"
11+
:heading="t('forms', 'Form is locked')"
12+
:text="
13+
t('forms', 'Lock by {lockedBy} expires {lockedUntil}', {
14+
lockedBy,
15+
lockedUntil:
16+
lockedUntil === '' ? t('forms', 'never') : lockedUntil,
17+
})
18+
" />
819
<NcCheckboxRadioSwitch
920
:checked="form.isAnonymous"
10-
:disabled="formArchived"
21+
:disabled="formArchived || locked"
1122
type="switch"
1223
@update:checked="onAnonChange">
1324
<!-- TRANSLATORS Checkbox to select whether responses will be stored anonymously or not -->
@@ -16,21 +27,21 @@
1627
<NcCheckboxRadioSwitch
1728
v-tooltip="disableSubmitMultipleExplanation"
1829
:checked="submitMultiple"
19-
:disabled="disableSubmitMultiple || formArchived"
30+
:disabled="disableSubmitMultiple || formArchived || locked"
2031
type="switch"
2132
@update:checked="onSubmitMultipleChange">
2233
{{ t('forms', 'Allow multiple responses per person') }}
2334
</NcCheckboxRadioSwitch>
2435
<NcCheckboxRadioSwitch
2536
:model-value="form.allowEditSubmissions"
26-
:disabled="formArchived"
37+
:disabled="formArchived || locked"
2738
type="switch"
2839
@update:model-value="onAllowEditSubmissionsChange">
2940
{{ t('forms', 'Allow editing own responses') }}
3041
</NcCheckboxRadioSwitch>
3142
<NcCheckboxRadioSwitch
3243
:checked="formExpires"
33-
:disabled="formArchived"
44+
:disabled="formArchived || locked"
3445
type="switch"
3546
@update:checked="onFormExpiresChange">
3647
{{ t('forms', 'Set expiration date') }}
@@ -39,6 +50,7 @@
3950
<NcDateTimePicker
4051
id="expiresDatetimePicker"
4152
:clearable="false"
53+
:disabled="locked"
4254
:disabled-date="notBeforeToday"
4355
:disabled-time="notBeforeNow"
4456
:editable="false"
@@ -50,14 +62,15 @@
5062
@change="onExpirationDateChange" />
5163
<NcCheckboxRadioSwitch
5264
:checked="form.showExpiration"
65+
:disabled="locked"
5366
type="switch"
5467
@update:checked="onShowExpirationChange">
5568
{{ t('forms', 'Show expiration date on form') }}
5669
</NcCheckboxRadioSwitch>
5770
</div>
5871
<NcCheckboxRadioSwitch
5972
:checked="formClosed"
60-
:disabled="formArchived"
73+
:disabled="formArchived || locked"
6174
aria-describedby="forms-settings__close-form"
6275
type="switch"
6376
@update:checked="onFormClosedChange">
@@ -69,6 +82,7 @@
6982
<NcCheckboxRadioSwitch
7083
:checked="formArchived"
7184
aria-describedby="forms-settings__archive-form"
85+
:disabled="locked"
7286
type="switch"
7387
@update:checked="onFormArchivedChange">
7488
{{ t('forms', 'Archive form') }}
@@ -83,7 +97,7 @@
8397
</p>
8498
<NcCheckboxRadioSwitch
8599
:checked="hasCustomSubmissionMessage"
86-
:disabled="formArchived"
100+
:disabled="formArchived || locked"
87101
type="switch"
88102
@update:checked="onUpdateHasCustomSubmissionMessage">
89103
{{ t('forms', 'Custom submission message') }}
@@ -103,6 +117,7 @@
103117
aria-describedby="forms-submission-message-description"
104118
:aria-label="t('forms', 'Custom submission message')"
105119
:value="form.submissionMessage"
120+
:disabled="locked"
106121
:maxlength="maxStringLengths.submissionMessage"
107122
:placeholder="
108123
t(
@@ -132,14 +147,15 @@
132147
</div>
133148
</div>
134149

135-
<TransferOwnership :form="form" />
150+
<TransferOwnership :locked="locked" :form="form" />
136151
</div>
137152
</template>
138153

139154
<script>
140155
import moment from '@nextcloud/moment'
141156
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
142157
import NcDateTimePicker from '@nextcloud/vue/components/NcDateTimePicker'
158+
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
143159
import ShareTypes from '../../mixins/ShareTypes.js'
144160
import TransferOwnership from './TransferOwnership.vue'
145161
@@ -151,6 +167,7 @@ export default {
151167
components: {
152168
NcCheckboxRadioSwitch,
153169
NcDateTimePicker,
170+
NcNoteCard,
154171
TransferOwnership,
155172
},
156173
@@ -167,6 +184,21 @@ export default {
167184
type: Object,
168185
required: true,
169186
},
187+
188+
locked: {
189+
type: Boolean,
190+
required: true,
191+
},
192+
193+
lockedBy: {
194+
type: String,
195+
default: '',
196+
},
197+
198+
lockedUntil: {
199+
type: String,
200+
default: '',
201+
},
170202
},
171203
172204
data() {
@@ -386,7 +418,6 @@ export default {
386418
.sidebar-tabs__content {
387419
display: flex;
388420
flex-direction: column;
389-
gap: 8px;
390421
}
391422
.submission-message {
392423
&__description {

src/components/SidebarTabs/SharingSearchDiv.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
:clear-search-on-select="false"
1010
:close-on-select="false"
1111
:loading="showLoadingCircle"
12+
:disabled="locked"
1213
:get-option-key="(option) => option.key"
1314
:options="options"
1415
:placeholder="t('forms', 'Search for user, group or team …')"
@@ -46,6 +47,10 @@ export default {
4647
type: Boolean,
4748
default: false,
4849
},
50+
locked: {
51+
type: Boolean,
52+
required: true,
53+
}
4954
},
5055
5156
computed: {

src/components/SidebarTabs/SharingShareDiv.vue

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,24 @@
1818
<NcActionCaption :name="t('forms', 'Permissions')" />
1919
<NcActionCheckbox
2020
:model-value="canEditForm"
21+
:disabled="locked"
2122
@update:model-value="updatePermissionEdit">
2223
{{ t('forms', 'Edit form') }}
2324
</NcActionCheckbox>
2425
<NcActionCheckbox
2526
:model-value="canAccessResults"
27+
:disabled="locked"
2628
@update:model-value="updatePermissionResults">
2729
{{ t('forms', 'View responses') }}
2830
</NcActionCheckbox>
2931
<NcActionCheckbox
3032
:model-value="canDeleteResults"
31-
:disabled="!canAccessResults"
33+
:disabled="!canAccessResults || locked"
3234
@update:model-value="updatePermissionDeleteResults">
3335
{{ t('forms', 'Delete responses') }}
3436
</NcActionCheckbox>
3537
<NcActionSeparator />
36-
<NcActionButton @click="removeShare">
38+
<NcActionButton :disabled="locked" @click="removeShare">
3739
<template #icon>
3840
<IconClose :size="20" />
3941
</template>
@@ -73,6 +75,11 @@ export default {
7375
type: Object,
7476
required: true,
7577
},
78+
79+
locked: {
80+
type: Boolean,
81+
required: true,
82+
},
7683
},
7784
7885
computed: {

src/components/SidebarTabs/SharingSidebarTab.vue

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,23 @@
55

66
<template>
77
<div class="sidebar-tabs__content">
8+
<NcNoteCard
9+
v-if="locked"
10+
type="info"
11+
:heading="t('forms', 'Form is locked')"
12+
:text="
13+
t('forms', 'Lock by {lockedBy} expires {lockedUntil}', {
14+
lockedBy,
15+
lockedUntil:
16+
form.lockedUntil === ''
17+
? t('forms', 'never')
18+
: lockedUntil,
19+
})
20+
" />
821
<SharingSearchDiv
922
:current-shares="form.shares"
1023
:show-loading="isLoading"
24+
:locked="locked"
1125
@add-share="addShare" />
1226

1327
<!-- Public Link -->
@@ -19,7 +33,7 @@
1933
</div>
2034
<span class="share-div__desc">{{ t('forms', 'Share link') }}</span>
2135
<NcActions>
22-
<NcActionButton @click="addPublicLink">
36+
<NcActionButton :disabled="locked" @click="addPublicLink">
2337
<template #icon>
2438
<IconPlus :size="20" />
2539
</template>
@@ -66,14 +80,17 @@
6680
</template>
6781
{{ t('forms', 'Copy embedding code') }}
6882
</NcActionButton>
69-
<NcActionButton v-else @click="makeEmbeddable(share)">
83+
<NcActionButton
84+
v-else
85+
:disabled="locked"
86+
@click="makeEmbeddable(share)">
7087
<template #icon>
7188
<IconLinkBoxVariantOutline :size="20" />
7289
</template>
7390
<!-- TRANSLATORS: This means the link can be embedded into external websites -->
7491
{{ t('forms', 'Convert to embeddable link') }}
7592
</NcActionButton>
76-
<NcActionButton @click="removeShare(share)">
93+
<NcActionButton :disabled="locked" @click="removeShare(share)">
7794
<template #icon>
7895
<IconDelete :size="20" />
7996
</template>
@@ -82,6 +99,7 @@
8299
<NcActionButton
83100
v-if="appConfig.allowPublicLink"
84101
close-after-click
102+
:disabled="locked"
85103
@click="addPublicLink">
86104
<template #icon>
87105
<IconPlus :size="20" />
@@ -144,6 +162,7 @@
144162
<NcCheckboxRadioSwitch
145163
id="share-switch__permit-all"
146164
:checked="form.access.permitAllUsers"
165+
:disabled="locked"
147166
type="switch"
148167
@update:checked="onPermitAllUsersChange" />
149168
</div>
@@ -159,6 +178,7 @@
159178
<NcCheckboxRadioSwitch
160179
id="share-switch__show-to-all"
161180
:checked="form.access.showToAllUsers"
181+
:disabled="locked"
162182
type="switch"
163183
@update:checked="onShowToAllUsersChange" />
164184
</div>
@@ -170,6 +190,7 @@
170190
v-for="share in sortedShares"
171191
:key="'share-' + share.shareType + '-' + share.shareWith"
172192
:share="share"
193+
:locked="locked"
173194
@remove-share="removeShare"
174195
@update:share="updateShare" />
175196
</TransitionGroup>
@@ -186,6 +207,7 @@ import NcActions from '@nextcloud/vue/components/NcActions'
186207
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
187208
import NcActionLink from '@nextcloud/vue/components/NcActionLink'
188209
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
210+
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
189211
import IconAccountMultiple from 'vue-material-design-icons/AccountMultiple.vue'
190212
import IconCodeBrackets from 'vue-material-design-icons/CodeBrackets.vue'
191213
import IconDelete from 'vue-material-design-icons/Delete.vue'
@@ -220,6 +242,7 @@ export default {
220242
NcActionButton,
221243
NcActionLink,
222244
NcCheckboxRadioSwitch,
245+
NcNoteCard,
223246
QRDialog,
224247
SharingSearchDiv,
225248
SharingShareDiv,
@@ -232,6 +255,21 @@ export default {
232255
type: Object,
233256
required: true,
234257
},
258+
259+
locked: {
260+
type: Boolean,
261+
required: true,
262+
},
263+
264+
lockedBy: {
265+
type: String,
266+
default: '',
267+
},
268+
269+
lockedUntil: {
270+
type: String,
271+
default: '',
272+
},
235273
},
236274
237275
data() {
@@ -434,6 +472,11 @@ export default {
434472
</script>
435473

436474
<style lang="scss" scoped>
475+
.sidebar-tabs__content {
476+
display: flex;
477+
flex-direction: column;
478+
}
479+
437480
.share-div {
438481
display: flex;
439482
min-height: var(--default-clickable-area);

src/components/SidebarTabs/TransferOwnership.vue

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
alignment="start"
1111
variant="tertiary"
1212
wide
13+
:disabled="locked"
1314
@click="openModal">
1415
<span class="transfer-button__text">{{
1516
t('forms', 'Transfer ownership')
@@ -120,6 +121,11 @@ export default {
120121
type: Object,
121122
required: true,
122123
},
124+
125+
locked: {
126+
type: Boolean,
127+
required: true,
128+
},
123129
},
124130
125131
data() {

0 commit comments

Comments
 (0)