@securancy/file-explorer 1.0.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 (36) hide show
  1. package/README.md +7 -0
  2. package/default-styling.pcss +39 -0
  3. package/dist/components/FileExplorer.svelte +443 -0
  4. package/dist/components/FileExplorer.svelte.d.ts +63 -0
  5. package/dist/components/FileExplorerBreadcrumb.svelte +263 -0
  6. package/dist/components/FileExplorerBreadcrumb.svelte.d.ts +18 -0
  7. package/dist/components/FileExplorerCreateDirectory.svelte +77 -0
  8. package/dist/components/FileExplorerCreateDirectory.svelte.d.ts +24 -0
  9. package/dist/components/FileExplorerDirectoryColumn.svelte +456 -0
  10. package/dist/components/FileExplorerDirectoryColumn.svelte.d.ts +39 -0
  11. package/dist/components/FileExplorerDirectoryIndex.svelte +367 -0
  12. package/dist/components/FileExplorerDirectoryIndex.svelte.d.ts +33 -0
  13. package/dist/components/FileExplorerDisplayModeSwitcher.svelte +300 -0
  14. package/dist/components/FileExplorerDisplayModeSwitcher.svelte.d.ts +19 -0
  15. package/dist/components/FileExplorerFileDetailColumn.svelte +340 -0
  16. package/dist/components/FileExplorerFileDetailColumn.svelte.d.ts +24 -0
  17. package/dist/components/FileIcon.svelte +310 -0
  18. package/dist/components/FileIcon.svelte.d.ts +19 -0
  19. package/dist/file-explorer.pcss +304 -0
  20. package/dist/index.d.ts +3 -0
  21. package/dist/index.js +2 -0
  22. package/dist/models/file-explorer-display-mode.d.ts +4 -0
  23. package/dist/models/file-explorer-display-mode.js +5 -0
  24. package/dist/models/file-item.d.ts +23 -0
  25. package/dist/models/file-item.js +1 -0
  26. package/dist/models/index.d.ts +3 -0
  27. package/dist/models/index.js +3 -0
  28. package/dist/models/translations.d.ts +19 -0
  29. package/dist/models/translations.js +17 -0
  30. package/dist/utilities/file-utilities.d.ts +8 -0
  31. package/dist/utilities/file-utilities.js +49 -0
  32. package/dist/utilities/index.d.ts +1 -0
  33. package/dist/utilities/index.js +1 -0
  34. package/dist/validation/file-upload-schema.d.ts +2 -0
  35. package/dist/validation/file-upload-schema.js +2 -0
  36. package/package.json +72 -0
