@conduction/nextcloud-vue 2.78.0 → 2.79.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 (115) hide show
  1. package/dist/bundled-packages.json +0 -2
  2. package/dist/esm/bundled-packages.json +0 -2
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +113 -104
  5. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +12 -2
  7. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  8. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  9. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +80 -0
  10. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  11. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +115 -91
  12. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  13. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +139 -1
  14. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  15. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +140 -92
  16. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  17. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +77 -0
  18. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  19. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +4 -2
  20. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  21. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +61 -1
  22. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  23. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  24. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +173 -5
  25. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  26. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +181 -99
  27. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  28. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +29 -11
  29. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  30. package/dist/esm/components/CnFilesBrowser/openRegisterSource.js +252 -0
  31. package/dist/esm/components/CnFilesBrowser/openRegisterSource.js.map +1 -0
  32. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +1 -1
  33. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  34. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  35. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +25 -2
  36. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  37. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +3 -2
  38. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  39. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +100 -3
  40. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  41. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +4 -2
  42. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  43. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +3 -2
  44. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  45. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  46. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
  47. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js +1 -1
  48. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
  49. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +30 -1
  50. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  51. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  52. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -0
  53. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  54. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  55. package/dist/esm/composables/useAppManifest.js +8 -3
  56. package/dist/esm/composables/useAppManifest.js.map +1 -1
  57. package/dist/esm/index.js +1 -0
  58. package/dist/esm/index.js.map +1 -1
  59. package/dist/esm/l10n/en.json.js +61 -1
  60. package/dist/esm/l10n/en.json.js.map +1 -1
  61. package/dist/esm/l10n/nl.json.js +106 -2
  62. package/dist/esm/l10n/nl.json.js.map +1 -1
  63. package/dist/esm/nextcloud-vue.css +314 -15
  64. package/dist/esm/utils/boardDate.js +193 -0
  65. package/dist/esm/utils/boardDate.js.map +1 -0
  66. package/dist/esm/utils/dynamicProperties.js +5 -1
  67. package/dist/esm/utils/dynamicProperties.js.map +1 -1
  68. package/dist/esm/utils/validateManifestV2.compiled.js +57 -6
  69. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  70. package/dist/nextcloud-vue.cjs.js +2039 -581
  71. package/dist/nextcloud-vue.cjs.js.map +2 -2
  72. package/dist/nextcloud-vue.css +314 -15
  73. package/l10n/en.json +61 -1
  74. package/l10n/nl.json +106 -2
  75. package/package.json +1 -1
  76. package/scripts/build-validators.js +26 -0
  77. package/src/components/CnActionsBar/CnActionsBar.vue +48 -39
  78. package/src/components/CnAppRoot/CnAppRoot.vue +12 -2
  79. package/src/components/CnCellRenderer/CnCellRenderer.vue +119 -2
  80. package/src/components/CnDashboardPage/CnDashboardPage.vue +219 -4
  81. package/src/components/CnDataTable/CnDataTable.md +2 -0
  82. package/src/components/CnDataTable/CnDataTable.vue +81 -2
  83. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +61 -1
  84. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +232 -11
  85. package/src/components/CnFilesBrowser/filesBrowser.js +43 -2
  86. package/src/components/CnFilesBrowser/index.js +1 -0
  87. package/src/components/CnFilesBrowser/openRegisterSource.js +248 -0
  88. package/src/components/CnFormDialog/CnFormDialog.vue +1 -1
  89. package/src/components/CnIndexPage/CnIndexPage.vue +27 -3
  90. package/src/components/CnObjectSidebar/CnFilesTab.vue +103 -4
  91. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +3 -2
  92. package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +1 -1
  93. package/src/components/CnTabsWidget/CnTabsWidget.vue +30 -1
  94. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -0
  95. package/src/components/index.js +1 -1
  96. package/src/composables/useAppManifest.js +8 -3
  97. package/src/css/look-board-detail.css +10 -0
  98. package/src/css/look-board-index.css +92 -14
  99. package/src/css/look-board.css +77 -0
  100. package/src/css/table.css +37 -0
  101. package/src/index.js +4 -0
  102. package/src/schemas/app-manifest-v2.schema.json +46 -1
  103. package/src/utils/boardDate.js +189 -0
  104. package/src/utils/dynamicProperties.js +5 -1
  105. package/src/utils/validateManifestV2.compiled.js +57 -2
  106. package/dist/esm/_virtual/equal.js +0 -4
  107. package/dist/esm/_virtual/equal.js.map +0 -1
  108. package/dist/esm/_virtual/ucs2length.js +0 -4
  109. package/dist/esm/_virtual/ucs2length.js.map +0 -1
  110. package/dist/esm/node_modules/ajv/dist/runtime/equal.js +0 -9
  111. package/dist/esm/node_modules/ajv/dist/runtime/equal.js.map +0 -1
  112. package/dist/esm/node_modules/ajv/dist/runtime/ucs2length.js +0 -25
  113. package/dist/esm/node_modules/ajv/dist/runtime/ucs2length.js.map +0 -1
  114. package/dist/esm/node_modules/fast-deep-equal/index.js +0 -47
  115. package/dist/esm/node_modules/fast-deep-equal/index.js.map +0 -1
