@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
@@ -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
 
@@ -1,4 +1,5 @@
1
1
  import { translate } from '@nextcloud/l10n';
2
+ import { readPath } from './readPath.js';
2
3
 
3
4
  /**
4
5
  * SPDX-FileCopyrightText: 2026 Conduction B.V.
@@ -176,5 +177,82 @@ function kindCode(kind) {
176
177
  return String(kind?.code || kind?.key || '')
177
178
  }
178
179
 
179
- export { documentsOfParty, indicatorVerdict, indicatorsOf, kindCode, partiesInOrder, representedByMap, roleLabel, rolesInOrder };
180
+ /**
181
+ * Write a value at a dotted path, creating the objects on the way.
182
+ *
183
+ * @param {object} target The object written into.
184
+ * @param {string} path The dotted path (`name.surname`).
185
+ * @param {unknown} value The value.
186
+ * @return {void}
187
+ */
188
+ function writePath(target, path, value) {
189
+ const keys = String(path).split('.').filter((key) => key !== '');
190
+ let node = target;
191
+ keys.slice(0, -1).forEach((key) => {
192
+ if (!node[key] || typeof node[key] !== 'object') {
193
+ node[key] = {};
194
+ }
195
+ node = node[key];
196
+ });
197
+ if (keys.length > 0) {
198
+ node[keys[keys.length - 1]] = value;
199
+ }
200
+ }
201
+
202
+ /**
203
+ * The record a new party is saved as, from the fields a host declares.
204
+ *
205
+ * Each field `{ key, path?, address? }` writes its trimmed value at `path`
206
+ * (default `key`); a field with `address: { path, kind, type }` instead adds
207
+ * `{ kind, type, value }` to the list at that path, the shape OpenRegister's
208
+ * party model reads as the party's addresses. `compose` names the paths a
209
+ * derived field joins with a space, skipping the empty ones
210
+ * (`{ displayName: ["name.givenNames", "name.namePrefix", "name.surname"] }`).
211
+ * A field of `type: "integer"` is saved as a number when it reads as one.
212
+ * An empty value is left out.
213
+ *
214
+ * @param {{fields?: Array<object>, compose?: Record<string, Array<string>>}} create The declaration.
215
+ * @param {Record<string, string>} values The values by field key.
216
+ * @return {object} The record.
217
+ * @spec openspec/changes/object-parties-manage/specs/record-widgets/spec.md#requirement-the-parties-widget-can-add-and-remove-parties
218
+ */
219
+ function newPartyRecord(create, values) {
220
+ const record = {};
221
+ for (const field of Array.isArray(create?.fields) ? create.fields : []) {
222
+ const value = String(values?.[field?.key] ?? '').trim();
223
+ if (!field || !field.key || value === '') {
224
+ continue
225
+ }
226
+ if (field.address && field.address.path) {
227
+ const list = readPath(record, field.address.path);
228
+ const entry = { kind: field.address.kind || 'correspondence', type: field.address.type || 'email', value };
229
+ writePath(record, field.address.path, [...(Array.isArray(list) ? list : []), entry]);
230
+ continue
231
+ }
232
+ writePath(record, field.path || field.key, field.type === 'integer' && /^-?\d+$/.test(value) ? Number(value) : value);
233
+ }
234
+ for (const [target, paths] of Object.entries(create?.compose && typeof create.compose === 'object' ? create.compose : {})) {
235
+ const joined = (Array.isArray(paths) ? paths : [])
236
+ .map((path) => String(readPath(record, path) ?? '').trim())
237
+ .filter((part) => part !== '')
238
+ .join(' ');
239
+ if (joined !== '') {
240
+ writePath(record, target, joined);
241
+ }
242
+ }
243
+ return record
244
+ }
245
+
246
+ /**
247
+ * The uuid a create answered with: `id`, `uuid` or `@self.id`.
248
+ *
249
+ * @param {object} saved The saved object.
250
+ * @return {string} The uuid, or ''.
251
+ * @spec openspec/changes/object-parties-manage/specs/record-widgets/spec.md#requirement-the-parties-widget-can-add-and-remove-parties
252
+ */
253
+ function savedUuid(saved) {
254
+ return String(saved?.['@self']?.id || saved?.uuid || saved?.id || '')
255
+ }
256
+
257
+ export { documentsOfParty, indicatorVerdict, indicatorsOf, kindCode, newPartyRecord, partiesInOrder, representedByMap, roleLabel, rolesInOrder, savedUuid };
180
258
  //# sourceMappingURL=objectParties.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"objectParties.js","sources":["../../../src/utils/objectParties.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * objectParties — reading the parties of a record as OpenRegister's party\n * model answers them (`GET .../objects/{register}/{schema}/{id}/parties`:\n * `{ primary, roles, kinds, byRole, results }`, and `GET .../parties/{uuid}`\n * for one party with its indicators).\n *\n * Pure functions, so CnObjectPartiesWidget and its tests read one shape.\n *\n * @module utils/objectParties\n */\n\nimport { translate as t } from '@nextcloud/l10n'\n\n/**\n * What a role is called: the app's own word (`roleLabels`), else the label\n * the listing declares, else the key. `other` is a party with no role.\n *\n * @param {string} key The role key.\n * @param {Array<{key: string, label?: string}>} roles The roles the listing declares.\n * @param {Record<string, string>} [roleLabels] The app's words, by key.\n * @return {string} The label.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function roleLabel(key, roles, roleLabels = {}) {\n\tif (roleLabels && typeof roleLabels[key] === 'string' && roleLabels[key] !== '') {\n\t\treturn roleLabels[key]\n\t}\n\tconst declared = (roles || []).find((role) => role && role.key === key)\n\tif (declared && declared.label) {\n\t\treturn declared.label\n\t}\n\treturn key === 'other' ? t('nextcloud-vue', 'No role') : key\n}\n\n/**\n * The parties of one role, the primary party first.\n *\n * @param {Array<object>} parties The role's rows.\n * @param {string|null} primary The primary party's uuid.\n * @return {Array<object>} The rows.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function partiesInOrder(parties, primary) {\n\tconst rows = Array.isArray(parties) ? parties.filter(Boolean) : []\n\tif (!primary) {\n\t\treturn rows\n\t}\n\treturn [\n\t\t...rows.filter((row) => row.partyUuid === primary),\n\t\t...rows.filter((row) => row.partyUuid !== primary),\n\t]\n}\n\n/**\n * The roles of a listing as groups, the group holding the primary party first.\n *\n * @param {object|null} listing The `/parties` answer.\n * @param {Record<string, string>} [roleLabels] The app's words for the roles.\n * @return {Array<{key: string, label: string, parties: Array<object>}>} The groups.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function rolesInOrder(listing, roleLabels = {}) {\n\tif (!listing || typeof listing !== 'object') {\n\t\treturn []\n\t}\n\tconst byRole = listing.byRole && typeof listing.byRole === 'object' ? listing.byRole : {}\n\tconst primary = listing.primary || null\n\tconst groups = Object.keys(byRole).map((key) => ({\n\t\tkey,\n\t\tlabel: roleLabel(key, listing.roles, roleLabels),\n\t\tparties: partiesInOrder(byRole[key], primary),\n\t}))\n\tconst holdsPrimary = (group) => !!primary && group.parties.some((party) => party.partyUuid === primary)\n\treturn [...groups.filter(holdsPrimary), ...groups.filter((group) => !holdsPrimary(group))]\n}\n\n/**\n * What an indicator means for what may be done: an indicator always carries\n * its verdict, never a bare chip. `refuse-publication` and `refuse-send` are\n * blocking (`error`); anything else asks to be read first (`warning`).\n *\n * @param {object} indicator The indicator (`{ key, label, effect }`).\n * @param {object} [labels] The app's words: `verdictPublication`, `verdictSend`, `verdictWarn`.\n * @return {{effect: string, severity: string, label: string, verdict: string}} The verdict.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function indicatorVerdict(indicator, labels = {}) {\n\tconst effect = String(indicator?.effect || '').trim()\n\tconst label = String(indicator?.label || indicator?.key || '').trim()\n\tif (effect === 'refuse-publication') {\n\t\treturn { effect, severity: 'error', label, verdict: labels.verdictPublication || t('nextcloud-vue', 'Publishing a file on this record is refused') }\n\t}\n\tif (effect === 'refuse-send') {\n\t\treturn { effect, severity: 'error', label, verdict: labels.verdictSend || t('nextcloud-vue', 'A message to this party is refused') }\n\t}\n\treturn { effect: effect === '' ? 'warn' : effect, severity: 'warning', label, verdict: labels.verdictWarn || t('nextcloud-vue', 'Read this before acting on the record') }\n}\n\n/**\n * Every indicator on a set of parties, each knowing whose it is.\n *\n * @param {Array<object>} parties The party records.\n * @return {Array<object>} The indicators with `party` and `partyName`.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function indicatorsOf(parties) {\n\tconst found = []\n\tfor (const party of parties || []) {\n\t\tif (!party) {\n\t\t\tcontinue\n\t\t}\n\t\tfor (const indicator of Array.isArray(party.indicators) ? party.indicators : []) {\n\t\t\tif (indicator) {\n\t\t\t\tfound.push({ ...indicator, party: party.id || party.uuid || '', partyName: party.name || party.displayName || '' })\n\t\t\t}\n\t\t}\n\t}\n\treturn found\n}\n\n/**\n * Who represents whom: participant uuid to the uuid of the party it acts for,\n * read from role rows (`{ participant, representedParty }`).\n *\n * @param {Array<object>|null} rows The role rows.\n * @return {Record<string, string>} The map.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function representedByMap(rows) {\n\tconst map = {}\n\tfor (const row of Array.isArray(rows) ? rows : []) {\n\t\tconst participant = String(row?.participant || '').trim()\n\t\tconst represented = String(row?.representedParty?.id || row?.representedParty || '').trim()\n\t\tif (participant !== '' && represented !== '') {\n\t\t\tmap[participant] = represented\n\t\t}\n\t}\n\treturn map\n}\n\n/**\n * The documents a party sent and received: sender is the party, or the party\n * is among the recipients.\n *\n * @param {Array<object>} documents The documents.\n * @param {string} identifier The party's uuid.\n * @param {{senderField?: string, recipientsField?: string}} [fields] Where a document names them.\n * @return {{sent: Array<object>, received: Array<object>}} The two lists.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function documentsOfParty(documents, identifier, fields = {}) {\n\tconst id = String(identifier || '').trim()\n\tconst rows = Array.isArray(documents) ? documents : []\n\tif (id === '') {\n\t\treturn { sent: [], received: [] }\n\t}\n\tconst sender = fields.senderField || 'sender'\n\tconst recipients = fields.recipientsField || 'recipients'\n\treturn {\n\t\tsent: rows.filter((row) => String(row?.[sender] || '').trim() === id),\n\t\treceived: rows.filter((row) => (Array.isArray(row?.[recipients]) ? row[recipients] : []).map((entry) => String(entry || '').trim()).includes(id)),\n\t}\n}\n\n/**\n * The code of a party kind (`code`, else `key`).\n *\n * @param {object} kind The kind.\n * @return {string} The code.\n */\nexport function kindCode(kind) {\n\treturn String(kind?.code || kind?.key || '')\n}\n"],"names":["t"],"mappings":"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"}
