@anchrd/intel-ui 0.39.0 → 0.41.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.
- package/package.json +13 -2
- package/src/access-summary/access-summary.tsx +1 -11
- package/src/app/app-tree/app-tree.tsx +58 -0
- package/src/attachment-viewer/attachment-viewer.tsx +304 -0
- package/src/board/board-assignee/board-assignee.ts +18 -0
- package/src/board/board-crumbs/board-crumbs.ts +56 -0
- package/src/board/board-crumbs/board-crumbs.tsx +108 -0
- package/src/board/board-data/board-data.ts +31 -5
- package/src/board/board-data/board-data.types.ts +10 -1
- package/src/board/board-kanban/board-kanban.ts +63 -9
- package/src/board/board-kanban/board-kanban.tsx +409 -66
- package/src/board/board-open-task/board-open-task.ts +32 -0
- package/src/board/board-panel/board-panel.tsx +202 -31
- package/src/board/board-settings/board-settings.tsx +209 -0
- package/src/board/board-stripes/board-stripes.ts +128 -0
- package/src/board/board-table/board-table.ts +23 -105
- package/src/board/board-table/board-table.tsx +436 -135
- package/src/board/board-task/board-task.ts +105 -0
- package/src/board/board-task/board-task.tsx +396 -0
- package/src/board/board-title-row/board-title-row.tsx +68 -0
- package/src/file-preview/file-preview-view.tsx +28 -0
- package/src/file-preview/file-preview.tsx +28 -0
- package/src/file-preview/pdf-file-preview.tsx +5 -0
- package/src/file-preview/presentation-file-preview.tsx +21 -0
- package/src/file-preview/spreadsheet-file-preview.tsx +5 -0
- package/src/file-preview/word-file-preview.tsx +5 -0
- package/src/i18n/de.json +81 -7
- package/src/i18n/en.json +81 -7
- package/src/i18n/es.json +81 -7
- package/src/nodes/nodes.tsx +26 -52
- package/src/resource-menu/resource-menu.tsx +18 -12
- package/src/router/selection-search.ts +17 -2
- package/src/styles.css +29 -25
- package/src/title-row/title-row.tsx +33 -6
- package/src/user-name/user-name.ts +17 -0
- package/vite.config.ts +111 -3
package/src/i18n/de.json
CHANGED
|
@@ -31,28 +31,76 @@
|
|
|
31
31
|
"archive.title": "Archiv",
|
|
32
32
|
"auth.signOut": "Abmelden",
|
|
33
33
|
"auth.signOutFailed": "Das Abmelden ist fehlgeschlagen. Prüfe deine Verbindung und versuche es erneut.",
|
|
34
|
+
"board.add": "Etwas hinzufügen",
|
|
35
|
+
"board.add.due": "Fällig",
|
|
36
|
+
"board.add.label": "Label",
|
|
37
|
+
"board.add.start": "Start",
|
|
34
38
|
"board.addCard": "+ Aufgabe",
|
|
35
39
|
"board.addCardIn": "Eine Aufgabe zu {column} hinzufügen",
|
|
36
|
-
"board.
|
|
40
|
+
"board.addLabel": "Label hinzufügen",
|
|
41
|
+
"board.addLink": "Verlinkung",
|
|
42
|
+
"board.backTo": "Zurück zu {board}",
|
|
43
|
+
"board.cardLabel": "{title} öffnen, in {column}. Alt und eine Pfeiltaste verschiebt sie.",
|
|
44
|
+
"board.clearAssignee": "Zuständigkeit von {name} entfernen",
|
|
45
|
+
"board.column.archive": "Archiv",
|
|
37
46
|
"board.column.assignee": "Zuständig",
|
|
47
|
+
"board.column.default.backlog": "Backlog",
|
|
48
|
+
"board.column.default.doing": "Läuft",
|
|
49
|
+
"board.column.default.done": "Fertig",
|
|
50
|
+
"board.column.default.todo": "Offen",
|
|
38
51
|
"board.column.dependsOn": "Wartet auf",
|
|
39
52
|
"board.column.due": "Fällig",
|
|
40
53
|
"board.column.labels": "Labels",
|
|
41
54
|
"board.column.status": "Spalte",
|
|
42
55
|
"board.column.title": "Titel",
|
|
43
|
-
"board.columnEmpty": "Hier ist noch nichts.",
|
|
44
56
|
"board.createFailed": "Die Aufgabe konnte nicht angelegt werden.",
|
|
57
|
+
"board.crumbs": "Wo diese Karte sitzt",
|
|
58
|
+
"board.crumbsFolded": "Die Ebenen dazwischen zeigen",
|
|
59
|
+
"board.drag.lifted": "{card} aufgenommen",
|
|
60
|
+
"board.drag.moved": "{card} nach {column} verschoben",
|
|
61
|
+
"board.drag.putBack": "{card} zurückgelegt",
|
|
62
|
+
"board.dragInstructions": "Eine Karte wird mit der Maus gezogen. Ohne Zeigegerät: Alt halten und eine Pfeiltaste drücken — links und rechts wechseln die Spalte, hoch und runter bewegen innerhalb einer Spalte.",
|
|
45
63
|
"board.failed": "Dieses Board konnte nicht geladen werden.",
|
|
46
64
|
"board.filter.all": "Alle Spalten",
|
|
47
65
|
"board.filter.status": "Spalte zeigen",
|
|
48
66
|
"board.filterEmpty": "Keine Karte passt zu diesem Filter.",
|
|
49
|
-
"board.
|
|
67
|
+
"board.fromDate": "ab {date}",
|
|
68
|
+
"board.group.empty": "Nichts gesetzt",
|
|
50
69
|
"board.group.none": "Nichts",
|
|
51
|
-
"board.group.status": "Spalte",
|
|
52
70
|
"board.groupBy": "Gruppieren nach",
|
|
71
|
+
"board.link.blocker": "Wartet auf",
|
|
72
|
+
"board.link.outside": "Außerhalb dieses Boards",
|
|
73
|
+
"board.link.subtask": "Unteraufgabe",
|
|
74
|
+
"board.links": "Verlinkt",
|
|
75
|
+
"board.moveTo": "In eine Spalte verschieben",
|
|
76
|
+
"board.progress": "{done} von {total} erledigt",
|
|
77
|
+
"board.removeLabel": "Label {label} entfernen",
|
|
78
|
+
"board.settings.addColumn": "+ Spalte",
|
|
79
|
+
"board.settings.columnName": "Name der Spalte {column}",
|
|
80
|
+
"board.settings.description": "Spalten und was das Board zeigt.",
|
|
81
|
+
"board.settings.duplicateName": "Zwei Spalten heißen {column}. Namen müssen sie unterscheidbar machen.",
|
|
82
|
+
"board.settings.failed": "Die Einstellungen konnten nicht gespeichert werden.",
|
|
83
|
+
"board.settings.moveDown": "{column} nach unten",
|
|
84
|
+
"board.settings.moveUp": "{column} nach oben",
|
|
85
|
+
"board.settings.newColumn": "Neue Spalte",
|
|
86
|
+
"board.settings.open": "Board-Einstellungen",
|
|
87
|
+
"board.settings.remove": "{column} entfernen",
|
|
88
|
+
"board.settings.removeBlocked": "{column} ist nicht leer. Verschiebe die Karten zuerst.",
|
|
89
|
+
"board.settings.showArchive": "Archiv-Spalte zeigen",
|
|
90
|
+
"board.settings.showArchiveHint": "Sie ist auf jedem Board. Ausgeblendet sind ihre Karten überall aus dem Blick.",
|
|
91
|
+
"board.settings.title": "Board-Einstellungen",
|
|
92
|
+
"board.stripes.root": "Ebene {level}, hat Unteraufgaben",
|
|
93
|
+
"board.stripes.under": "Ebene {level} · übergeordnet in {column}",
|
|
94
|
+
"board.table.collapse": "Verbergen, was unter {row} liegt",
|
|
95
|
+
"board.table.columns": "Spalten",
|
|
96
|
+
"board.table.expand": "Zeigen, was unter {row} liegt",
|
|
97
|
+
"board.table.filteredBy": "nur {column}",
|
|
98
|
+
"board.table.groupedBy": "gruppiert nach {column}",
|
|
53
99
|
"board.tableEmpty": "Dieses Board hat noch keine Karten.",
|
|
100
|
+
"board.taskGone": "Diese Karte steht nicht mehr auf diesem Board. Sie ist entweder archiviert oder nicht mehr da.",
|
|
54
101
|
"board.unassigned": "Noch niemand",
|
|
55
102
|
"board.unknownColumn": "nicht auf diesem Board",
|
|
103
|
+
"board.untilDate": "fällig {date}",
|
|
56
104
|
"board.view.kanban": "Kanban",
|
|
57
105
|
"board.view.table": "Tabelle",
|
|
58
106
|
"common.cancel": "Abbrechen",
|
|
@@ -172,14 +220,40 @@
|
|
|
172
220
|
"flows.validate": "Prüfen, ob er laufen würde",
|
|
173
221
|
"flows.validateReady": "Dieser Flow würde jetzt starten.",
|
|
174
222
|
"flows.validateWhen": "Geprüft {when}. Der Werkzeug-Zugriff wird jedes Mal mit deinem eigenen Token erfragt, diese Antwort ist also eine Momentaufnahme.",
|
|
223
|
+
"attachment.details.checksum": "Prüfsumme",
|
|
224
|
+
"attachment.details.dimensions": "Abmessungen",
|
|
225
|
+
"attachment.details.format": "Format",
|
|
226
|
+
"attachment.details.mimeType": "MIME-Typ",
|
|
227
|
+
"attachment.details.name": "Name",
|
|
228
|
+
"attachment.details.pages": "Seiten",
|
|
229
|
+
"attachment.details.private": "Privat",
|
|
230
|
+
"attachment.details.size": "Größe",
|
|
231
|
+
"attachment.details.sections": "Abschnitte",
|
|
232
|
+
"attachment.details.slides": "Folien",
|
|
233
|
+
"attachment.details.storage": "Speicher",
|
|
234
|
+
"attachment.details.technical": "Technisch",
|
|
235
|
+
"attachment.details.title": "Dateidetails",
|
|
236
|
+
"attachment.details.type": "Typ",
|
|
237
|
+
"attachment.details.uploaded": "Hochgeladen",
|
|
238
|
+
"attachment.details.uploadedBy": "Hochgeladen von",
|
|
239
|
+
"attachment.details.version": "Version",
|
|
240
|
+
"attachment.details.worksheets": "Tabellenblätter",
|
|
241
|
+
"attachment.kind.image": "Bild",
|
|
242
|
+
"attachment.kind.pdf": "PDF-Dokument",
|
|
243
|
+
"attachment.kind.presentation": "Präsentation",
|
|
244
|
+
"attachment.kind.spreadsheet": "Tabelle",
|
|
245
|
+
"attachment.kind.unsupported": "Datei",
|
|
246
|
+
"attachment.kind.word": "Word-Dokument",
|
|
247
|
+
"attachment.detailsHide": "Dateidetails ausblenden",
|
|
248
|
+
"attachment.detailsShow": "Dateidetails anzeigen",
|
|
249
|
+
"attachment.empty": "Es wurde noch keine Datei hochgeladen.",
|
|
250
|
+
"attachment.loadFailed": "Die Datei konnte nicht geladen werden. Das Original lässt sich weiterhin über das Menü exportieren.",
|
|
251
|
+
"attachment.unsupported": "Dieser Dateityp kann nicht angezeigt werden. Das Original lässt sich weiterhin über das Menü exportieren.",
|
|
175
252
|
"nav.primary": "Hauptnavigation",
|
|
176
253
|
"nav.tools": "Werkzeuge",
|
|
177
254
|
"node.access": "Zugriff",
|
|
178
255
|
"node.accessDetails": "Zugriffsdetails anzeigen ({count})",
|
|
179
|
-
"node.attachmentHelp": "Die kanonische Datei liegt privat in Intel. Ihre KI-lesbare Projektion wird getrennt indexiert.",
|
|
180
256
|
"node.changed": "Geändert",
|
|
181
|
-
"node.download": "Datei herunterladen",
|
|
182
|
-
"node.downloadFailed": "Der Anhang konnte nicht heruntergeladen werden. Prüfe deinen Zugriff und versuche es erneut.",
|
|
183
257
|
"node.email": "E-Mail-Adresse",
|
|
184
258
|
"node.empty": "Es wurde noch nichts hinzugefügt.",
|
|
185
259
|
"node.folderEmpty": "In diesem Ordner ist noch nichts. Lege etwas über das Plus in der Seitenleiste an.",
|
package/src/i18n/en.json
CHANGED
|
@@ -31,28 +31,76 @@
|
|
|
31
31
|
"archive.title": "Archive",
|
|
32
32
|
"auth.signOut": "Sign out",
|
|
33
33
|
"auth.signOutFailed": "Signing out failed. Check your connection and try again.",
|
|
34
|
+
"board.add": "Add something",
|
|
35
|
+
"board.add.due": "Due",
|
|
36
|
+
"board.add.label": "Label",
|
|
37
|
+
"board.add.start": "Start",
|
|
34
38
|
"board.addCard": "+ Task",
|
|
35
39
|
"board.addCardIn": "Add a task to {column}",
|
|
36
|
-
"board.
|
|
40
|
+
"board.addLabel": "Add a label",
|
|
41
|
+
"board.addLink": "Link",
|
|
42
|
+
"board.backTo": "Back to {board}",
|
|
43
|
+
"board.cardLabel": "Open {title}, in {column}. Alt and an arrow key moves it.",
|
|
44
|
+
"board.clearAssignee": "Take the assignment off {name}",
|
|
45
|
+
"board.column.archive": "Archive",
|
|
37
46
|
"board.column.assignee": "Assigned to",
|
|
47
|
+
"board.column.default.backlog": "Backlog",
|
|
48
|
+
"board.column.default.doing": "In progress",
|
|
49
|
+
"board.column.default.done": "Done",
|
|
50
|
+
"board.column.default.todo": "To do",
|
|
38
51
|
"board.column.dependsOn": "Waiting for",
|
|
39
52
|
"board.column.due": "Due",
|
|
40
53
|
"board.column.labels": "Labels",
|
|
41
54
|
"board.column.status": "Column",
|
|
42
55
|
"board.column.title": "Title",
|
|
43
|
-
"board.columnEmpty": "Nothing here yet.",
|
|
44
56
|
"board.createFailed": "The task could not be created.",
|
|
57
|
+
"board.crumbs": "Where this card sits",
|
|
58
|
+
"board.crumbsFolded": "Show the levels in between",
|
|
59
|
+
"board.drag.lifted": "{card} picked up",
|
|
60
|
+
"board.drag.moved": "{card} moved to {column}",
|
|
61
|
+
"board.drag.putBack": "{card} put back",
|
|
62
|
+
"board.dragInstructions": "Drag a card with the mouse to move it. Without a pointer, hold Alt and press an arrow key: left and right move the card between columns, up and down within one.",
|
|
45
63
|
"board.failed": "This board could not be loaded.",
|
|
46
64
|
"board.filter.all": "Every column",
|
|
47
65
|
"board.filter.status": "Show column",
|
|
48
66
|
"board.filterEmpty": "No card matches this filter.",
|
|
49
|
-
"board.
|
|
67
|
+
"board.fromDate": "from {date}",
|
|
68
|
+
"board.group.empty": "Nothing set",
|
|
50
69
|
"board.group.none": "Nothing",
|
|
51
|
-
"board.group.status": "Column",
|
|
52
70
|
"board.groupBy": "Group by",
|
|
71
|
+
"board.link.blocker": "Waits for",
|
|
72
|
+
"board.link.outside": "Outside this board",
|
|
73
|
+
"board.link.subtask": "Subtask",
|
|
74
|
+
"board.links": "Linked",
|
|
75
|
+
"board.moveTo": "Move to a column",
|
|
76
|
+
"board.progress": "{done} of {total} done",
|
|
77
|
+
"board.removeLabel": "Remove the label {label}",
|
|
78
|
+
"board.settings.addColumn": "+ Column",
|
|
79
|
+
"board.settings.columnName": "Name of the column {column}",
|
|
80
|
+
"board.settings.description": "Columns and what the board shows.",
|
|
81
|
+
"board.settings.duplicateName": "Two columns are called {column}. Names have to tell them apart.",
|
|
82
|
+
"board.settings.failed": "The settings could not be saved.",
|
|
83
|
+
"board.settings.moveDown": "Move {column} down",
|
|
84
|
+
"board.settings.moveUp": "Move {column} up",
|
|
85
|
+
"board.settings.newColumn": "New column",
|
|
86
|
+
"board.settings.open": "Board settings",
|
|
87
|
+
"board.settings.remove": "Remove {column}",
|
|
88
|
+
"board.settings.removeBlocked": "{column} is not empty. Move its cards out first.",
|
|
89
|
+
"board.settings.showArchive": "Show the archive column",
|
|
90
|
+
"board.settings.showArchiveHint": "It is on every board. Hidden, its cards are out of sight everywhere.",
|
|
91
|
+
"board.settings.title": "Board settings",
|
|
92
|
+
"board.stripes.root": "Level {level}, has subtasks",
|
|
93
|
+
"board.stripes.under": "Level {level} · parent in {column}",
|
|
94
|
+
"board.table.collapse": "Hide what is under {row}",
|
|
95
|
+
"board.table.columns": "Columns",
|
|
96
|
+
"board.table.expand": "Show what is under {row}",
|
|
97
|
+
"board.table.filteredBy": "only {column}",
|
|
98
|
+
"board.table.groupedBy": "grouped by {column}",
|
|
53
99
|
"board.tableEmpty": "This board has no cards yet.",
|
|
100
|
+
"board.taskGone": "This card is not on this board any more. It may have been archived, or it is gone.",
|
|
54
101
|
"board.unassigned": "Nobody yet",
|
|
55
102
|
"board.unknownColumn": "not on this board",
|
|
103
|
+
"board.untilDate": "due {date}",
|
|
56
104
|
"board.view.kanban": "Kanban",
|
|
57
105
|
"board.view.table": "Table",
|
|
58
106
|
"common.cancel": "Cancel",
|
|
@@ -172,14 +220,40 @@
|
|
|
172
220
|
"flows.validate": "Check whether it would run",
|
|
173
221
|
"flows.validateReady": "This flow would start now.",
|
|
174
222
|
"flows.validateWhen": "Checked {when}. Tool access is asked with your own token each time, so this answer is a snapshot.",
|
|
223
|
+
"attachment.details.checksum": "Checksum",
|
|
224
|
+
"attachment.details.dimensions": "Dimensions",
|
|
225
|
+
"attachment.details.format": "Format",
|
|
226
|
+
"attachment.details.mimeType": "MIME type",
|
|
227
|
+
"attachment.details.name": "Name",
|
|
228
|
+
"attachment.details.pages": "Pages",
|
|
229
|
+
"attachment.details.private": "Private",
|
|
230
|
+
"attachment.details.size": "Size",
|
|
231
|
+
"attachment.details.sections": "Sections",
|
|
232
|
+
"attachment.details.slides": "Slides",
|
|
233
|
+
"attachment.details.storage": "Storage",
|
|
234
|
+
"attachment.details.technical": "Technical",
|
|
235
|
+
"attachment.details.title": "File details",
|
|
236
|
+
"attachment.details.type": "Type",
|
|
237
|
+
"attachment.details.uploaded": "Uploaded",
|
|
238
|
+
"attachment.details.uploadedBy": "Uploaded by",
|
|
239
|
+
"attachment.details.version": "Version",
|
|
240
|
+
"attachment.details.worksheets": "Worksheets",
|
|
241
|
+
"attachment.kind.image": "Image",
|
|
242
|
+
"attachment.kind.pdf": "PDF document",
|
|
243
|
+
"attachment.kind.presentation": "Presentation",
|
|
244
|
+
"attachment.kind.spreadsheet": "Spreadsheet",
|
|
245
|
+
"attachment.kind.unsupported": "File",
|
|
246
|
+
"attachment.kind.word": "Word document",
|
|
247
|
+
"attachment.detailsHide": "Hide file details",
|
|
248
|
+
"attachment.detailsShow": "Show file details",
|
|
249
|
+
"attachment.empty": "No file has been uploaded yet.",
|
|
250
|
+
"attachment.loadFailed": "The file could not be loaded. You can still export the original from the menu.",
|
|
251
|
+
"attachment.unsupported": "This file type cannot be previewed. You can still export the original from the menu.",
|
|
175
252
|
"nav.primary": "Primary navigation",
|
|
176
253
|
"nav.tools": "Tools",
|
|
177
254
|
"node.access": "Access",
|
|
178
255
|
"node.accessDetails": "Show access details ({count})",
|
|
179
|
-
"node.attachmentHelp": "The canonical file is stored privately in Intel. Its AI-readable projection is indexed separately.",
|
|
180
256
|
"node.changed": "Changed",
|
|
181
|
-
"node.download": "Download file",
|
|
182
|
-
"node.downloadFailed": "The attachment could not be downloaded. Check your access and try again.",
|
|
183
257
|
"node.email": "Email address",
|
|
184
258
|
"node.empty": "Nothing has been added yet.",
|
|
185
259
|
"node.folderEmpty": "Nothing in this folder yet. Create something with the plus in the sidebar.",
|
package/src/i18n/es.json
CHANGED
|
@@ -31,28 +31,76 @@
|
|
|
31
31
|
"archive.title": "Archivo",
|
|
32
32
|
"auth.signOut": "Cerrar sesión",
|
|
33
33
|
"auth.signOutFailed": "El cierre de sesión ha fallado. Comprueba tu conexión e inténtalo de nuevo.",
|
|
34
|
+
"board.add": "Añadir algo",
|
|
35
|
+
"board.add.due": "Vencimiento",
|
|
36
|
+
"board.add.label": "Etiqueta",
|
|
37
|
+
"board.add.start": "Inicio",
|
|
34
38
|
"board.addCard": "+ Tarea",
|
|
35
39
|
"board.addCardIn": "Añadir una tarea a {column}",
|
|
36
|
-
"board.
|
|
40
|
+
"board.addLabel": "Añadir etiqueta",
|
|
41
|
+
"board.addLink": "Vínculo",
|
|
42
|
+
"board.backTo": "Volver a {board}",
|
|
43
|
+
"board.cardLabel": "Abrir {title}, en {column}. Alt y una flecha la mueve.",
|
|
44
|
+
"board.clearAssignee": "Quitar la responsabilidad de {name}",
|
|
45
|
+
"board.column.archive": "Archivo",
|
|
37
46
|
"board.column.assignee": "Asignada a",
|
|
47
|
+
"board.column.default.backlog": "Backlog",
|
|
48
|
+
"board.column.default.doing": "En curso",
|
|
49
|
+
"board.column.default.done": "Hecho",
|
|
50
|
+
"board.column.default.todo": "Pendiente",
|
|
38
51
|
"board.column.dependsOn": "Espera a",
|
|
39
52
|
"board.column.due": "Vence",
|
|
40
53
|
"board.column.labels": "Etiquetas",
|
|
41
54
|
"board.column.status": "Columna",
|
|
42
55
|
"board.column.title": "Título",
|
|
43
|
-
"board.columnEmpty": "Aquí todavía no hay nada.",
|
|
44
56
|
"board.createFailed": "No se pudo crear la tarea.",
|
|
57
|
+
"board.crumbs": "Dónde está esta tarjeta",
|
|
58
|
+
"board.crumbsFolded": "Mostrar los niveles intermedios",
|
|
59
|
+
"board.drag.lifted": "{card} recogida",
|
|
60
|
+
"board.drag.moved": "{card} movida a {column}",
|
|
61
|
+
"board.drag.putBack": "{card} devuelta",
|
|
62
|
+
"board.dragInstructions": "Arrastra una tarjeta con el ratón para moverla. Sin puntero: mantén Alt y pulsa una flecha — izquierda y derecha cambian de columna, arriba y abajo mueven dentro de una.",
|
|
45
63
|
"board.failed": "No se pudo cargar este tablero.",
|
|
46
64
|
"board.filter.all": "Todas las columnas",
|
|
47
65
|
"board.filter.status": "Mostrar columna",
|
|
48
66
|
"board.filterEmpty": "Ninguna tarjeta coincide con este filtro.",
|
|
49
|
-
"board.
|
|
67
|
+
"board.fromDate": "desde {date}",
|
|
68
|
+
"board.group.empty": "Sin valor",
|
|
50
69
|
"board.group.none": "Nada",
|
|
51
|
-
"board.group.status": "Columna",
|
|
52
70
|
"board.groupBy": "Agrupar por",
|
|
71
|
+
"board.link.blocker": "Espera a",
|
|
72
|
+
"board.link.outside": "Fuera de este tablero",
|
|
73
|
+
"board.link.subtask": "Subtarea",
|
|
74
|
+
"board.links": "Vinculado",
|
|
75
|
+
"board.moveTo": "Mover a una columna",
|
|
76
|
+
"board.progress": "{done} de {total} hechas",
|
|
77
|
+
"board.removeLabel": "Quitar la etiqueta {label}",
|
|
78
|
+
"board.settings.addColumn": "+ Columna",
|
|
79
|
+
"board.settings.columnName": "Nombre de la columna {column}",
|
|
80
|
+
"board.settings.description": "Columnas y lo que muestra el tablero.",
|
|
81
|
+
"board.settings.duplicateName": "Dos columnas se llaman {column}. Los nombres deben distinguirlas.",
|
|
82
|
+
"board.settings.failed": "No se pudieron guardar los ajustes.",
|
|
83
|
+
"board.settings.moveDown": "Bajar {column}",
|
|
84
|
+
"board.settings.moveUp": "Subir {column}",
|
|
85
|
+
"board.settings.newColumn": "Nueva columna",
|
|
86
|
+
"board.settings.open": "Ajustes del tablero",
|
|
87
|
+
"board.settings.remove": "Quitar {column}",
|
|
88
|
+
"board.settings.removeBlocked": "{column} no está vacía. Mueve sus tarjetas primero.",
|
|
89
|
+
"board.settings.showArchive": "Mostrar la columna de archivo",
|
|
90
|
+
"board.settings.showArchiveHint": "Está en todos los tableros. Oculta, sus tarjetas desaparecen de todas las vistas.",
|
|
91
|
+
"board.settings.title": "Ajustes del tablero",
|
|
92
|
+
"board.stripes.root": "Nivel {level}, tiene subtareas",
|
|
93
|
+
"board.stripes.under": "Nivel {level} · superior en {column}",
|
|
94
|
+
"board.table.collapse": "Ocultar lo que hay bajo {row}",
|
|
95
|
+
"board.table.columns": "Columnas",
|
|
96
|
+
"board.table.expand": "Mostrar lo que hay bajo {row}",
|
|
97
|
+
"board.table.filteredBy": "solo {column}",
|
|
98
|
+
"board.table.groupedBy": "agrupado por {column}",
|
|
53
99
|
"board.tableEmpty": "Este tablero aún no tiene tarjetas.",
|
|
100
|
+
"board.taskGone": "Esta tarjeta ya no está en este tablero. O está archivada, o ya no existe.",
|
|
54
101
|
"board.unassigned": "Nadie todavía",
|
|
55
102
|
"board.unknownColumn": "no está en este tablero",
|
|
103
|
+
"board.untilDate": "vence {date}",
|
|
56
104
|
"board.view.kanban": "Kanban",
|
|
57
105
|
"board.view.table": "Tabla",
|
|
58
106
|
"common.cancel": "Cancelar",
|
|
@@ -172,14 +220,40 @@
|
|
|
172
220
|
"flows.validate": "Comprobar si se ejecutaría",
|
|
173
221
|
"flows.validateReady": "Este flujo empezaría ahora mismo.",
|
|
174
222
|
"flows.validateWhen": "Comprobado {when}. El acceso a las herramientas se pide cada vez con tu propio token, así que esta respuesta es una instantánea.",
|
|
223
|
+
"attachment.details.checksum": "Suma de comprobación",
|
|
224
|
+
"attachment.details.dimensions": "Dimensiones",
|
|
225
|
+
"attachment.details.format": "Formato",
|
|
226
|
+
"attachment.details.mimeType": "Tipo MIME",
|
|
227
|
+
"attachment.details.name": "Nombre",
|
|
228
|
+
"attachment.details.pages": "Páginas",
|
|
229
|
+
"attachment.details.private": "Privado",
|
|
230
|
+
"attachment.details.size": "Tamaño",
|
|
231
|
+
"attachment.details.sections": "Secciones",
|
|
232
|
+
"attachment.details.slides": "Diapositivas",
|
|
233
|
+
"attachment.details.storage": "Almacenamiento",
|
|
234
|
+
"attachment.details.technical": "Técnico",
|
|
235
|
+
"attachment.details.title": "Detalles del archivo",
|
|
236
|
+
"attachment.details.type": "Tipo",
|
|
237
|
+
"attachment.details.uploaded": "Subido",
|
|
238
|
+
"attachment.details.uploadedBy": "Subido por",
|
|
239
|
+
"attachment.details.version": "Versión",
|
|
240
|
+
"attachment.details.worksheets": "Hojas",
|
|
241
|
+
"attachment.kind.image": "Imagen",
|
|
242
|
+
"attachment.kind.pdf": "Documento PDF",
|
|
243
|
+
"attachment.kind.presentation": "Presentación",
|
|
244
|
+
"attachment.kind.spreadsheet": "Hoja de cálculo",
|
|
245
|
+
"attachment.kind.unsupported": "Archivo",
|
|
246
|
+
"attachment.kind.word": "Documento de Word",
|
|
247
|
+
"attachment.detailsHide": "Ocultar detalles del archivo",
|
|
248
|
+
"attachment.detailsShow": "Mostrar detalles del archivo",
|
|
249
|
+
"attachment.empty": "Todavía no se ha subido ningún archivo.",
|
|
250
|
+
"attachment.loadFailed": "No se pudo cargar el archivo. Aún puedes exportar el original desde el menú.",
|
|
251
|
+
"attachment.unsupported": "No se puede previsualizar este tipo de archivo. Aún puedes exportar el original desde el menú.",
|
|
175
252
|
"nav.primary": "Navegación principal",
|
|
176
253
|
"nav.tools": "Herramientas",
|
|
177
254
|
"node.access": "Acceso",
|
|
178
255
|
"node.accessDetails": "Mostrar detalles de acceso ({count})",
|
|
179
|
-
"node.attachmentHelp": "El archivo canónico se guarda en privado en Intel. Su proyección legible por la IA se indexa por separado.",
|
|
180
256
|
"node.changed": "Cambiado",
|
|
181
|
-
"node.download": "Descargar el archivo",
|
|
182
|
-
"node.downloadFailed": "El adjunto no se ha podido descargar. Comprueba tu acceso e inténtalo de nuevo.",
|
|
183
257
|
"node.email": "Dirección de correo",
|
|
184
258
|
"node.empty": "Todavía no se ha añadido nada.",
|
|
185
259
|
"node.folderEmpty": "En esta carpeta todavía no hay nada. Crea algo con el más de la barra lateral.",
|
package/src/nodes/nodes.tsx
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
1
|
+
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
3
2
|
import { useNavigate, useRouterState } from "@tanstack/react-router";
|
|
4
|
-
import { Download, Paperclip } from "lucide-react";
|
|
5
3
|
import { lazy, Suspense } from "react";
|
|
6
4
|
import { treeLevelKey } from "@/app/tree-move/tree-move.tsx";
|
|
7
5
|
import { ViewToggle } from "@/app/view-toggle/view-toggle.tsx";
|
|
8
6
|
import { BoardPanel } from "@/board/board-panel/board-panel.tsx";
|
|
7
|
+
import { BoardTitleRow } from "@/board/board-title-row/board-title-row.tsx";
|
|
9
8
|
import { RefusalNotice } from "@/data/request-refusal/refusal-notice.tsx";
|
|
10
9
|
import { refusalOf } from "@/data/request-refusal/request-refusal.ts";
|
|
11
10
|
import { FolderContents } from "@/folder-contents/folder-contents.tsx";
|
|
@@ -19,6 +18,9 @@ import { TitleRow, TitleRowFrame } from "@/title-row/title-row.tsx";
|
|
|
19
18
|
const NodeEditor = lazy(async () => ({
|
|
20
19
|
default: (await import("@/node-editor/node-editor.tsx")).NodeEditor,
|
|
21
20
|
}));
|
|
21
|
+
const AttachmentViewer = lazy(async () => ({
|
|
22
|
+
default: (await import("@/attachment-viewer/attachment-viewer.tsx")).AttachmentViewer,
|
|
23
|
+
}));
|
|
22
24
|
|
|
23
25
|
export function Nodes() {
|
|
24
26
|
const { data } = useIntelRouterContext();
|
|
@@ -138,13 +140,20 @@ export function Nodes() {
|
|
|
138
140
|
the search — where what applies everywhere stands. But a graph view does not apply
|
|
139
141
|
everywhere, it is a view onto THIS item. It is only drawn where there is a graph: on
|
|
140
142
|
a document it pointed at nothing. */}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
143
|
+
{/* ⚠️ A board brings its OWN title row, because an open card changes what the line
|
|
144
|
+
identifies: not the board any more, but where the card sits on it. It is the same
|
|
145
|
+
`TitleRow` underneath, only with a path in place of the name (#692). */}
|
|
146
|
+
{selected.kind === "board" ? (
|
|
147
|
+
<BoardTitleRow node={selected} />
|
|
148
|
+
) : (
|
|
149
|
+
<TitleRow
|
|
150
|
+
title={selected.title}
|
|
151
|
+
description={selected.description}
|
|
152
|
+
target={{ type: "node", node: selected }}
|
|
153
|
+
>
|
|
154
|
+
{graphable && <ViewToggle />}
|
|
155
|
+
</TitleRow>
|
|
156
|
+
)}
|
|
148
157
|
{graphable && selection.graph ? (
|
|
149
158
|
<GraphPane
|
|
150
159
|
query={relations}
|
|
@@ -158,7 +167,13 @@ export function Nodes() {
|
|
|
158
167
|
) : selected.kind === "folder" ? (
|
|
159
168
|
<FolderContents folderId={selected.id} />
|
|
160
169
|
) : selected.kind === "attachment" ? (
|
|
161
|
-
<
|
|
170
|
+
<Suspense
|
|
171
|
+
fallback={
|
|
172
|
+
<p className="p-6 text-sm text-muted-foreground">{i18n.t("common.loading")}</p>
|
|
173
|
+
}
|
|
174
|
+
>
|
|
175
|
+
<AttachmentViewer document={document.data} />
|
|
176
|
+
</Suspense>
|
|
162
177
|
) : selected.kind === "table" ? (
|
|
163
178
|
<NodeTablePanel node={selected} />
|
|
164
179
|
) : selected.kind === "board" ? (
|
|
@@ -186,44 +201,3 @@ export function Nodes() {
|
|
|
186
201
|
</TitleRowFrame>
|
|
187
202
|
);
|
|
188
203
|
}
|
|
189
|
-
|
|
190
|
-
function AttachmentPanel({ node }: { node: Node }) {
|
|
191
|
-
const { data } = useIntelRouterContext();
|
|
192
|
-
const i18n = useI18n();
|
|
193
|
-
const download = useMutation({
|
|
194
|
-
mutationFn: () => data.getNodeAttachment(node.id),
|
|
195
|
-
onSuccess: (blob) => {
|
|
196
|
-
const url = URL.createObjectURL(blob);
|
|
197
|
-
const anchor = document.createElement("a");
|
|
198
|
-
anchor.href = url;
|
|
199
|
-
anchor.download = node.title;
|
|
200
|
-
document.body.append(anchor);
|
|
201
|
-
anchor.click();
|
|
202
|
-
anchor.remove();
|
|
203
|
-
setTimeout(() => URL.revokeObjectURL(url), 0);
|
|
204
|
-
},
|
|
205
|
-
});
|
|
206
|
-
return (
|
|
207
|
-
<div className="grid flex-1 place-items-center p-8">
|
|
208
|
-
<div className="max-w-md rounded-xl border bg-background p-8 text-center shadow-sm">
|
|
209
|
-
<Paperclip aria-hidden="true" className="mx-auto size-10 text-primary" />
|
|
210
|
-
<h3 className="mt-4 font-semibold">{node.title}</h3>
|
|
211
|
-
<p className="mt-2 text-sm text-muted-foreground">{i18n.t("node.attachmentHelp")}</p>
|
|
212
|
-
<button
|
|
213
|
-
type="button"
|
|
214
|
-
onClick={() => download.mutate()}
|
|
215
|
-
disabled={download.isPending}
|
|
216
|
-
className="mt-5 inline-flex items-center gap-2 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50"
|
|
217
|
-
>
|
|
218
|
-
<Download aria-hidden="true" className="size-4" />
|
|
219
|
-
{download.isPending ? i18n.t("common.loading") : i18n.t("node.download")}
|
|
220
|
-
</button>
|
|
221
|
-
{download.isError ? (
|
|
222
|
-
<p role="alert" className="mt-4 text-sm text-destructive">
|
|
223
|
-
{i18n.t("node.downloadFailed")}
|
|
224
|
-
</p>
|
|
225
|
-
) : null}
|
|
226
|
-
</div>
|
|
227
|
-
</div>
|
|
228
|
-
);
|
|
229
|
-
}
|
|
@@ -239,19 +239,25 @@ export function ResourceMenu({
|
|
|
239
239
|
},
|
|
240
240
|
});
|
|
241
241
|
|
|
242
|
-
//
|
|
243
|
-
//
|
|
244
|
-
//
|
|
245
|
-
const
|
|
246
|
-
mutationFn: async () =>
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
242
|
+
// An attachment already is one original file. Every structured Intel resource needs the bundle
|
|
243
|
+
// that carries its type and relationships, but wrapping uploaded bytes in a zip would make the
|
|
244
|
+
// one Export entry give a person something other than what they put in (#699).
|
|
245
|
+
const exportResource = useMutation({
|
|
246
|
+
mutationFn: async () => {
|
|
247
|
+
if (node?.kind === "attachment") {
|
|
248
|
+
return { blob: await data.getNodeAttachment(node.id), filename: title };
|
|
249
|
+
}
|
|
250
|
+
const blob =
|
|
251
|
+
target.type === "flow"
|
|
252
|
+
? await data.exportFlowBundle(target.flow.id)
|
|
253
|
+
: await data.exportNodeBundle(target.node.id);
|
|
254
|
+
return { blob, filename: `${title}.zip` };
|
|
255
|
+
},
|
|
256
|
+
onSuccess: ({ blob, filename }) => {
|
|
251
257
|
const url = URL.createObjectURL(blob);
|
|
252
258
|
const anchor = document.createElement("a");
|
|
253
259
|
anchor.href = url;
|
|
254
|
-
anchor.download =
|
|
260
|
+
anchor.download = filename;
|
|
255
261
|
document.body.append(anchor);
|
|
256
262
|
anchor.click();
|
|
257
263
|
anchor.remove();
|
|
@@ -326,7 +332,7 @@ export function ResourceMenu({
|
|
|
326
332
|
`excluded` in the zip's `manifest.json` and `BundleImportResult.excluded` after an
|
|
327
333
|
import, both of which are read only once the zip exists. That is a deliberate trade,
|
|
328
334
|
recorded in ADR-0006 and in #636, and NOT a leftover to be restored. */}
|
|
329
|
-
<DropdownMenuItem onSelect={() =>
|
|
335
|
+
<DropdownMenuItem onSelect={() => exportResource.mutate()}>
|
|
330
336
|
<FolderDown aria-hidden="true" />
|
|
331
337
|
{i18n.t("resource.export")}
|
|
332
338
|
</DropdownMenuItem>
|
|
@@ -392,7 +398,7 @@ export function ResourceMenu({
|
|
|
392
398
|
) : null}
|
|
393
399
|
{/* Its own sentence, not `resourceErrorKey`'s: nothing was changed, something failed to
|
|
394
400
|
arrive, and "the change was not saved" would send the reader looking for a change. */}
|
|
395
|
-
{
|
|
401
|
+
{exportResource.isError ? <MenuFailure>{i18n.t("resource.exportFailed")}</MenuFailure> : null}
|
|
396
402
|
{/* The import's own sentence, and its own pickers — only where the entry exists, because two
|
|
397
403
|
file inputs on every document's menu would be two elements nothing can ever open. */}
|
|
398
404
|
{bundleImport.isError ? <MenuFailure>{i18n.t("tree.importFailed")}</MenuFailure> : null}
|
|
@@ -7,6 +7,14 @@ export type IntelView = (typeof IntelViews)[number];
|
|
|
7
7
|
export type SelectionSearch = Record<string, unknown> & {
|
|
8
8
|
select?: string;
|
|
9
9
|
view?: Exclude<IntelView, "editor">;
|
|
10
|
+
/**
|
|
11
|
+
* The card of the selected board that is open, by its node id.
|
|
12
|
+
*
|
|
13
|
+
* ⚠️ **Beside `select`, not instead of it.** A task is not a level of the tree the sidebar can
|
|
14
|
+
* select; it is something shown INSIDE the board that is selected. Carrying it as `select` would
|
|
15
|
+
* make the tree try to reveal a node it does not draw, and the back button would leave the board.
|
|
16
|
+
*/
|
|
17
|
+
task?: string;
|
|
10
18
|
};
|
|
11
19
|
|
|
12
20
|
// One search parameter carries "open this one" into an area: the header search names a hit, the
|
|
@@ -20,10 +28,12 @@ export type SelectionSearch = Record<string, unknown> & {
|
|
|
20
28
|
// ⚠️ Unknown parameters are passed through rather than dropped. The portal's connect flow returns
|
|
21
29
|
// to `/tools` with its own marker, and a validator that kept only what it knows would delete it.
|
|
22
30
|
export function selectionSearch(search: Record<string, unknown>): SelectionSearch {
|
|
23
|
-
const { select, view, ...rest } = search;
|
|
31
|
+
const { select, view, task, ...rest } = search;
|
|
24
32
|
const withSelect =
|
|
25
33
|
typeof select === "string" && select.length > 0 ? { ...rest, select } : { ...rest };
|
|
26
|
-
|
|
34
|
+
const withTask =
|
|
35
|
+
typeof task === "string" && task.length > 0 ? { ...withSelect, task } : withSelect;
|
|
36
|
+
return view === "graph" || view === "runs" ? { ...withTask, view } : withTask;
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
// Screens are lazy route components with no route object at hand, so they read the parameter off
|
|
@@ -41,3 +51,8 @@ export function viewFrom(search: unknown): IntelView {
|
|
|
41
51
|
export function graphViewFrom(search: unknown): boolean {
|
|
42
52
|
return viewFrom(search) === "graph";
|
|
43
53
|
}
|
|
54
|
+
|
|
55
|
+
export function openTaskFrom(search: unknown): string | null {
|
|
56
|
+
const task = (search as { task?: unknown } | null)?.task;
|
|
57
|
+
return typeof task === "string" && task.length > 0 ? task : null;
|
|
58
|
+
}
|