@conduction/nextcloud-vue 2.133.0 → 2.134.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 (39) hide show
  1. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  2. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +85 -10
  3. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  4. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +60 -36
  5. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  6. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidget.vue.js +1 -1
  7. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidget.vue2.js +10 -0
  8. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidget.vue2.js.map +1 -1
  9. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidget.vue3.js.map +1 -1
  10. package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue.js +1 -1
  11. package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue2.js +202 -6
  12. package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue2.js.map +1 -1
  13. package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue3.js +137 -55
  14. package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue3.js.map +1 -1
  15. package/dist/esm/dialogs/CnPartyAddDialog.vue.js +9 -0
  16. package/dist/esm/dialogs/CnPartyAddDialog.vue.js.map +1 -0
  17. package/dist/esm/dialogs/CnPartyAddDialog.vue2.js +184 -0
  18. package/dist/esm/dialogs/CnPartyAddDialog.vue2.js.map +1 -0
  19. package/dist/esm/dialogs/CnPartyAddDialog.vue3.js +168 -0
  20. package/dist/esm/dialogs/CnPartyAddDialog.vue3.js.map +1 -0
  21. package/dist/esm/l10n/en.json.js +11 -1
  22. package/dist/esm/l10n/en.json.js.map +1 -1
  23. package/dist/esm/l10n/nl.json.js +11 -1
  24. package/dist/esm/l10n/nl.json.js.map +1 -1
  25. package/dist/esm/library-style.js +1 -1
  26. package/dist/esm/nextcloud-vue.css +95 -70
  27. package/dist/esm/utils/objectParties.js +79 -1
  28. package/dist/esm/utils/objectParties.js.map +1 -1
  29. package/dist/nextcloud-vue.cjs.js +5683 -4860
  30. package/dist/nextcloud-vue.cjs.js.map +2 -2
  31. package/dist/nextcloud-vue.css +95 -70
  32. package/l10n/en.json +11 -1
  33. package/l10n/nl.json +11 -1
  34. package/package.json +1 -1
  35. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +105 -12
  36. package/src/components/CnIntegrationWidget/CnIntegrationWidget.vue +10 -0
  37. package/src/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue +264 -3
  38. package/src/dialogs/CnPartyAddDialog.vue +309 -0
  39. package/src/utils/objectParties.js +78 -0
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/dist/nextcloud-vue.cjs.js.map
3
- size: 49478762 bytes
4
- sha256: 8128b7d868a0cfeceec9b70f82d8a27d9555e0c6df93c617918b7f3a5236a9b2
3
+ size: 49551827 bytes
4
+ sha256: e7994a49bfee10dad853249de60d6186e7c6b27b4852be03c39261a0a2f3e9f4
@@ -31613,27 +31613,27 @@ to { background-position: -200% 0;
31613
31613
  }
31614
31614
 
31615
31615
 