1
+ {"version":3,"file":"objectParties.js","sources":["../../../src/utils/objectParties.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n * SPDX-License-Identifier: EUPL-1.2\n *\n * objectParties — reading the parties of a record as OpenRegister's party\n * model answers them (`GET .../objects/{register}/{schema}/{id}/parties`:\n * `{ primary, roles, kinds, byRole, results }`, and `GET .../parties/{uuid}`\n * for one party with its indicators).\n *\n * Pure functions, so CnObjectPartiesWidget and its tests read one shape.\n *\n * @module utils/objectParties\n */\n\nimport { translate as t } from '@nextcloud/l10n'\nimport { readPath } from './readPath.js'\n\n/**\n * What a role is called: the app's own word (`roleLabels`), else the label\n * the listing declares, else the key. `other` is a party with no role.\n *\n * @param {string} key The role key.\n * @param {Array<{key: string, label?: string}>} roles The roles the listing declares.\n * @param {Record<string, string>} [roleLabels] The app's words, by key.\n * @return {string} The label.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function roleLabel(key, roles, roleLabels = {}) {\n\tif (roleLabels && typeof roleLabels[key] === 'string' && roleLabels[key] !== '') {\n\t\treturn roleLabels[key]\n\t}\n\tconst declared = (roles || []).find((role) => role && role.key === key)\n\tif (declared && declared.label) {\n\t\treturn declared.label\n\t}\n\treturn key === 'other' ? t('nextcloud-vue', 'No role') : key\n}\n\n/**\n * The parties of one role, the primary party first.\n *\n * @param {Array<object>} parties The role's rows.\n * @param {string|null} primary The primary party's uuid.\n * @return {Array<object>} The rows.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function partiesInOrder(parties, primary) {\n\tconst rows = Array.isArray(parties) ? parties.filter(Boolean) : []\n\tif (!primary) {\n\t\treturn rows\n\t}\n\treturn [\n\t\t...rows.filter((row) => row.partyUuid === primary),\n\t\t...rows.filter((row) => row.partyUuid !== primary),\n\t]\n}\n\n/**\n * The roles of a listing as groups, the group holding the primary party first.\n *\n * @param {object|null} listing The `/parties` answer.\n * @param {Record<string, string>} [roleLabels] The app's words for the roles.\n * @return {Array<{key: string, label: string, parties: Array<object>}>} The groups.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function rolesInOrder(listing, roleLabels = {}) {\n\tif (!listing || typeof listing !== 'object') {\n\t\treturn []\n\t}\n\tconst byRole = listing.byRole && typeof listing.byRole === 'object' ? listing.byRole : {}\n\tconst primary = listing.primary || null\n\tconst groups = Object.keys(byRole).map((key) => ({\n\t\tkey,\n\t\tlabel: roleLabel(key, listing.roles, roleLabels),\n\t\tparties: partiesInOrder(byRole[key], primary),\n\t}))\n\tconst holdsPrimary = (group) => !!primary && group.parties.some((party) => party.partyUuid === primary)\n\treturn [...groups.filter(holdsPrimary), ...groups.filter((group) => !holdsPrimary(group))]\n}\n\n/**\n * What an indicator means for what may be done: an indicator always carries\n * its verdict, never a bare chip. `refuse-publication` and `refuse-send` are\n * blocking (`error`); anything else asks to be read first (`warning`).\n *\n * @param {object} indicator The indicator (`{ key, label, effect }`).\n * @param {object} [labels] The app's words: `verdictPublication`, `verdictSend`, `verdictWarn`.\n * @return {{effect: string, severity: string, label: string, verdict: string}} The verdict.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function indicatorVerdict(indicator, labels = {}) {\n\tconst effect = String(indicator?.effect || '').trim()\n\tconst label = String(indicator?.label || indicator?.key || '').trim()\n\tif (effect === 'refuse-publication') {\n\t\treturn { effect, severity: 'error', label, verdict: labels.verdictPublication || t('nextcloud-vue', 'Publishing a file on this record is refused') }\n\t}\n\tif (effect === 'refuse-send') {\n\t\treturn { effect, severity: 'error', label, verdict: labels.verdictSend || t('nextcloud-vue', 'A message to this party is refused') }\n\t}\n\treturn { effect: effect === '' ? 'warn' : effect, severity: 'warning', label, verdict: labels.verdictWarn || t('nextcloud-vue', 'Read this before acting on the record') }\n}\n\n/**\n * Every indicator on a set of parties, each knowing whose it is.\n *\n * @param {Array<object>} parties The party records.\n * @return {Array<object>} The indicators with `party` and `partyName`.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function indicatorsOf(parties) {\n\tconst found = []\n\tfor (const party of parties || []) {\n\t\tif (!party) {\n\t\t\tcontinue\n\t\t}\n\t\tfor (const indicator of Array.isArray(party.indicators) ? party.indicators : []) {\n\t\t\tif (indicator) {\n\t\t\t\tfound.push({ ...indicator, party: party.id || party.uuid || '', partyName: party.name || party.displayName || '' })\n\t\t\t}\n\t\t}\n\t}\n\treturn found\n}\n\n/**\n * Who represents whom: participant uuid to the uuid of the party it acts for,\n * read from role rows (`{ participant, representedParty }`).\n *\n * @param {Array<object>|null} rows The role rows.\n * @return {Record<string, string>} The map.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function representedByMap(rows) {\n\tconst map = {}\n\tfor (const row of Array.isArray(rows) ? rows : []) {\n\t\tconst participant = String(row?.participant || '').trim()\n\t\tconst represented = String(row?.representedParty?.id || row?.representedParty || '').trim()\n\t\tif (participant !== '' && represented !== '') {\n\t\t\tmap[participant] = represented\n\t\t}\n\t}\n\treturn map\n}\n\n/**\n * The documents a party sent and received: sender is the party, or the party\n * is among the recipients.\n *\n * @param {Array<object>} documents The documents.\n * @param {string} identifier The party's uuid.\n * @param {{senderField?: string, recipientsField?: string}} [fields] Where a document names them.\n * @return {{sent: Array<object>, received: Array<object>}} The two lists.\n * @spec openspec/changes/dq-abstract-record-widgets/specs/record-widgets/spec.md#requirement-a-record-shows-its-parties-by-role\n */\nexport function documentsOfParty(documents, identifier, fields = {}) {\n\tconst id = String(identifier || '').trim()\n\tconst rows = Array.isArray(documents) ? documents : []\n\tif (id === '') {\n\t\treturn { sent: [], received: [] }\n\t}\n\tconst sender = fields.senderField || 'sender'\n\tconst recipients = fields.recipientsField || 'recipients'\n\treturn {\n\t\tsent: rows.filter((row) => String(row?.[sender] || '').trim() === id),\n\t\treceived: rows.filter((row) => (Array.isArray(row?.[recipients]) ? row[recipients] : []).map((entry) => String(entry || '').trim()).includes(id)),\n\t}\n}\n\n/**\n * The code of a party kind (`code`, else `key`).\n *\n * @param {object} kind The kind.\n * @return {string} The code.\n */\nexport function kindCode(kind) {\n\treturn String(kind?.code || kind?.key || '')\n}\n\n/**\n * Write a value at a dotted path, creating the objects on the way.\n *\n * @param {object} target The object written into.\n * @param {string} path The dotted path (`name.surname`).\n * @param {unknown} value The value.\n * @return {void}\n */\nfunction writePath(target, path, value) {\n\tconst keys = String(path).split('.').filter((key) => key !== '')\n\tlet node = target\n\tkeys.slice(0, -1).forEach((key) => {\n\t\tif (!node[key] || typeof node[key] !== 'object') {\n\t\t\tnode[key] = {}\n\t\t}\n\t\tnode = node[key]\n\t})\n\tif (keys.length > 0) {\n\t\tnode[keys[keys.length - 1]] = value\n\t}\n}\n\n/**\n * The record a new party is saved as, from the fields a host declares.\n *\n * Each field `{ key, path?, address? }` writes its trimmed value at `path`\n * (default `key`); a field with `address: { path, kind, type }` instead adds\n * `{ kind, type, value }` to the list at that path, the shape OpenRegister's\n * party model reads as the party's addresses. `compose` names the paths a\n * derived field joins with a space, skipping the empty ones\n * (`{ displayName: [\"name.givenNames\", \"name.namePrefix\", \"name.surname\"] }`).\n * A field of `type: \"integer\"` is saved as a number when it reads as one.\n * An empty value is left out.\n *\n * @param {{fields?: Array<object>, compose?: Record<string, Array<string>>}} create The declaration.\n * @param {Record<string, string>} values The values by field key.\n * @return {object} The record.\n * @spec openspec/changes/object-parties-manage/specs/record-widgets/spec.md#requirement-the-parties-widget-can-add-and-remove-parties\n */\nexport function newPartyRecord(create, values) {\n\tconst record = {}\n\tfor (const field of Array.isArray(create?.fields) ? create.fields : []) {\n\t\tconst value = String(values?.[field?.key] ?? '').trim()\n\t\tif (!field || !field.key || value === '') {\n\t\t\tcontinue\n\t\t}\n\t\tif (field.address && field.address.path) {\n\t\t\tconst list = readPath(record, field.address.path)\n\t\t\tconst entry = { kind: field.address.kind || 'correspondence', type: field.address.type || 'email', value }\n\t\t\twritePath(record, field.address.path, [...(Array.isArray(list) ? list : []), entry])\n\t\t\tcontinue\n\t\t}\n\t\twritePath(record, field.path || field.key, field.type === 'integer' && /^-?\\d+$/.test(value) ? Number(value) : value)\n\t}\n\tfor (const [target, paths] of Object.entries(create?.compose && typeof create.compose === 'object' ? create.compose : {})) {\n\t\tconst joined = (Array.isArray(paths) ? paths : [])\n\t\t\t.map((path) => String(readPath(record, path) ?? '').trim())\n\t\t\t.filter((part) => part !== '')\n\t\t\t.join(' ')\n\t\tif (joined !== '') {\n\t\t\twritePath(record, target, joined)\n\t\t}\n\t}\n\treturn record\n}\n\n/**\n * The uuid a create answered with: `id`, `uuid` or `@self.id`.\n *\n * @param {object} saved The saved object.\n * @return {string} The uuid, or ''.\n * @spec openspec/changes/object-parties-manage/specs/record-widgets/spec.md#requirement-the-parties-widget-can-add-and-remove-parties\n */\nexport function savedUuid(saved) {\n\treturn String(saved?.['@self']?.id || saved?.uuid || saved?.id || '')\n}\n"],"names":["t"],"mappings":"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"}