@@ -14,6 +14,7 @@ import FolderOutline from 'vue-material-design-icons/FolderOutline.vue';
14
14
  import OpenInNew from 'vue-material-design-icons/OpenInNew.vue';
15
15
  import Pencil from 'vue-material-design-icons/Pencil.vue';
16
16
  import Plus from 'vue-material-design-icons/Plus.vue';
17
+ import TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue';
17
18
  import Upload from 'vue-material-design-icons/Upload.vue';
18
19
  import __sfc_main from '../CnCellRenderer/CnCellRenderer.vue.js';
19
20
  import __sfc_main$2 from '../CnEmptyContent/CnEmptyContent.vue.js';
@@ -57,6 +58,7 @@ var script = {
57
58
  OpenInNew,
58
59
  Pencil,
59
60
  Plus,
61
+ TrashCanOutline,
60
62
  Upload,
61
63
  },
62
64
 
@@ -67,6 +69,30 @@ var script = {
67
69
  },
68
70
 
69
71
  props: {
72
+ /**
73
+ * Where the folder is read from and written to. Null (the default)
74
+ * is WebDAV under the signed-in person's files root, with the Files
75
+ * app's own actions and New menu. An object from
76
+ * `createOpenRegisterSource()` reads one OpenRegister object's folder
77
+ * through OpenRegister's files API instead, under the object's access
78
+ * rule: `rootPath` is then `/`, the Files app's actions and New menu
79
+ * are not offered (they act over WebDAV), and upload, new folder,
80
+ * rename and delete appear only when the listing says the person may
81
+ * change the folder.
82
+ *
83
+ * @type {object|null}
84
+ */
85
+ source: {
86
+ type: Object,
87
+ default: null,
88
+ },
89
+
90
+ /** Label of the delete action and its dialog, with a `source`. */
91
+ deleteLabel: {
92
+ type: String,
93
+ default: () => translate('nextcloud-vue', 'Delete'),
94
+ },
95
+
70
96
  /**
71
97
  * The host's own actions on each file row, declared the way a
72
98
  * manifest declares any action (`open-modal`, `handler`, ...), and
@@ -337,6 +363,9 @@ var script = {
337
363
  renaming: null,
338
364
  renameName: '',
339
365
  renameError: '',
366
+ /** The row being deleted (with a `source`), or null. */
367
+ removing: null,
368
+ removeError: '',
340
369
  fileInputEl: null,
341
370
  /**
342
371
  * The view the Files app's actions are handed. They read `view.id`
@@ -356,6 +385,20 @@ var script = {
356
385
  },
357
386
 
358
387
  computed: {
388
+ /**
389
+ * Whether this person may add to and change the open folder. Over
390
+ * WebDAV the server answers each write on its own, so this is true;
391
+ * with a `source` it is what the listing said.
392
+ *
393
+ * @return {boolean} True when upload, new folder, rename and delete are offered.
394
+ */
395
+ canChange() {
396
+ if (!this.source) {
397
+ return true
398
+ }
399
+ return this.folder !== null && this.folder.canChange === true
400
+ },
401
+
359
402
  /**
360
403
  * The breadcrumb trail from the root to the open folder.
361
404
  *
@@ -460,7 +503,7 @@ var script = {
460
503
  * @return {Array<object>} The entries, in the plugins' order.
461
504
  */
462
505
  newMenuEntries() {
463
- if (this.folder === null) {
506
+ if (this.folder === null || this.source) {
464
507
  return []
465
508
  }
466
509
  try {
@@ -518,6 +561,10 @@ var script = {
518
561
  async refresh() {
519
562
  this.loading = true;
520
563
  this.error = '';
564
+ if (this.source) {
565
+ await this.refreshFromSource();
566
+ return
567
+ }
521
568
  try {
522
569
  const client = getClient();
523
570
  const { data } = await client.getDirectoryContents(this.davPath(this.currentPath), {
@@ -545,6 +592,70 @@ var script = {
545
592
  }
546
593
  },
547
594
 
595
+ /**
596
+ * List the open folder through the `source`.
597
+ *
598
+ * @return {Promise<void>}
599
+ */
600
+ async refreshFromSource() {
601
+ try {
602
+ const { folder, nodes } = await this.source.list(this.currentPath);
603
+ this.folder = folder;
604
+ this.nodes = nodes;
605
+ await this.resolveRowData(this.nodes);
606
+ } catch (err) {
607
+ const atRoot = (this.currentPath.replace(/\/+$/, '') || '/') === (this.rootPath.replace(/\/+$/, '') || '/');
608
+ this.error = err?.status === 404
609
+ ? (atRoot ? translate('nextcloud-vue', 'You cannot see these files') : translate('nextcloud-vue', 'This folder no longer exists'))
610
+ : (err?.status === 403 ? translate('nextcloud-vue', 'You cannot see this folder') : translate('nextcloud-vue', 'The folder could not be read'));
611
+ this.folder = null;
612
+ this.nodes = [];
613
+ } finally {
614
+ this.loading = false;
615
+ }
616
+ },
617
+
618
+ /**
619
+ * Where a file downloads from, through the `source`.
620
+ *
621
+ * @param {object} node The row.
622
+ * @return {string|null} The url.
623
+ */
624
+ sourceDownloadUrl(node) {
625
+ return this.source && typeof this.source.downloadUrl === 'function' ? this.source.downloadUrl(node) : null
626
+ },
627
+
628
+ /**
629
+ * Open the delete dialog on a row.
630
+ *
631
+ * @param {object} node The row.
632
+ * @return {void}
633
+ */
634
+ askRemove(node) {
635
+ this.removing = node;
636
+ this.removeError = '';
637
+ },
638
+
639
+ /**
640
+ * Delete the row named in the dialog, through the `source`.
641
+ *
642
+ * @return {Promise<void>}
643
+ */
644
+ async remove() {
645
+ const node = this.removing;
646
+ if (node === null || !this.source) {
647
+ return
648
+ }
649
+ try {
650
+ await this.source.remove(node);
651
+ this.removing = null;
652
+ await this.refresh();
653
+ this.$emit('changed');
654
+ } catch (err) {
655
+ this.removeError = err?.message || translate('nextcloud-vue', '{action} did not succeed', { action: this.deleteLabel });
656
+ }
657
+ },
658
+
548
659
  /**
549
660
  * Open a folder below the root.
550
661
  *
@@ -582,6 +693,13 @@ var script = {
582
693
  this.navigate(node.path);
583
694
  return
584
695
  }
696
+ if (this.source) {
697
+ const url = this.sourceDownloadUrl(node);
698
+ if (url) {
699
+ window.open(url, '_blank', 'noopener,noreferrer');
700
+ }
701
+ return
702
+ }
585
703
  const view = this.actionsFor(node).find((action) => action.id === 'view');
586
704
  if (view) {
587
705
  await this.run(view, node);
@@ -628,6 +746,16 @@ var script = {
628
746
  * @return {void}
629
747
  */
630
748
  openInNewTab(node) {
749
+ if (this.source) {
750
+ if (this.isFolder(node)) {
751
+ return
752
+ }
753
+ const url = this.sourceDownloadUrl(node);
754
+ if (url) {
755
+ window.open(url, '_blank', 'noopener,noreferrer');
756
+ }
757
+ return
758
+ }
631
759
  if (node.fileid) {
632
760
  window.open(this.permalink(node), '_blank', 'noopener,noreferrer');
633
761
  }
@@ -655,6 +783,9 @@ var script = {
655
783
  * @return {Array<object>} The actions.
656
784
  */
657
785
  actionsFor(node) {
786
+ if (this.source) {
787
+ return []
788
+ }
658
789
  let actions;
659
790
  try {
660
791
  actions = getFileActions();
@@ -784,7 +915,11 @@ var script = {
784
915
  return
785
916
  }
786
917
  try {
787
- await getClient().createDirectory(this.davPath(joinPath(this.currentPath, name)));
918
+ if (this.source) {
919
+ await this.source.createFolder(this.currentPath, name);
920
+ } else {
921
+ await getClient().createDirectory(this.davPath(joinPath(this.currentPath, name)));
922
+ }
788
923
  this.newFolderOpen = false;
789
924
  await this.refresh();
790
925
  this.$emit('changed');
@@ -825,7 +960,11 @@ var script = {
825
960
  return
826
961
  }
827
962
  try {
828
- await getClient().moveFile(this.davPath(node.path), this.davPath(joinPath(this.currentPath, name)));
963
+ if (this.source) {
964
+ await this.source.rename(node, name);
965
+ } else {
966
+ await getClient().moveFile(this.davPath(node.path), this.davPath(joinPath(this.currentPath, name)));
967
+ }
829
968
  this.renaming = null;
830
969
  await this.refresh();
831
970
  this.$emit('changed');
@@ -869,6 +1008,9 @@ var script = {
869
1008
  this.dragging = false;
870
1009
  this.dragDepth = 0;
871
1010
  this.dropStatus = '';
1011
+ if (!this.canChange) {
1012
+ return
1013
+ }
872
1014
  const files = event.dataTransfer?.files;
873
1015
  if (files?.length) {
874
1016
  await this.uploadFiles(files);
@@ -886,7 +1028,7 @@ var script = {
886
1028
  * @return {void}
887
1029
  */
888
1030
  onDragEnter(event) {
889
- if (!this.carriesFiles(event)) {
1031
+ if (!this.canChange || !this.carriesFiles(event)) {
890
1032
  return
891
1033
  }
892
1034
  this.dragDepth++;
@@ -903,7 +1045,7 @@ var script = {
903
1045
  * @return {void}
904
1046
  */
905
1047
  onDragOver(event) {
906
- if (this.carriesFiles(event)) {
1048
+ if (this.canChange && this.carriesFiles(event)) {
907
1049
  this.dragging = true;
908
1050
  }
909
1051
  },
@@ -956,6 +1098,10 @@ var script = {
956
1098
  const batch = [...files].map((file) => ({ key: `u${++uploadSeq}`, name: file.name, progress: 0, error: '', file }));
957
1099
  this.uploads = [...this.uploads, ...batch];
958
1100
  for (const upload of batch) {
1101
+ if (this.source) {
1102
+ await this.uploadThroughSource(upload);
1103
+ continue
1104
+ }
959
1105
  try {
960
1106
  await axios__default.put(`${getRemoteURL()}${this.davPath(joinPath(this.currentPath, upload.name))}`, upload.file, {
961
1107
  headers: {
@@ -984,6 +1130,25 @@ var script = {
984
1130
  }, 1500);
985
1131
  },
986
1132
 
1133
+ /**
1134
+ * Store one upload through the `source`, keeping its progress row.
1135
+ *
1136
+ * @param {object} upload The progress row, carrying the file.
1137
+ * @return {Promise<void>}
1138
+ */
1139
+ async uploadThroughSource(upload) {
1140
+ try {
1141
+ await this.source.upload(this.currentPath, upload.file, (percent) => {
1142
+ upload.progress = percent;
1143
+ });
1144
+ upload.progress = 100;
1145
+ } catch (err) {
1146
+ upload.error = err?.status === 409
1147
+ ? translate('nextcloud-vue', 'A file with that name is already here')
1148
+ : (err?.message || translate('nextcloud-vue', 'The upload failed'));
1149
+ }
1150
+ },
1151
+
987
1152
  /**
988
1153
  * Change the sort column, or flip the order on the same one.
989
1154
  *
@@ -1216,6 +1381,9 @@ var script = {
1216
1381
  if (!node.fileid || this.isFolder(node) || !/^image\//i.test(mime) || /svg/i.test(mime) || this.previewFailed[node.fileid]) {
1217
1382
  return null
1218
1383
  }
1384
+ if (this.source) {
1385
+ return typeof this.source.previewUrl === 'function' ? this.source.previewUrl(node) : null
1386
+ }
1219
1387
  return generateUrl('/core/preview?fileId={fileId}&x=64&y=64&a=1', { fileId: node.fileid })
1220
1388
  },
1221
1389