31616
- .cn-integration-widget[data-v-2d91b76f] {
31616
+ .cn-integration-widget[data-v-1b6b243b] {
31617
31617
  width: 100%;
31618
31618
  display: flex;
31619
31619
  flex-direction: column;
31620
31620
  min-height: 0;
31621
31621
  }
31622
- .cn-integration-widget__tabbar[data-v-2d91b76f] {
31622
+ .cn-integration-widget__tabbar[data-v-1b6b243b] {
31623
31623
  display: flex;
31624
31624
  align-items: flex-end;
31625
31625
  gap: 8px;
31626
31626
  border-bottom: 1px solid var(--color-border);
31627
31627
  margin-bottom: 12px;
31628
31628
  }
31629
- .cn-integration-widget__tabs[data-v-2d91b76f] {
31629
+ .cn-integration-widget__tabs[data-v-1b6b243b] {
31630
31630
  display: flex;
31631
31631
  flex-wrap: wrap;
31632
31632
  gap: 2px;
31633
31633
  flex: 1;
31634
31634
  min-width: 0;
31635
31635
  }
31636
- .cn-integration-widget__tab[data-v-2d91b76f] {
31636
+ .cn-integration-widget__tab[data-v-1b6b243b] {
31637
31637
  display: inline-flex;
31638
31638
  align-items: center;
31639
31639
  gap: 6px;
@@ -31646,27 +31646,27 @@ to { background-position: -200% 0;
31646
31646
  font-size: 0.95em;
31647
31647
  cursor: pointer;
31648
31648
  }
31649
- .cn-integration-widget__tab[data-v-2d91b76f]:hover {
31649
+ .cn-integration-widget__tab[data-v-1b6b243b]:hover {
31650
31650
  background: var(--color-background-hover);
31651
31651
  color: var(--color-main-text);
31652
31652
  }
31653
- .cn-integration-widget__tab[data-v-2d91b76f]:focus-visible {
31653
+ .cn-integration-widget__tab[data-v-1b6b243b]:focus-visible {
31654
31654
  outline: 2px solid var(--color-primary-element);
31655
31655
  outline-offset: -2px;
31656
31656
  }
31657
- .cn-integration-widget__tab--active[data-v-2d91b76f] {
31657
+ .cn-integration-widget__tab--active[data-v-1b6b243b] {
31658
31658
  color: var(--color-main-text);
31659
31659
  font-weight: 600;
31660
31660
  border-bottom-color: var(--cn-iw-accent, var(--color-primary-element));
31661
31661
  }
31662
- .cn-integration-widget__tab-icon[data-v-2d91b76f] {
31662
+ .cn-integration-widget__tab-icon[data-v-1b6b243b] {
31663
31663
  color: var(--cn-iw-accent, currentColor);
31664
31664
  flex-shrink: 0;
31665
31665
  }
31666
- .cn-integration-widget__tab-label[data-v-2d91b76f] {
31666
+ .cn-integration-widget__tab-label[data-v-1b6b243b] {
31667
31667
  white-space: nowrap;
31668
31668
  }
31669
- .cn-integration-widget__header[data-v-2d91b76f] {
31669
+ .cn-integration-widget__header[data-v-1b6b243b] {
31670
31670
  display: flex;
31671
31671
  align-items: center;
31672
31672
  gap: 8px;
@@ -31674,23 +31674,23 @@ to { background-position: -200% 0;
31674
31674
  margin-bottom: 8px;
31675
31675
  border-bottom: 2px solid var(--cn-iw-accent, var(--color-border));
31676
31676
  }
31677
- .cn-integration-widget__header-icon[data-v-2d91b76f] {
31677
+ .cn-integration-widget__header-icon[data-v-1b6b243b] {
31678
31678
  color: var(--cn-iw-accent, var(--color-main-text));
31679
31679
  flex-shrink: 0;
31680
31680
  }
31681
- .cn-integration-widget__header-label[data-v-2d91b76f] {
31681
+ .cn-integration-widget__header-label[data-v-1b6b243b] {
31682
31682
  font-weight: 600;
31683
31683
  color: var(--color-main-text);
31684
31684
  }
31685
- .cn-integration-widget__header-actions[data-v-2d91b76f] {
31685
+ .cn-integration-widget__header-actions[data-v-1b6b243b] {
31686
31686
  margin-inline-start: auto;
31687
31687
  flex-shrink: 0;
31688
31688
  }
31689
- .cn-integration-widget__panel[data-v-2d91b76f] {
31689
+ .cn-integration-widget__panel[data-v-1b6b243b] {
31690
31690
  flex: 1;
31691
31691
  min-height: 0;
31692
31692
  }
31693
- .cn-integration-widget__panel[data-v-2d91b76f]:focus-visible {
31693
+ .cn-integration-widget__panel[data-v-1b6b243b]:focus-visible {
31694
31694
  outline: 2px solid var(--color-primary-element);
31695
31695
  outline-offset: -2px;
31696
31696
  }
@@ -39208,38 +39208,38 @@ button.cn-linked-widget__link[data-v-0fc31606] {
39208
39208
  }
39209
39209
 
39210
39210
 
39211
- .cn-field-list-widget[data-v-6df666da] {
39211
+ .cn-field-list-widget[data-v-91c65ff8] {
39212
39212
  display: flex;
39213
39213
  flex-direction: column;
39214
39214
  gap: 12px;
39215
39215
  min-width: 0;
39216
39216
  }
39217
- .cn-field-list-widget__lead[data-v-6df666da] {
39217
+ .cn-field-list-widget__lead[data-v-91c65ff8] {
39218
39218
  margin: 0;
39219
39219
  font-weight: bold;
39220
39220
  }
39221
- .cn-field-list-widget__rows[data-v-6df666da] {
39221
+ .cn-field-list-widget__rows[data-v-91c65ff8] {
39222
39222
  list-style: none;
39223
39223
  margin: 0;
39224
39224
  padding: 0;
39225
39225
  display: flex;
39226
39226
  flex-direction: column;
39227
39227
  }
39228
- .cn-field-list-widget__row[data-v-6df666da] {
39228
+ .cn-field-list-widget__row[data-v-91c65ff8] {
39229
39229
  padding: 10px 0;
39230
39230
  border-top: 1px solid var(--color-border);
39231
39231
  }
39232
- .cn-field-list-widget__row[data-v-6df666da]:first-child {
39232
+ .cn-field-list-widget__row[data-v-91c65ff8]:first-child {
39233
39233
  border-top: none;
39234
39234
  padding-top: 0;
39235
39235
  }
39236
- .cn-field-list-widget__line[data-v-6df666da] {
39236
+ .cn-field-list-widget__line[data-v-91c65ff8] {
39237
39237
  display: flex;
39238
39238
  align-items: center;
39239
39239
  gap: 12px;
39240
39240
  min-width: 0;
39241
39241
  }
39242
- .cn-field-list-widget__avatar[data-v-6df666da] {
39242
+ .cn-field-list-widget__avatar[data-v-91c65ff8] {
39243
39243
  flex: 0 0 auto;
39244
39244
  display: inline-flex;
39245
39245
  align-items: center;
@@ -39252,69 +39252,69 @@ button.cn-linked-widget__link[data-v-0fc31606] {
39252
39252
  font-size: 12px;
39253
39253
  font-weight: 700;
39254
39254
  }
39255
- .cn-field-list-widget__main[data-v-6df666da] {
39255
+ .cn-field-list-widget__main[data-v-91c65ff8] {
39256
39256
  display: flex;
39257
39257
  flex-direction: column;
39258
39258
  flex: 1 1 auto;
39259
39259
  min-width: 0;
39260
39260
  }
39261
- .cn-field-list-widget__title[data-v-6df666da] {
39261
+ .cn-field-list-widget__title[data-v-91c65ff8] {
39262
39262
  font-weight: 600;
39263
39263
  overflow-wrap: anywhere;
39264
39264
  }
39265
- .cn-field-list-widget__meta[data-v-6df666da],
39266
- .cn-field-list-widget__aside[data-v-6df666da],
39267
- .cn-field-list-widget__detail[data-v-6df666da],
39268
- .cn-field-list-widget__hint[data-v-6df666da],
39269
- .cn-field-list-widget__empty[data-v-6df666da] {
39265
+ .cn-field-list-widget__meta[data-v-91c65ff8],
39266
+ .cn-field-list-widget__aside[data-v-91c65ff8],
39267
+ .cn-field-list-widget__detail[data-v-91c65ff8],
39268
+ .cn-field-list-widget__hint[data-v-91c65ff8],
39269
+ .cn-field-list-widget__empty[data-v-91c65ff8] {
39270
39270
  color: var(--color-text-maxcontrast);
39271
39271
  }
39272
- .cn-field-list-widget__meta[data-v-6df666da],
39273
- .cn-field-list-widget__aside[data-v-6df666da],
39274
- .cn-field-list-widget__copies[data-v-6df666da] {
39272
+ .cn-field-list-widget__meta[data-v-91c65ff8],
39273
+ .cn-field-list-widget__aside[data-v-91c65ff8],
39274
+ .cn-field-list-widget__copies[data-v-91c65ff8] {
39275
39275
  display: flex;
39276
39276
  flex-wrap: wrap;
39277
39277
  gap: 4px;
39278
39278
  }
39279
- .cn-field-list-widget__detail[data-v-6df666da] {
39279
+ .cn-field-list-widget__detail[data-v-91c65ff8] {
39280
39280
  font-size: 13px;
39281
39281
  }
39282
- .cn-field-list-widget__aside[data-v-6df666da] {
39282
+ .cn-field-list-widget__aside[data-v-91c65ff8] {
39283
39283
  white-space: nowrap;
39284
39284
  }
39285
- .cn-field-list-widget__detail[data-v-6df666da],
39286
- .cn-field-list-widget__hint[data-v-6df666da],
39287
- .cn-field-list-widget__empty[data-v-6df666da] {
39285
+ .cn-field-list-widget__detail[data-v-91c65ff8],
39286
+ .cn-field-list-widget__hint[data-v-91c65ff8],
39287
+ .cn-field-list-widget__empty[data-v-91c65ff8] {
39288
39288
  margin: 4px 0 0;
39289
39289
  overflow-wrap: anywhere;
39290
39290
  }
39291
- .cn-field-list-widget__add[data-v-6df666da] {
39291
+ .cn-field-list-widget__add[data-v-91c65ff8] {
39292
39292
  display: flex;
39293
39293
  flex-wrap: wrap;
39294
39294
  align-items: flex-end;
39295
39295
  gap: 8px 12px;
39296
39296
  }
39297
- .cn-field-list-widget__add[data-v-6df666da] > * {
39297
+ .cn-field-list-widget__add[data-v-91c65ff8] > * {
39298
39298
  flex: 1 1 180px;
39299
39299
  }
39300
- .cn-field-list-widget__add > button[data-v-6df666da] {
39300
+ .cn-field-list-widget__add > button[data-v-91c65ff8] {
39301
39301
  flex: 0 0 auto;
39302
39302
  }
39303
- .cn-field-list-widget__toolbar[data-v-6df666da] {
39303
+ .cn-field-list-widget__toolbar[data-v-91c65ff8] {
39304
39304
  display: flex;
39305
39305
  justify-content: flex-end;
39306
39306
  }
39307
- .cn-field-list-widget__table-wrap[data-v-6df666da] {
39307
+ .cn-field-list-widget__table-wrap[data-v-91c65ff8] {
39308
39308
  display: flex;
39309
39309
  flex-direction: column;
39310
39310
  gap: 12px;
39311
39311
  overflow-x: auto;
39312
39312
  }
39313
- .cn-field-list-widget__table[data-v-6df666da] {
39313
+ .cn-field-list-widget__table[data-v-91c65ff8] {
39314
39314
  width: 100%;
39315
39315
  border-collapse: collapse;
39316
39316
  }
39317
- .cn-field-list-widget__th[data-v-6df666da] {
39317
+ .cn-field-list-widget__th[data-v-91c65ff8] {
39318
39318
  padding: 8px 12px;
39319
39319
  text-align: start;
39320
39320
  font-size: 13px;
@@ -39323,31 +39323,31 @@ button.cn-linked-widget__link[data-v-0fc31606] {
39323
39323
  color: var(--color-text-maxcontrast);
39324
39324
  background: var(--color-background-hover);
39325
39325
  }
39326
- .cn-field-list-widget__th--menu[data-v-6df666da],
39327
- .cn-field-list-widget__code[data-v-6df666da] {
39326
+ .cn-field-list-widget__th--menu[data-v-91c65ff8],
39327
+ .cn-field-list-widget__code[data-v-91c65ff8] {
39328
39328
  font-size: 0.85em;
39329
39329
  word-break: break-all;
39330
39330
  }
39331
- .cn-field-list-widget__td--menu[data-v-6df666da] {
39331
+ .cn-field-list-widget__td--menu[data-v-91c65ff8] {
39332
39332
  width: 1%;
39333
39333
  text-align: end;
39334
39334
  }
39335
- .cn-field-list-widget__tr[data-v-6df666da] {
39335
+ .cn-field-list-widget__tr[data-v-91c65ff8] {
39336
39336
  border-top: 1px solid var(--cn-board-hairline, var(--color-border));
39337
39337
  }
39338
- .cn-field-list-widget__td[data-v-6df666da] {
39338
+ .cn-field-list-widget__td[data-v-91c65ff8] {
39339
39339
  padding: 10px 12px;
39340
39340
  vertical-align: middle;
39341
39341
  overflow-wrap: anywhere;
39342
39342
  }
39343
- .cn-field-list-widget__sr[data-v-6df666da] {
39343
+ .cn-field-list-widget__sr[data-v-91c65ff8] {
39344
39344
  position: absolute;
39345
39345
  width: 1px;
39346
39346
  height: 1px;
39347
39347
  overflow: hidden;
39348
39348
  clip-path: inset(50%);
39349
39349
  }
39350
- .cn-field-list-widget__band[data-v-6df666da] {
39350
+ .cn-field-list-widget__band[data-v-91c65ff8] {
39351
39351
  display: flex;
39352
39352
  flex-wrap: wrap;
39353
39353
  align-items: center;
@@ -41042,22 +41042,40 @@ a.cn-record-list__inline-title[data-v-5aa15b1d] {
41042
41042
  }
41043
41043
 
41044
41044
 
41045
- .cn-object-parties[data-v-196e7ade] {
41045
+ .cn-party-add[data-v-4157800c] {
41046
41046
  display: flex;
41047
41047
  flex-direction: column;
41048
41048
  gap: calc(var(--default-grid-baseline, 4px) * 3);
41049
41049
  }
41050
- .cn-object-parties__verdicts[data-v-196e7ade] {
41050
+ .cn-party-add__mode[data-v-4157800c] {
41051
+ display: flex;
41052
+ flex-direction: column;
41053
+ margin: 0;
41054
+ padding: 0;
41055
+ border: 0;
41056
+ }
41057
+ .cn-party-add__legend[data-v-4157800c] {
41058
+ margin-bottom: var(--default-grid-baseline, 4px);
41059
+ font-weight: 600;
41060
+ }
41061
+
41062
+
41063
+ .cn-object-parties[data-v-0c4e5c0c] {
41064
+ display: flex;
41065
+ flex-direction: column;
41066
+ gap: calc(var(--default-grid-baseline, 4px) * 3);
41067
+ }
41068
+ .cn-object-parties__verdicts[data-v-0c4e5c0c] {
41051
41069
  display: flex;
41052
41070
  flex-direction: column;
41053
41071
  gap: var(--default-grid-baseline, 4px);
41054
41072
  }
41055
- .cn-object-parties__role-label[data-v-196e7ade] {
41073
+ .cn-object-parties__role-label[data-v-0c4e5c0c] {
41056
41074
  margin: 0 0 var(--default-grid-baseline, 4px) 0;
41057
41075
  color: var(--color-text-maxcontrast);
41058
41076
  font-size: 0.9em;
41059
41077
  }
41060
- .cn-object-parties__list[data-v-196e7ade] {
41078
+ .cn-object-parties__list[data-v-0c4e5c0c] {
41061
41079
  display: flex;
41062
41080
  flex-direction: column;
41063
41081
  gap: var(--default-grid-baseline, 4px);
@@ -41065,7 +41083,7 @@ a.cn-record-list__inline-title[data-v-5aa15b1d] {
41065
41083
  padding: 0;
41066
41084
  list-style: none;
41067
41085
  }
41068
- .cn-object-parties__party[data-v-196e7ade] {
41086
+ .cn-object-parties__party[data-v-0c4e5c0c] {
41069
41087
  display: flex;
41070
41088
  flex-wrap: wrap;
41071
41089
  align-items: center;
@@ -41073,26 +41091,33 @@ a.cn-record-list__inline-title[data-v-5aa15b1d] {
41073
41091
  padding: var(--default-grid-baseline, 4px);
41074
41092
  border-radius: var(--border-radius, 4px);
41075
41093
  }
41076
- .cn-object-parties__party[data-v-196e7ade]:hover {
41094
+ .cn-object-parties__party[data-v-0c4e5c0c]:hover {
41077
41095
  background-color: var(--color-background-hover);
41078
41096
  }
41079
- .cn-object-parties__name[data-v-196e7ade] {
41097
+ .cn-object-parties__name[data-v-0c4e5c0c] {
41080
41098
  font-weight: bold;
41081
41099
  }
41082
- .cn-object-parties__muted[data-v-196e7ade] {
41100
+ .cn-object-parties__muted[data-v-0c4e5c0c] {
41083
41101
  color: var(--color-text-maxcontrast);
41084
41102
  }
41085
- .cn-object-parties__main-card[data-v-196e7ade] {
41103
+ .cn-object-parties__manage[data-v-0c4e5c0c] {
41104
+ display: flex;
41105
+ justify-content: flex-end;
41106
+ }
41107
+ .cn-object-parties__remove[data-v-0c4e5c0c] {
41108
+ margin-inline-start: auto;
41109
+ }
41110
+ .cn-object-parties__main-card[data-v-0c4e5c0c] {
41086
41111
  display: flex;
41087
41112
  flex-direction: column;
41088
41113
  gap: calc(var(--default-grid-baseline, 4px) * 3);
41089
41114
  }
41090
- .cn-object-parties__main[data-v-196e7ade] {
41115
+ .cn-object-parties__main[data-v-0c4e5c0c] {
41091
41116
  display: flex;
41092
41117
  align-items: center;
41093
41118
  gap: calc(var(--default-grid-baseline, 4px) * 3);
41094
41119
  }
41095
- .cn-object-parties__main-initials[data-v-196e7ade] {
41120
+ .cn-object-parties__main-initials[data-v-0c4e5c0c] {
41096
41121
  display: flex;
41097
41122
  flex: none;
41098
41123
  align-items: center;
@@ -41104,28 +41129,28 @@ a.cn-record-list__inline-title[data-v-5aa15b1d] {
41104
41129
  color: var(--color-main-text);
41105
41130
  font-weight: 700;
41106
41131
  }
41107
- .cn-object-parties__main-text[data-v-196e7ade] {
41132
+ .cn-object-parties__main-text[data-v-0c4e5c0c] {
41108
41133
  display: flex;
41109
41134
  flex-direction: column;
41110
41135
  }
41111
- .cn-object-parties__main-name[data-v-196e7ade] {
41136
+ .cn-object-parties__main-name[data-v-0c4e5c0c] {
41112
41137
  font-size: 15px;
41113
41138
  }
41114
- .cn-object-parties__main-role[data-v-196e7ade] {
41139
+ .cn-object-parties__main-role[data-v-0c4e5c0c] {
41115
41140
  font-size: 13px;
41116
41141
  }
41117
- .cn-object-parties__main-email[data-v-196e7ade] {
41142
+ .cn-object-parties__main-email[data-v-0c4e5c0c] {
41118
41143
  display: flex;
41119
41144
  align-items: center;
41120
41145
  gap: calc(var(--default-grid-baseline, 4px) * 2.5);
41121
41146
  color: var(--color-main-text);
41122
41147
  overflow-wrap: anywhere;
41123
41148
  }
41124
- .cn-object-parties__main-link[data-v-196e7ade] {
41149
+ .cn-object-parties__main-link[data-v-0c4e5c0c] {
41125
41150
  color: var(--color-primary-element);
41126
41151
  font-weight: 600;
41127
41152
  }
41128
- .cn-object-parties__accepted[data-v-196e7ade] {
41153
+ .cn-object-parties__accepted[data-v-0c4e5c0c] {
41129
41154
  display: flex;
41130
41155
  flex-wrap: wrap;
41131
41156
  align-items: center;
@@ -41134,10 +41159,10 @@ a.cn-record-list__inline-title[data-v-5aa15b1d] {
41134
41159
  border-radius: var(--border-radius-large, 10px);
41135
41160
  background-color: var(--color-background-hover);
41136
41161
  }
41137
- .cn-object-parties__accepted-label[data-v-196e7ade] {
41162
+ .cn-object-parties__accepted-label[data-v-0c4e5c0c] {
41138
41163
  font-weight: 600;
41139
41164
  }
41140
- .cn-object-parties__accepted-kind[data-v-196e7ade] {
41165
+ .cn-object-parties__accepted-kind[data-v-0c4e5c0c] {
41141
41166
  border: 1px solid var(--color-border-dark);
41142
41167
  }
41143
41168
 
package/l10n/en.json CHANGED
@@ -2379,7 +2379,17 @@
2379
2379
  "{field} is less than {value}": "{field} is less than {value}",
2380
2380
  "{field} is at most {value}": "{field} is at most {value}",
2381
2381
  "{field} is filled in": "{field} is filled in",
2382
- "No conditions: the rule always applies.": "No conditions: the rule always applies."
2382
+ "No conditions: the rule always applies.": "No conditions: the rule always applies.",
2383
+ "Add a party": "Add a party",
2384
+ "Remove party": "Remove party",
2385
+ "Remove {name} as {role}": "Remove {name} as {role}",
2386
+ "Remove {name} as {role}?": "Remove {name} as {role}?",
2387
+ "Someone already known": "Someone already known",
2388
+ "Someone new": "Someone new",
2389
+ "The change could not be saved. Nothing was changed.": "The change could not be saved. Nothing was changed.",
2390
+ "The new person was not saved.": "The new person was not saved.",
2391
+ "The party could not be added.": "The party could not be added.",
2392
+ "You may not change who is on this record.": "You may not change who is on this record."
2383
2393
  },
2384
2394
  "plurals": {
2385
2395
  "{count} member": [
package/l10n/nl.json CHANGED
@@ -2629,7 +2629,17 @@
2629
2629
  "{field} is less than {value}": "{field} kleiner is dan {value}",
2630
2630
  "{field} is at most {value}": "{field} hoogstens {value} is",
2631
2631
  "{field} is filled in": "{field} is ingevuld",
2632
- "No conditions: the rule always applies.": "Geen voorwaarden: de regel geldt altijd."
2632
+ "No conditions: the rule always applies.": "Geen voorwaarden: de regel geldt altijd.",
2633
+ "Add a party": "Partij toevoegen",
2634
+ "Remove party": "Partij verwijderen",
2635
+ "Remove {name} as {role}": "{name} als {role} verwijderen",
2636
+ "Remove {name} as {role}?": "{name} als {role} verwijderen?",
2637
+ "Someone already known": "Iemand die al bekend is",
2638
+ "Someone new": "Iemand nieuw",
2639
+ "The change could not be saved. Nothing was changed.": "De wijziging kon niet worden opgeslagen. Er is niets veranderd.",
2640
+ "The new person was not saved.": "De nieuwe persoon is niet opgeslagen.",
2641
+ "The party could not be added.": "De partij kon niet worden toegevoegd.",
2642
+ "You may not change who is on this record.": "U mag niet wijzigen wie er bij dit record hoort."
2633
2643
  },
2634
2644
  "plurals": {
2635
2645
  "{count} member": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/nextcloud-vue",
3
- "version": "2.133.0",
3
+ "version": "2.134.0",
4
4
  "description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
5
5
  "homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
6
6
  "bugs": {
@@ -25,7 +25,16 @@
25
25
  class="cn-field-list-widget__field"
26
26
  :data-testid="`cn-field-list-input-${field.key}`">
27
27
  <NcSelect
28
- v-if="field.type === 'select'"
28
+ v-if="field.type === 'multiselect'"
29
+ v-model="draft[field.key]"
30
+ :inputLabel="field.label"
31
+ :options="field.options"
32
+ :reduce="(option) => option.value"
33
+ :multiple="true"
34
+ :keepOpen="true"
35
+ label="label" />
36
+ <NcSelect
37
+ v-else-if="field.type === 'select'"
29
38
  v-model="draft[field.key]"
30
39
  :inputLabel="field.label"
31
40
  :options="field.options"
@@ -247,7 +256,16 @@
247
256
  class="cn-field-list-widget__field"
248
257
  :data-testid="`cn-field-list-input-${field.key}`">
249
258
  <NcSelect
250
- v-if="field.type === 'select'"
259
+ v-if="field.type === 'multiselect'"
260
+ v-model="draft[field.key]"
261
+ :inputLabel="field.label"
262
+ :options="field.options"
263
+ :reduce="(option) => option.value"
264
+ :multiple="true"
265
+ :keepOpen="true"
266
+ label="label" />
267
+ <NcSelect
268
+ v-else-if="field.type === 'select'"
251
269
  v-model="draft[field.key]"
252
270
  :inputLabel="field.label"
253
271
  :options="field.options"
@@ -365,12 +383,12 @@ export default {
365
383
  * - `field` (required) — the object field holding the array.
366
384
  * - `key` — the item field that identifies an entry (default: the item itself for strings).
367
385
  * - `row` — `{ title, titleFallback?, avatar?, meta?: [paths|{ path, map?, format? }], pill?: { path, map?, variantMap? }, aside?: { path, format?, prefix?, fallback? }, detail?: { template, when?, copy?: [{ path, label }] } }`. `detail.copy` puts a copy button beside the detail line for each named value of the row (an empty value gets none), such as a DNS record's name and value.
368
- * - `add` — `{ label?, fields: [{ key, label, type?: 'text'|'select', options?, required?, pattern?, patternMessage? }], unique?, defaults? }`.
386
+ * - `add` — `{ label?, fields: [{ key, label, type?: 'text'|'select'|'multiselect'|'checkbox', options?, optionsSource?, required?, pattern?, patternMessage? }], unique?, defaults? }`. A `multiselect` field holds a list of values. `optionsSource` — `{ url, path?, valuePath?, labelPath? }` (default `id` and `name`) — adds options read from an endpoint after the static ones, each value once (tokens `@objectId`, `@object.<field>`), for choices that live in other records such as a case type's statuses.
369
387
  * - `remove` — `{ label? }`; omitted = no remove.
370
388
  * - `rowActions` — `[{ id, label, ariaLabel?, when?, placement?: 'band'|'inline', request: { method?, url, payload? } }]`, or `{ id, label, dialog, props }` to open a modal registered in the app registry with filled props (shown in `readOnly` too, since it writes nothing, and only when every token in `props` fills); tokens `@object.<field>`, `@objectId`, `@row.<field>`, `@index`. In the table variant `placement: 'inline'` draws the action as a button in the row instead of in the "..." menu; `ariaLabel` is a template filled from the row.
371
389
  * - `when` (row actions, `detail`) — `{ field: value }`, every field equal; or per field `{ eq?, neq?, set? }`, where a value `@row.<field>` (or `@<field>`) is another field of the same row: `{ deliveredRef: { set: true, neq: '@originalRef' } }`.
372
390
  * - `rowSource` — `{ url, path?, key }`: live per-row state merged by key.
373
- * - `variant: 'table'` + `columns` — `[{ header, path, map?, format?, strong?, pill?, variantMap? }]`: rows as a table; a per-row "..." menu holds the row actions and remove; `detail` lines become a warning band under the table, with the row actions that have `placement: 'band'`.
391
+ * - `variant: 'table'` + `columns` — `[{ header, path, map?, format?, strong?, pill?, variantMap?, labelsFrom? }]` (a list value reads as its items joined; `labelsFrom` names an add field whose option labels word the values): rows as a table; a per-row "..." menu holds the row actions and remove; `detail` lines become a warning band under the table, with the row actions that have `placement: 'band'`.
374
392
  * - `add.trigger: 'button'`, `add.placement: 'header' | 'title' | 'footer'` — the add form opens from a button; `title` reports the button for the card's title row on the `header` event.
375
393
  * - `readOnly`, `hint`, `emptyText`.
376
394
  * - `row.href` — the path of a link for the row title; only http(s) and root-relative links, an absolute one opens in a new tab.
@@ -431,6 +449,8 @@ export default {
431
449
  noticeType: 'error',
432
450
  // What the last copy button put on the clipboard, said to a screen reader.
433
451
  copied: '',
452
+ /** Options read through each add field's `optionsSource`, by field key. */
453
+ sourcedOptions: {},
434
454
  }
435
455
  },
436
456
 
@@ -528,9 +548,12 @@ export default {
528
548
  .map((field) => ({
529
549
  ...field,
530
550
  label: this.tr(field.label || field.key),
531
- options: (Array.isArray(field.options) ? field.options : []).map((option) => (
532
- typeof option === 'object' ? { value: option.value, label: this.tr(option.label || String(option.value)) } : { value: option, label: this.tr(String(option)) }
533
- )),
551
+ options: [
552
+ ...(Array.isArray(field.options) ? field.options : []).map((option) => (
553
+ typeof option === 'object' ? { value: option.value, label: this.tr(option.label || String(option.value)) } : { value: option, label: this.tr(String(option)) }
554
+ )),
555
+ ...(this.sourcedOptions[field.key] || []),
556
+ ],
534
557
  }))
535
558
  },
536
559
 
@@ -652,12 +675,14 @@ export default {
652
675
  objectData() {
653
676
  this.saved = null
654
677
  this.loadLive()
678
+ this.loadOptions()
655
679
  },
656
680
  },
657
681
 
658
682
  created() {
659
683
  this.resetDraft()
660
684
  this.loadLive()
685
+ this.loadOptions()
661
686
  },
662
687
 
663
688
  methods: {
@@ -746,12 +771,77 @@ export default {
746
771
  }
747
772
  return def.format === 'date-long' ? formatBoardDate(date, new Date(date.getFullYear() + 1, 0, 1)) : formatBoardDate(date)
748
773
  }
774
+ if (Array.isArray(raw)) {
775
+ return raw.map((item) => this.wordOf(item, def)).filter((word) => word !== '').join(', ')
776
+ }
777
+ return this.wordOf(raw, def)
778
+ },
779
+
780
+ /**
781
+ * One value in words: through the column's `map`, then the option labels
782
+ * of the add field it names in `labelsFrom`, else the value itself.
783
+ *
784
+ * @param {string|number|boolean|object} raw The value.
785
+ * @param {object} def The column.
786
+ * @return {string}
787
+ */
788
+ wordOf(raw, def) {
749
789
  if (def.map && Object.hasOwn(def.map, String(raw))) {
750
790
  return this.tr(def.map[String(raw)])
751
791
  }
792
+ if (def.labelsFrom) {
793
+ const field = this.addFields.find((candidate) => candidate.key === def.labelsFrom)
794
+ const option = field && field.options.find((candidate) => String(candidate.value) === String(raw))
795
+ if (option) {
796
+ return option.label
797
+ }
798
+ }
752
799
  return typeof raw === 'object' ? '' : String(raw)
753
800
  },
754
801
 
802
+ /**
803
+ * The empty value of an add field: false for a checkbox, a list for a multiselect.
804
+ *
805
+ * @param {object} field The add field.
806
+ * @return {boolean|Array|string}
807
+ */
808
+ emptyValue(field) {
809
+ if (field.type === 'checkbox') {
810
+ return false
811
+ }
812
+ return field.type === 'multiselect' ? [] : ''
813
+ },
814
+
815
+ /**
816
+ * Read the options of every add field that names an `optionsSource`.
817
+ *
818
+ * A source that cannot be read leaves the static options alone.
819
+ *
820
+ * @return {Promise<void>}
821
+ */
822
+ async loadOptions() {
823
+ const fields = this.content.add && Array.isArray(this.content.add.fields) ? this.content.add.fields : []
824
+ for (const field of fields) {
825
+ const source = field && field.optionsSource
826
+ if (!source || !source.url || !field.key) {
827
+ continue
828
+ }
829
+ try {
830
+ const { axios } = await this.http()
831
+ const response = await axios.get(prefixUrl(this.resolve(source.url, {})))
832
+ const list = source.path ? readPath(response && response.data, source.path) : response && response.data
833
+ const options = (Array.isArray(list) ? list : [])
834
+ .map((item) => ({ value: readPath(item, source.valuePath || 'id'), label: String(readPath(item, source.labelPath || 'name') ?? '') }))
835
+ .filter((option, index, all) => option.value !== undefined && option.value !== null && option.value !== ''
836
+ && all.findIndex((other) => String(other.value) === String(option.value)) === index)
837
+ this.sourcedOptions = { ...this.sourcedOptions, [field.key]: options }
838
+ } catch (e) {
839
+ // eslint-disable-next-line no-console
840
+ console.warn('[CnFieldListWidget] optionsSource could not be read:', e?.message || e)
841
+ }
842
+ }
843
+ },
844
+
755
845
  pillOf(entry, spec) {
756
846
  if (!spec || !spec.path) {
757
847
  return null
@@ -923,7 +1013,7 @@ export default {
923
1013
  resetDraft() {
924
1014
  const draft = {}
925
1015
  for (const field of this.addFields) {
926
- const empty = field.type === 'checkbox' ? false : ''
1016
+ const empty = this.emptyValue(field)
927
1017
  const first = field.type === 'select' && field.options.length > 0 ? field.options[0].value : empty
928
1018
  draft[field.key] = field.default !== undefined ? field.default : first
929
1019
  }
@@ -1078,10 +1168,10 @@ export default {
1078
1168
  const errors = {}
1079
1169
  for (const field of this.addFields) {
1080
1170
  const value = this.draft[field.key]
1081
- const empty = value === undefined || value === null || String(value).trim() === ''
1171
+ const empty = value === undefined || value === null || (Array.isArray(value) ? value.length === 0 : String(value).trim() === '')
1082
1172
  if (field.required && empty) {
1083
1173
  errors[field.key] = this.tr('Fill this in.')
1084
- } else if (!empty && field.pattern && !new RegExp(field.pattern).test(String(value).trim())) {
1174
+ } else if (!empty && field.pattern && !Array.isArray(value) && !new RegExp(field.pattern).test(String(value).trim())) {
1085
1175
  errors[field.key] = this.tr(field.patternMessage || 'This value is not valid.')
1086
1176
  }
1087
1177
  }
@@ -1161,7 +1251,7 @@ export default {
1161
1251
  for (const [index, field] of this.addFields.entries()) {
1162
1252
  const scalarValue = this.content.add?.scalar === true && index === 0 ? row.item : undefined
1163
1253
  const value = row.item && typeof row.item === 'object' ? readPath(row.item, field.key) : scalarValue
1164
- draft[field.key] = value === undefined || value === null ? (field.type === 'checkbox' ? false : '') : value
1254
+ draft[field.key] = value === undefined || value === null ? this.emptyValue(field) : value
1165
1255
  }
1166
1256
  this.draft = draft
1167
1257
  this.errors = {}
@@ -1194,7 +1284,10 @@ export default {
1194
1284
  const entry = { ...(add.defaults || {}) }
1195
1285
  for (const field of this.addFields) {
1196
1286
  const value = this.draft[field.key]
1197
- if (value !== undefined && value !== null && String(value).trim() !== '') {
1287
+ if (Array.isArray(value)) {
1288
+ // An emptied list is written as empty, so an edit can clear it.
1289
+ entry[field.key] = value
1290
+ } else if (value !== undefined && value !== null && String(value).trim() !== '') {
1198
1291
  entry[field.key] = trimmed(value)
1199
1292
  }
1200
1293
  }