Skip to content

Commit db13f2c

Browse files
authored
Merge pull request #6217 from LibreSign/feat/improve-signer-edit-modal
feat: improve signer edit modal
2 parents ceddbb7 + af1c39d commit db13f2c

File tree

2 files changed

+102
-9
lines changed

2 files changed

+102
-9
lines changed

src/Components/Request/IdentifySigner.vue

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,18 @@
44
-->
55
<template>
66
<div class="identifySigner">
7-
<SignerSelect :signer="signer"
7+
<SignerSelect v-if="isNewSigner"
8+
:signer="signer"
89
:placeholder="placeholder"
910
:method="method"
1011
@update:signer="updateSigner" />
12+
<NcNoteCard v-else type="info">
13+
<template #icon>
14+
<NcIconSvgWrapper :size="20" :svg="getMethodIcon()" />
15+
</template>
16+
<strong>{{ identifyMethodLabel }}:</strong> {{ signer.id }}
17+
</NcNoteCard>
1118

12-
<label v-if="signerSelected" for="name-input">{{ t('libresign', 'Signer name') }}</label>
1319
<NcTextField v-if="signerSelected"
1420
v-model="displayName"
1521
aria-describedby="name-input"
@@ -35,17 +41,39 @@
3541
</div>
3642
</template>
3743
<script>
44+
import svgAccount from '@mdi/svg/svg/account.svg?raw'
45+
import svgEmail from '@mdi/svg/svg/email.svg?raw'
46+
import svgSms from '@mdi/svg/svg/message-processing.svg?raw'
47+
import svgWhatsapp from '@mdi/svg/svg/whatsapp.svg?raw'
48+
import svgXmpp from '@mdi/svg/svg/xmpp.svg?raw'
49+
3850
import NcButton from '@nextcloud/vue/components/NcButton'
51+
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
52+
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
3953
import NcTextField from '@nextcloud/vue/components/NcTextField'
4054
4155
import SignerSelect from './SignerSelect.vue'
4256
57+
import svgSignal from '../../../img/logo-signal-app.svg?raw'
58+
import svgTelegram from '../../../img/logo-telegram-app.svg?raw'
4359
import { useFilesStore } from '../../store/files.js'
4460
61+
const iconMap = {
62+
svgAccount,
63+
svgEmail,
64+
svgSignal,
65+
svgSms,
66+
svgTelegram,
67+
svgWhatsapp,
68+
svgXmpp,
69+
}
70+
4571
export default {
4672
name: 'IdentifySigner',
4773
components: {
4874
NcButton,
75+
NcIconSvgWrapper,
76+
NcNoteCard,
4977
NcTextField,
5078
SignerSelect,
5179
},
@@ -66,6 +94,10 @@ export default {
6694
type: String,
6795
default: t('libresign', 'Name'),
6896
},
97+
methods: {
98+
type: Array,
99+
default: () => [],
100+
},
69101
},
70102
setup() {
71103
const filesStore = useFilesStore()
@@ -86,14 +118,24 @@ export default {
86118
return !!this.signer?.id
87119
},
88120
isNewSigner() {
89-
return this.id === null || this.id === undefined
121+
return !this.signerToEdit || Object.keys(this.signerToEdit).length === 0
90122
},
91123
saveButtonText() {
92124
if (this.isNewSigner) {
93125
return t('libresign', 'Save')
94126
}
95127
return t('libresign', 'Update')
96128
},
129+
identifyMethodLabel() {
130+
if (!this.signer?.method) {
131+
return ''
132+
}
133+
const methodConfig = this.methods.find(m => m.name === this.signer.method)
134+
if (!methodConfig?.friendly_name) {
135+
return ''
136+
}
137+
return methodConfig.friendly_name
138+
},
97139
},
98140
beforeMount() {
99141
this.displayName = this.signerToEdit.displayName ?? ''
@@ -108,6 +150,13 @@ export default {
108150
}
109151
},
110152
methods: {
153+
getMethodIcon() {
154+
const method = this.signer?.method
155+
if (!method) {
156+
return iconMap.svgAccount
157+
}
158+
return iconMap[`svg${method.charAt(0).toUpperCase() + method.slice(1)}`] || iconMap.svgAccount
159+
},
111160
updateSigner(signer) {
112161
this.signer = signer ?? {}
113162
this.displayName = signer?.displayName ?? ''
@@ -165,6 +214,17 @@ export default {
165214
width: 100%;
166215
}
167216
217+
:deep(.notecard) {
218+
width: 100%;
219+
margin-bottom: 16px;
220+
221+
div {
222+
display: flex;
223+
align-items: center;
224+
gap: 0.5em;
225+
}
226+
}
227+
168228
&__footer {
169229
width: 100%;
170230
display: flex;

src/Components/RightSidebar/RequestSignatureTab.vue

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,14 @@
122122
:size="size"
123123
:name="modalTitle"
124124
@closing="filesStore.disableIdentifySigner()">
125-
<NcAppSidebar :name="modalTitle"
125+
<NcNoteCard v-if="isSignerMethodDisabled" type="warning">
126+
{{ t('libresign', 'The identification method "{method}" used by this signer has been disabled by the system administrator.', { method: disabledMethodName }) }}
127+
</NcNoteCard>
128+
<NcAppSidebar v-else
129+
:name="modalTitle"
126130
:active="activeTab"
127131
@update:active="onTabChange">
128-
<NcAppSidebarTab v-for="method in enabledMethods()"
132+
<NcAppSidebarTab v-for="method in enabledMethods"
129133
:id="`tab-${method.name}`"
130134
:key="method.name"
131135
:name="method.friendly_name">
@@ -135,7 +139,8 @@
135139
</template>
136140
<IdentifySigner :signer-to-edit="signerToEdit"
137141
:placeholder="method.friendly_name"
138-
:method="method.name" />
142+
:method="method.name"
143+
:methods="methods" />
139144
</NcAppSidebarTab>
140145
</NcAppSidebar>
141146
</NcDialog>
@@ -395,6 +400,32 @@ export default {
395400
}
396401
return this.t('libresign', 'Add new signer')
397402
},
403+
enabledMethods() {
404+
const enabledMethods = this.methods.filter(method => method.enabled)
405+
406+
if (Object.keys(this.signerToEdit).length > 0 && this.signerToEdit.identifyMethods?.length) {
407+
const signerMethod = this.signerToEdit.identifyMethods[0].method
408+
return enabledMethods.filter(method => method.name === signerMethod)
409+
}
410+
411+
return enabledMethods
412+
},
413+
isSignerMethodDisabled() {
414+
if (Object.keys(this.signerToEdit).length > 0 && this.signerToEdit.identifyMethods?.length) {
415+
const signerMethod = this.signerToEdit.identifyMethods[0].method
416+
const methodConfig = this.methods.find(m => m.name === signerMethod)
417+
return !methodConfig?.enabled
418+
}
419+
return false
420+
},
421+
disabledMethodName() {
422+
if (this.isSignerMethodDisabled && this.signerToEdit.identifyMethods?.length) {
423+
const signerMethod = this.signerToEdit.identifyMethods[0].method
424+
const methodConfig = this.methods.find(m => m.name === signerMethod)
425+
return methodConfig?.friendly_name || signerMethod
426+
}
427+
return ''
428+
},
398429
},
399430
watch: {
400431
signers(signers) {
@@ -470,9 +501,6 @@ export default {
470501
return signerOrder === order && signer.status === 0
471502
})
472503
},
473-
enabledMethods() {
474-
return this.methods.filter(method => method.enabled)
475-
},
476504
isSignElementsAvailable() {
477505
return getCapabilities()?.libresign?.config?.['sign-elements']?.['is-available'] === true
478506
},
@@ -491,10 +519,15 @@ export default {
491519
},
492520
addSigner() {
493521
this.signerToEdit = {}
522+
this.activeTab = this.userConfigStore.signer_identify_tab || ''
494523
this.filesStore.enableIdentifySigner()
495524
},
496525
editSigner(signer) {
497526
this.signerToEdit = signer
527+
if (signer.identifyMethods?.length) {
528+
const signerMethod = signer.identifyMethods[0].method
529+
this.activeTab = `tab-${signerMethod}`
530+
}
498531
this.filesStore.enableIdentifySigner()
499532
},
500533
onTabChange(tabId) {

0 commit comments

Comments
 (0)