@@ -0,0 +1,263 @@
1
+ <script>export let filePath;
2
+ </script>
3
+
4
+ <!-- @todo make it clickable -->
5
+ <div class="file-explorer__breadcrumb">
6
+ {filePath}
7
+ </div>
8
+
9
+ <style>/* eslint-disable */
10
+ /**
11
+ * Media queries and devices
12
+ */
13
+ /**
14
+ * Some mixins that can be used dynamically inside @each loops
15
+ */
16
+ .file-explorer {
17
+ position: relative;
18
+ display: flex;
19
+ flex-direction: column;
20
+ height: 100%;
21
+ width: 100%;
22
+ background: var(--file-explorer-background);
23
+ overflow: hidden;
24
+ }
25
+ .file-explorer__controls {
26
+ flex-shrink: 0;
27
+ display: flex;
28
+ border-bottom: var(--file-explorer-border-style);
29
+ padding: var(--file-explorer-default-spacing);
30
+ background: var(--file-explorer-background-shade);
31
+ }
32
+ .file-explorer__content {
33
+ flex-grow: 1;
34
+ display: flex;
35
+ overflow-x: auto;
36
+ scroll-behavior: smooth;
37
+ }
38
+ /* Keep the index within screen */
39
+ @media (width >= 769px) {
40
+ /* @formatter:off */
41
+ .file-explorer--display-mode-index .file-explorer__content {
42
+ /* @formatter:on */
43
+ overflow-x: inherit;
44
+ }
45
+ }
46
+ .file-explorer__column, .file-explorer__index {
47
+ flex-shrink: 0;
48
+ border-right: var(--file-explorer-border-style);
49
+ background: var(--file-explorer-background);
50
+ }
51
+ .file-explorer__column {
52
+ display: flex;
53
+ flex-direction: column;
54
+ width: var(--file-explorer-column-default-width);
55
+ min-width: var(--file-explorer-column-min-width);
56
+ overflow: hidden;
57
+ }
58
+ .file-explorer__column--file-detail {
59
+ flex-grow: 1;
60
+ width: var(--file-explorer-preview-default-width);
61
+ display: flex;
62
+ flex-direction: column;
63
+ }
64
+ .file-explorer__column--sticky {
65
+ position: sticky;
66
+ left: 0;
67
+ z-index: 1;
68
+ }
69
+ .file-explorer__column::after {
70
+ content: '';
71
+ position: absolute;
72
+ inset: 0;
73
+ pointer-events: none;
74
+ transition: background-color 0.2s ease-in-out;
75
+ }
76
+ .file-explorer__column--dragover {
77
+ cursor: copy;
78
+ }
79
+ .file-explorer__column--dragover::after {
80
+ pointer-events: all;
81
+ background-color: var(--file-explorer-background-dragover);
82
+ }
83
+ .file-explorer__index {
84
+ display: flex;
85
+ flex-direction: column;
86
+ width: var(--file-explorer-index-default-width);
87
+ overflow: hidden;
88
+ }
89
+ @media (width >= 769px) {
90
+ .file-explorer__index {
91
+ flex-shrink: 1
92
+ }
93
+ }
94
+ .file-explorer__index--hidden {
95
+ display: none;
96
+ }
97
+ .file-explorer__column-scroll-container, .file-explorer__index-scroll-container {
98
+ flex-grow: 1;
99
+ overflow-y: auto;
100
+ padding: calc(var(--file-explorer-default-spacing) * 1.5) var(--file-explorer-default-spacing) 0 var(--file-explorer-default-spacing);
101
+ }
102
+ .file-explorer__grid {
103
+ display: flex;
104
+ align-items: flex-start;
105
+ flex-wrap: wrap;
106
+ gap: var(--file-explorer-default-spacing);
107
+ }
108
+ .file-explorer__breadcrumb {
109
+ /* @todo */
110
+ }
111
+ .file-explorer__display-mode-switcher {
112
+ display: flex;
113
+ gap: calc(0.5 * var(--file-explorer-default-spacing));
114
+ margin-left: auto;
115
+ }
116
+ .file-explorer__search {
117
+ margin-bottom: var(--file-explorer-default-spacing);
118
+ padding: calc(var(--file-explorer-default-spacing) * 1.5) var(--file-explorer-default-spacing) 0 var(--file-explorer-default-spacing);
119
+ }
120
+ .file-explorer__list {
121
+ margin-bottom: var(--file-explorer-default-spacing);
122
+ }
123
+ .file-explorer__list-header {
124
+ display: flex;
125
+ justify-content: space-between;
126
+ gap: calc(0.5 * var(--file-explorer-default-spacing));
127
+ width: 100%;
128
+ margin-bottom: calc(0.5 * var(--file-explorer-default-spacing));
129
+ color: var(--file-explorer-list-header-color);
130
+ }
131
+ .file-explorer__list-header span {
132
+ overflow: hidden;
133
+ white-space: nowrap;
134
+ text-overflow: ellipsis;
135
+ }
136
+ .file-explorer__list-header button {
137
+ flex-shrink: 0;
138
+ color: var(--file-explorer-action-primary-color);
139
+ cursor: pointer;
140
+ }
141
+ .file-explorer__grid-header {
142
+ width: 100%;
143
+ }
144
+ .file-explorer__grid-header button {
145
+ color: var(--file-explorer-action-primary-color);
146
+ cursor: pointer;
147
+ }
148
+ .file-explorer__list-item, .file-explorer__grid-item {
149
+ border-radius: var(--file-explorer-list-item-border-radius);
150
+ background: none;
151
+ color: var(--file-explorer-list-item-color);
152
+ }
153
+ .file-explorer__list-item > :global(i), .file-explorer__grid-item > :global(i) {
154
+ flex-shrink: 0;
155
+ }
156
+ .file-explorer__list-item:not(.file-explorer__list-item--active):hover, .file-explorer__grid-item:not(.file-explorer__grid-item--active):hover {
157
+ background: var(--file-explorer-list-item-background-hover);
158
+ }
159
+ .file-explorer__list-item--active, .file-explorer__grid-item--active {
160
+ color: var(--file-explorer-list-item-color-active);
161
+ background: var(--file-explorer-list-item-background-active);
162
+ }
163
+ .file-explorer__grid-item {
164
+ display: flex;
165
+ flex-direction: column;
166
+ align-items: center;
167
+
168
+ /* 3 items in a grid, spaced out with default spacing means the width of 2 gaps must be subtracted from width */
169
+ width: calc(33.33% - (0.6666 * var(--file-explorer-default-spacing)));
170
+ padding: 5px 2px;
171
+ }
172
+ @media (width >= 769px) {
173
+ .file-explorer__grid-item {
174
+ width: 100px
175
+ }
176
+ }
177
+ .file-explorer__grid-item--active {
178
+ /* @todo */
179
+ }
180
+ .file-explorer__grid-item > span {
181
+ word-break: break-word;
182
+ margin-top: calc(0.25 * var(--file-explorer-default-spacing));
183
+ }
184
+ .file-explorer__list-item {
185
+ display: flex;
186
+ align-items: baseline;
187
+ width: 100%;
188
+ text-align: left;
189
+ padding: var(--file-explorer-list-item-spacing);
190
+ white-space: nowrap;
191
+ overflow: hidden;
192
+ text-overflow: ellipsis;
193
+ }
194
+ .file-explorer__list-item > span {
195
+ flex-grow: 1;
196
+ min-width: 0;
197
+ overflow: hidden;
198
+ text-overflow: ellipsis;
199
+ }
200
+ .file-explorer__list-item > :global(i:first-child) {
201
+ margin-right: var(--file-explorer-list-item-spacing);
202
+ }
203
+ .file-explorer__list-item > :global(i:last-child) {
204
+ margin-left: var(--file-explorer-list-item-spacing);
205
+ }
206
+ .file-explorer__message {
207
+ display: block;
208
+ padding: var(--file-explorer-list-item-spacing) 0;
209
+ color: var(--file-explorer-message-color);
210
+ }
211
+ .file-explorer__image-preview {
212
+ max-width: 100%;
213
+ margin: 0 auto;
214
+ }
215
+ .file-explorer-preview__title {
216
+ font-size: var(--font-size--h1);
217
+ font-weight: var(--font-weight--semi-bold);
218
+ overflow: hidden;
219
+ text-overflow: ellipsis;
220
+ white-space: nowrap;
221
+ }
222
+ .file-explorer-preview__download {
223
+ color: var(--file-explorer-action-primary-color);
224
+ font-weight: var(--font-weight--semi-bold);
225
+ }
226
+ .file-explorer-preview__download:hover {
227
+ text-decoration-line: underline;
228
+ }
229
+ .file-explorer-preview__info {
230
+ margin-top: 14px;
231
+ }
232
+ .file-explorer-preview__info span {
233
+ color: var(--file-explorer-message-color);
234
+ }
235
+ .file-explorer-preview__info button {
236
+ cursor: pointer;
237
+ }
238
+ .file-explorer__scroll-back-button {
239
+ position: fixed;
240
+ bottom: var(--file-explorer-default-spacing);
241
+ right: var(--file-explorer-default-spacing);
242
+ z-index: 2;
243
+ background: var(--file-explorer-action-primary-color);
244
+ color: var(--file-explorer-action-primary-color-contrast);
245
+ padding: var(--file-explorer-list-item-spacing);
246
+ border-radius: var(--file-explorer-list-item-border-radius);
247
+ }
248
+ .file-explorer__file-icon--large {
249
+ width: 100%;
250
+ text-align: center;
251
+ padding: calc(2 * var(--file-explorer-default-spacing));
252
+ }
253
+ .file-explorer__file-icon--large :global(i) {
254
+ font-size: var(--file-explorer-preview-icon-size);
255
+ }
256
+ .file-explorer__text--semi-bold {
257
+ font-weight: var(--file-explorer-text-semi-bold);
258
+ }
259
+ .file-explorer__loader {
260
+ display: flex;
261
+ justify-content: center;
262
+ }
263
+ </style>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ filePath: string;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {};
10
+ exports?: {} | undefined;
11
+ bindings?: string | undefined;
12
+ };
13
+ export type FileExplorerBreadcrumbProps = typeof __propDef.props;
14
+ export type FileExplorerBreadcrumbEvents = typeof __propDef.events;
15
+ export type FileExplorerBreadcrumbSlots = typeof __propDef.slots;
16
+ export default class FileExplorerBreadcrumb extends SvelteComponent<FileExplorerBreadcrumbProps, FileExplorerBreadcrumbEvents, FileExplorerBreadcrumbSlots> {
17
+ }
18
+ export {};
@@ -0,0 +1,77 @@
1
+ <script>import { Button, FormElement, Modal } from "@securancy/svelte-components";
2
+ export let createDirectoryPath;
3
+ export let createDirectoryModalOpen = false;
4
+ export let documents;
5
+ export let createDirectory;
6
+ export let translations;
7
+ let request;
8
+ let submitting = false;
9
+ let input = void 0;
10
+ initDocumentUpload();
11
+ $: if (createDirectoryModalOpen) initDocumentUpload();
12
+ $: if (input) input.focus();
13
+ function initDocumentUpload() {
14
+ request = {
15
+ path: createDirectoryPath,
16
+ name: ""
17
+ };
18
+ }
19
+ async function submitFiles() {
20
+ submitting = true;
21
+ await createDirectory(request).then(() => {
22
+ createDirectoryModalOpen = false;
23
+ }).finally(() => {
24
+ submitting = false;
25
+ });
26
+ documents.refresh();
27
+ }
28
+ </script>
29
+
30
+ <Modal
31
+ title="Create new directory"
32
+ bind:opened={createDirectoryModalOpen}
33
+ >
34
+ <div class="create-directory">
35
+ <span class="create-directory__path">{createDirectoryPath}/</span>
36
+ <FormElement clearable>
37
+ <input bind:this={input} bind:value={request.name}>
38
+ </FormElement>
39
+ </div>
40
+ <svelte:fragment slot="footer">
41
+ <Button
42
+ color="soft"
43
+ fill="clear"
44
+ on:click={() => createDirectoryModalOpen = false}
45
+ >
46
+ {translations.cancel}
47
+ </Button>
48
+ <Button
49
+ disabled={(!request.path || request.path.length === 0) || submitting}
50
+ on:click={submitFiles}
51
+ >
52
+ {#if submitting}
53
+ {translations.creating}
54
+ {:else}
55
+ {translations.create}
56
+ {/if}
57
+ </Button>
58
+ </svelte:fragment>
59
+ </Modal>
60
+
61
+ <style>
62
+ .create-directory {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 8px;
66
+ }
67
+
68
+ .create-directory__path {
69
+ white-space: nowrap;
70
+ }
71
+
72
+ .create-directory input {
73
+ border: 1px solid var(--file-explorer-create-directory-border);
74
+ border-radius: var(--file-explorer-create-directory-border-radius);
75
+ padding: 10px;
76
+ }
77
+ </style>
@@ -0,0 +1,24 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { Refreshable } from '@securancy/svelte-utilities';
3
+ import type { CreateDirectoryRequest, DocumentTranslations, FileSystemItem } from '../models/index.js';
4
+ declare const __propDef: {
5
+ props: {
6
+ createDirectoryPath: string;
7
+ createDirectoryModalOpen?: boolean;
8
+ documents: Refreshable<FileSystemItem[]>;
9
+ createDirectory: (request: CreateDirectoryRequest) => Promise<void>;
10
+ translations: DocumentTranslations;
11
+ };
12
+ events: {
13
+ [evt: string]: CustomEvent<any>;
14
+ };
15
+ slots: {};
16
+ exports?: {} | undefined;
17
+ bindings?: string | undefined;
18
+ };
19
+ export type FileExplorerCreateDirectoryProps = typeof __propDef.props;
20
+ export type FileExplorerCreateDirectoryEvents = typeof __propDef.events;
21
+ export type FileExplorerCreateDirectorySlots = typeof __propDef.slots;
22
+ export default class FileExplorerCreateDirectory extends SvelteComponent<FileExplorerCreateDirectoryProps, FileExplorerCreateDirectoryEvents, FileExplorerCreateDirectorySlots> {
23
+ }
24
+ export {};