@prozilla-os/file-explorer 1.1.16 → 1.1.17
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/LICENSE +20 -20
- package/README.md +105 -105
- package/dist/main.js +175 -169
- package/dist/main.js.map +1 -1
- package/package.json +3 -3
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2023 Sieben De Beule
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Sieben De Beule
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
<br />
|
|
3
|
-
<p>
|
|
4
|
-
<a href="https://os.prozilla.dev/"><img src="https://os.prozilla.dev/assets/logo.svg?v=2" height="200" alt="ProzillaOS" /></a>
|
|
5
|
-
</p>
|
|
6
|
-
<p>
|
|
7
|
-
<a href="https://github.com/prozilla-os/ProzillaOS/blob/main/LICENSE.md"><img alt="License" src="https://img.shields.io/github/license/Prozilla/ProzillaOS?style=flat-square&color=FF4D5B&label=License"></a>
|
|
8
|
-
<a href="https://github.com/prozilla-os/ProzillaOS"><img alt="Stars" src="https://img.shields.io/github/stars/Prozilla/ProzillaOS?style=flat-square&color=FED24C&label=%E2%AD%90"></a>
|
|
9
|
-
<a href="https://github.com/prozilla-os/ProzillaOS"><img alt="Forks" src="https://img.shields.io/github/forks/Prozilla/ProzillaOS?style=flat-square&color=4D9CFF&label=Forks&logo=github"></a>
|
|
10
|
-
<a href="https://www.npmjs.com/package/prozilla-os"><img alt="NPM Version" src="https://img.shields.io/npm/v/prozilla-os?logo=npm&style=flat-square&label=prozilla-os&color=FF4D5B"></a>
|
|
11
|
-
</p>
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
## About
|
|
15
|
-
|
|
16
|
-
`@prozilla-os/file-explorer` is a standard ProzillaOS application for browsing files.
|
|
17
|
-
|
|
18
|
-
## Installation
|
|
19
|
-
|
|
20
|
-
`@prozilla-os/core` is required to run this application.
|
|
21
|
-
|
|
22
|
-
```sh
|
|
23
|
-
npm install @prozilla-os/core @prozilla-os/file-explorer
|
|
24
|
-
yarn add @prozilla-os/core @prozilla-os/file-explorer
|
|
25
|
-
pnpm add @prozilla-os/core @prozilla-os/file-explorer
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Usage
|
|
29
|
-
|
|
30
|
-
### Basic setup
|
|
31
|
-
|
|
32
|
-
```tsx
|
|
33
|
-
import { Desktop, ModalsView, ProzillaOS, Taskbar, WindowsView, AppsConfig } from "@prozilla-os/core";
|
|
34
|
-
import { fileExplorer } from "@prozilla-os/file-explorer";
|
|
35
|
-
|
|
36
|
-
function App() {
|
|
37
|
-
return (
|
|
38
|
-
<ProzillaOS
|
|
39
|
-
systemName="Example"
|
|
40
|
-
tagLine="Powered by ProzillaOS"
|
|
41
|
-
config={{
|
|
42
|
-
apps: new AppsConfig({
|
|
43
|
-
apps: [ fileExplorer ]
|
|
44
|
-
})
|
|
45
|
-
}}
|
|
46
|
-
>
|
|
47
|
-
<Taskbar/>
|
|
48
|
-
<WindowsView/>
|
|
49
|
-
<ModalsView/>
|
|
50
|
-
<Desktop/>
|
|
51
|
-
</ProzillaOS>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Window options
|
|
57
|
-
|
|
58
|
-
```tsx
|
|
59
|
-
/**
|
|
60
|
-
* Initial path that the app will open
|
|
61
|
-
* @default "~" - Home directory
|
|
62
|
-
*/
|
|
63
|
-
path: string;
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Defines in which mode the application is running
|
|
67
|
-
* 0: None
|
|
68
|
-
* 1: Single
|
|
69
|
-
* 2: Multiple
|
|
70
|
-
* @default 0
|
|
71
|
-
*/
|
|
72
|
-
selectorMode: number;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Footer component that will be displayed when `selectorMode` != 0
|
|
76
|
-
* Can be used to display a list of selected files for example
|
|
77
|
-
*/
|
|
78
|
-
Footer: React.FC;
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Gets called each time the selection changes if `selectorMode` != 0
|
|
82
|
-
*/
|
|
83
|
-
onSelectionChange: (params: OnSelectionChangeParams) => void;
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Gets called when the selection is finished if `selectorMode` != 0
|
|
87
|
-
*/
|
|
88
|
-
onSelectionFinish: Function;
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Links
|
|
92
|
-
|
|
93
|
-
- [Demo][demo]
|
|
94
|
-
- [Docs][docs]
|
|
95
|
-
- [GitHub][github]
|
|
96
|
-
- [npm][npm]
|
|
97
|
-
- [Discord][discord]
|
|
98
|
-
- [Ko-fi][ko-fi]
|
|
99
|
-
|
|
100
|
-
[demo]: https://os.prozilla.dev/file-explorer
|
|
101
|
-
[docs]: https://os.prozilla.dev/docs/reference/apps/file-explorer
|
|
102
|
-
[github]: https://github.com/prozilla-os/ProzillaOS/tree/main/packages/apps/file-explorer
|
|
103
|
-
[npm]: https://www.npmjs.com/package/@prozilla-os/file-explorer
|
|
104
|
-
[discord]: https://discord.gg/JwbyQP4tdz
|
|
105
|
-
[ko-fi]: https://ko-fi.com/prozilla
|
|
1
|
+
<div align="center">
|
|
2
|
+
<br />
|
|
3
|
+
<p>
|
|
4
|
+
<a href="https://os.prozilla.dev/"><img src="https://os.prozilla.dev/assets/logo.svg?v=2" height="200" alt="ProzillaOS" /></a>
|
|
5
|
+
</p>
|
|
6
|
+
<p>
|
|
7
|
+
<a href="https://github.com/prozilla-os/ProzillaOS/blob/main/LICENSE.md"><img alt="License" src="https://img.shields.io/github/license/Prozilla/ProzillaOS?style=flat-square&color=FF4D5B&label=License"></a>
|
|
8
|
+
<a href="https://github.com/prozilla-os/ProzillaOS"><img alt="Stars" src="https://img.shields.io/github/stars/Prozilla/ProzillaOS?style=flat-square&color=FED24C&label=%E2%AD%90"></a>
|
|
9
|
+
<a href="https://github.com/prozilla-os/ProzillaOS"><img alt="Forks" src="https://img.shields.io/github/forks/Prozilla/ProzillaOS?style=flat-square&color=4D9CFF&label=Forks&logo=github"></a>
|
|
10
|
+
<a href="https://www.npmjs.com/package/prozilla-os"><img alt="NPM Version" src="https://img.shields.io/npm/v/prozilla-os?logo=npm&style=flat-square&label=prozilla-os&color=FF4D5B"></a>
|
|
11
|
+
</p>
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
## About
|
|
15
|
+
|
|
16
|
+
`@prozilla-os/file-explorer` is a standard ProzillaOS application for browsing files.
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
`@prozilla-os/core` is required to run this application.
|
|
21
|
+
|
|
22
|
+
```sh
|
|
23
|
+
npm install @prozilla-os/core @prozilla-os/file-explorer
|
|
24
|
+
yarn add @prozilla-os/core @prozilla-os/file-explorer
|
|
25
|
+
pnpm add @prozilla-os/core @prozilla-os/file-explorer
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Usage
|
|
29
|
+
|
|
30
|
+
### Basic setup
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
import { Desktop, ModalsView, ProzillaOS, Taskbar, WindowsView, AppsConfig } from "@prozilla-os/core";
|
|
34
|
+
import { fileExplorer } from "@prozilla-os/file-explorer";
|
|
35
|
+
|
|
36
|
+
function App() {
|
|
37
|
+
return (
|
|
38
|
+
<ProzillaOS
|
|
39
|
+
systemName="Example"
|
|
40
|
+
tagLine="Powered by ProzillaOS"
|
|
41
|
+
config={{
|
|
42
|
+
apps: new AppsConfig({
|
|
43
|
+
apps: [ fileExplorer ]
|
|
44
|
+
})
|
|
45
|
+
}}
|
|
46
|
+
>
|
|
47
|
+
<Taskbar/>
|
|
48
|
+
<WindowsView/>
|
|
49
|
+
<ModalsView/>
|
|
50
|
+
<Desktop/>
|
|
51
|
+
</ProzillaOS>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Window options
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
/**
|
|
60
|
+
* Initial path that the app will open
|
|
61
|
+
* @default "~" - Home directory
|
|
62
|
+
*/
|
|
63
|
+
path: string;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Defines in which mode the application is running
|
|
67
|
+
* 0: None
|
|
68
|
+
* 1: Single
|
|
69
|
+
* 2: Multiple
|
|
70
|
+
* @default 0
|
|
71
|
+
*/
|
|
72
|
+
selectorMode: number;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Footer component that will be displayed when `selectorMode` != 0
|
|
76
|
+
* Can be used to display a list of selected files for example
|
|
77
|
+
*/
|
|
78
|
+
Footer: React.FC;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Gets called each time the selection changes if `selectorMode` != 0
|
|
82
|
+
*/
|
|
83
|
+
onSelectionChange: (params: OnSelectionChangeParams) => void;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Gets called when the selection is finished if `selectorMode` != 0
|
|
87
|
+
*/
|
|
88
|
+
onSelectionFinish: Function;
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Links
|
|
92
|
+
|
|
93
|
+
- [Demo][demo]
|
|
94
|
+
- [Docs][docs]
|
|
95
|
+
- [GitHub][github]
|
|
96
|
+
- [npm][npm]
|
|
97
|
+
- [Discord][discord]
|
|
98
|
+
- [Ko-fi][ko-fi]
|
|
99
|
+
|
|
100
|
+
[demo]: https://os.prozilla.dev/file-explorer
|
|
101
|
+
[docs]: https://os.prozilla.dev/docs/reference/apps/file-explorer
|
|
102
|
+
[github]: https://github.com/prozilla-os/ProzillaOS/tree/main/packages/apps/file-explorer
|
|
103
|
+
[npm]: https://www.npmjs.com/package/@prozilla-os/file-explorer
|
|
104
|
+
[discord]: https://discord.gg/JwbyQP4tdz
|
|
105
|
+
[ko-fi]: https://ko-fi.com/prozilla
|
package/dist/main.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var
|
|
2
|
-
import { utilStyles as
|
|
3
|
-
import { jsxs as
|
|
4
|
-
import { useState as S, useCallback as
|
|
5
|
-
import { FontAwesomeIcon as
|
|
6
|
-
import { faDownload as
|
|
7
|
-
const
|
|
8
|
-
FileExplorer:
|
|
9
|
-
Header:
|
|
10
|
-
IconButton:
|
|
11
|
-
PathInput:
|
|
12
|
-
Body:
|
|
13
|
-
Sidebar:
|
|
14
|
-
NavButton:
|
|
15
|
-
Main:
|
|
16
|
-
Footer:
|
|
17
|
-
Selector:
|
|
1
|
+
(function(){"use strict";try{if(typeof document<"u"){var r=document.createElement("style");r.appendChild(document.createTextNode('._FileExplorer_lr5mr_1{--header-height: 3.5rem;--sidebar-width: 10rem;--footer-height: 1.75rem;--scale: 1.15rem;display:flex;flex-direction:column;width:100%;height:100%}._Header_lr5mr_13{display:flex;gap:1rem;align-items:center;width:100%;height:var(--header-height);padding:1rem;background-color:var(--background-color-0)}._IconButton_lr5mr_23{--color: var(--foreground-color-0);position:relative;height:1.25rem;width:auto;padding:0;background:none;border:none;outline:none;aspect-ratio:1;cursor:pointer}._IconButton_lr5mr_23:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fff0;border-radius:var(--border-radius-99);transform:scale(1);transform-origin:center;transition:all var(--transition-duration-1) var(--ease-in-out-default)}._IconButton_lr5mr_23:hover:after,._IconButton_lr5mr_23:focus-visible:after{background-color:#ffffff1a;transform:scale(1.5)}._IconButton_lr5mr_23:disabled{--color: var(--background-color-1)}._IconButton_lr5mr_23 svg{height:100%}._IconButton_lr5mr_23 svg path{fill:var(--color);transition:fill var(--transition-duration-0) var(--ease-in-out-default)}._PathInput_lr5mr_69{flex:1;padding:.25rem .5rem;background-color:var(--background-color-2);border:none;border-radius:var(--border-radius-1);outline:none;font-family:inherit;font-size:inherit}._Body_lr5mr_80{flex:1;display:flex;width:100%;height:calc(100% - var(--header-height));background-color:var(--background-color-2)}._Sidebar_lr5mr_88{display:flex;gap:.25rem;flex-direction:column;min-width:calc(var(--sidebar-width) / 2);width:var(--sidebar-width);height:100%;max-width:50%;padding:.5rem;background-color:var(--background-color-1);resize:horizontal;overflow:hidden}._NavButton_lr5mr_102{display:flex;gap:.5rem;align-items:center;width:100%;padding:.5rem;background:none;border:none;border-radius:var(--border-radius-1);outline:none;cursor:pointer;transition:background-color var(--transition-duration-0) var(--ease-in-out-default)}._NavButton_lr5mr_102:hover,._NavButton_lr5mr_102:focus-visible{background-color:color-mix(in srgb,var(--background-color-0) 75%,transparent)}._NavButton_lr5mr_102 svg{height:1.35rem;aspect-ratio:1}._Main_lr5mr_125{--scale: inherit !important;position:relative;flex:1;display:flex;flex-wrap:wrap;align-content:flex-start;height:100%;padding:.5rem;padding-bottom:calc(.5rem + var(--footer-height));overflow:auto}._Footer_lr5mr_139{position:absolute;display:flex;justify-content:flex-start;align-items:center;bottom:0;left:0;width:100%;height:var(--footer-height);padding:0 .75rem;border-top:.25rem solid var(--background-color-0);background-color:var(--background-color-2)}._Footer_lr5mr_139 p{margin:0;font-size:.875em}._Selector_lr5mr_158{--footer-height: 4rem}._FileProperties_xi8b6_1{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:1rem}._Icon_xi8b6_9{width:3rem;height:3rem}._Icon_xi8b6_9 div{width:inherit;height:inherit;object-fit:contain}._Icon_xi8b6_9 svg{max-width:100%;max-height:100%}._Section_xi8b6_25{--divider-width: .25rem;position:relative;display:flex;gap:.25rem;justify-content:flex-start;align-items:flex-start;flex-direction:column;width:100%;padding:1rem 0;padding-bottom:calc(1rem + var(--divider-width))}._Section_xi8b6_25:first-child{gap:.5rem;align-items:center;flex-direction:row;padding-top:0}._Section_xi8b6_25:first-child ._Line_xi8b6_46{font-size:1.25rem}._Section_xi8b6_25:not(:last-child):after{content:"";position:absolute;bottom:0;left:0;width:100%;height:var(--divider-width);border-radius:var(--border-radius-0);background-color:var(--background-color-0)}._Line_xi8b6_46{margin:0;text-align:left;padding-left:2rem;text-indent:-2rem}._AppIcon_xi8b6_68{display:inline-block;width:2rem;height:2rem;vertical-align:middle;margin-left:.5rem;margin-right:.25rem}._AppIcon_xi8b6_68 div{position:relative;width:inherit;height:inherit;object-fit:contain}._AppIcon_xi8b6_68 svg{position:absolute;top:0;left:0;max-width:100%;max-height:100%}')),document.head.appendChild(r)}}catch(e){console.error("vite-plugin-css-injected-by-js",e)}})();
|
|
2
|
+
import { utilStyles as w, VirtualFile as ne, useSystemManager as W, WindowedModal as oe, ImagePreview as D, StorageManager as M, useVirtualRoot as re, useWindowsManager as ie, useHistory as le, useAlert as ae, useWindowedModal as se, useContextMenu as O, Actions as U, ClickAction as b, Vector2 as E, Divider as ce, VirtualRoot as F, DialogBox as z, ModalsConfig as $, DirectoryList as de, CODE_EXTENSIONS as ue, App as me, AppsConfig as pe } from "@prozilla-os/core";
|
|
3
|
+
import { jsxs as l, jsx as e } from "react/jsx-runtime";
|
|
4
|
+
import { useState as S, useCallback as he, useEffect as H } from "react";
|
|
5
|
+
import { FontAwesomeIcon as h } from "@fortawesome/react-fontawesome";
|
|
6
|
+
import { faDownload as _e, faUpload as Ne, faTrash as V, faCircleInfo as ge, faCaretLeft as Ie, faCaretRight as xe, faArrowUp as be, faPlus as fe, faSearch as Ee, faCog as ye, faHouse as ve, faDesktop as Be, faImage as Ce, faFileLines as Pe } from "@fortawesome/free-solid-svg-icons";
|
|
7
|
+
const Ae = "_FileExplorer_lr5mr_1", Se = "_Header_lr5mr_13", we = "_IconButton_lr5mr_23", Le = "_PathInput_lr5mr_69", Te = "_Body_lr5mr_80", ke = "_Sidebar_lr5mr_88", De = "_NavButton_lr5mr_102", Me = "_Main_lr5mr_125", Oe = "_Footer_lr5mr_139", Ue = "_Selector_lr5mr_158", s = {
|
|
8
|
+
FileExplorer: Ae,
|
|
9
|
+
Header: Se,
|
|
10
|
+
IconButton: we,
|
|
11
|
+
PathInput: Le,
|
|
12
|
+
Body: Te,
|
|
13
|
+
Sidebar: ke,
|
|
14
|
+
NavButton: De,
|
|
15
|
+
Main: Me,
|
|
16
|
+
Footer: Oe,
|
|
17
|
+
Selector: Ue
|
|
18
18
|
};
|
|
19
|
-
function
|
|
20
|
-
return /* @__PURE__ */
|
|
19
|
+
function y({ onClick: n, icon: _, name: a }) {
|
|
20
|
+
return /* @__PURE__ */ l(
|
|
21
21
|
"button",
|
|
22
22
|
{
|
|
23
23
|
tabIndex: 0,
|
|
24
|
-
className: `${
|
|
25
|
-
onClick:
|
|
24
|
+
className: `${s.NavButton} ${w.TextSemibold}`,
|
|
25
|
+
onClick: n,
|
|
26
26
|
children: [
|
|
27
|
-
/* @__PURE__ */ e(
|
|
28
|
-
|
|
27
|
+
/* @__PURE__ */ e(h, { icon: _ }),
|
|
28
|
+
a
|
|
29
29
|
]
|
|
30
30
|
}
|
|
31
31
|
);
|
|
32
32
|
}
|
|
33
|
-
function
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
const { name: u, extension:
|
|
38
|
-
|
|
39
|
-
const { result:
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
function Fe({ directory: n }) {
|
|
34
|
+
const _ = (a) => {
|
|
35
|
+
const N = a.target.files;
|
|
36
|
+
N != null && Array.from(N).forEach((p) => {
|
|
37
|
+
const { name: u, extension: g } = ne.splitId(p.name), o = new FileReader();
|
|
38
|
+
o.onload = (I) => {
|
|
39
|
+
const { result: v } = I.target;
|
|
40
|
+
n.createFile(u, g, (c) => {
|
|
41
|
+
c.setSource(v);
|
|
42
42
|
});
|
|
43
|
-
},
|
|
43
|
+
}, o.readAsDataURL(p);
|
|
44
44
|
});
|
|
45
45
|
};
|
|
46
|
-
return /* @__PURE__ */
|
|
46
|
+
return /* @__PURE__ */ l("label", { title: "Import", tabIndex: 0, className: s.IconButton, children: [
|
|
47
47
|
/* @__PURE__ */ e(
|
|
48
48
|
"input",
|
|
49
49
|
{
|
|
@@ -51,135 +51,141 @@ function Oe({ directory: o }) {
|
|
|
51
51
|
id: "import",
|
|
52
52
|
multiple: !0,
|
|
53
53
|
style: { display: "none" },
|
|
54
|
-
onChange:
|
|
54
|
+
onChange: _
|
|
55
55
|
}
|
|
56
56
|
),
|
|
57
|
-
/* @__PURE__ */ e(
|
|
57
|
+
/* @__PURE__ */ e(h, { icon: _e })
|
|
58
58
|
] });
|
|
59
59
|
}
|
|
60
60
|
const G = {
|
|
61
61
|
NONE: 0,
|
|
62
62
|
SINGLE: 1,
|
|
63
63
|
MULTIPLE: 2
|
|
64
|
-
},
|
|
65
|
-
FileProperties:
|
|
66
|
-
Icon:
|
|
67
|
-
Section:
|
|
68
|
-
Line:
|
|
69
|
-
AppIcon:
|
|
64
|
+
}, ze = "_FileProperties_xi8b6_1", $e = "_Icon_xi8b6_9", He = "_Section_xi8b6_25", Ve = "_Line_xi8b6_46", Ge = "_AppIcon_xi8b6_68", d = {
|
|
65
|
+
FileProperties: ze,
|
|
66
|
+
Icon: $e,
|
|
67
|
+
Section: He,
|
|
68
|
+
Line: Ve,
|
|
69
|
+
AppIcon: Ge
|
|
70
70
|
};
|
|
71
|
-
function
|
|
72
|
-
const { appsConfig: p } = W(), u =
|
|
73
|
-
return /* @__PURE__ */
|
|
74
|
-
/* @__PURE__ */
|
|
75
|
-
/* @__PURE__ */ e(D, { className: d.Icon, source:
|
|
76
|
-
/* @__PURE__ */ e("p", { className: `${d.Line} ${
|
|
71
|
+
function We({ modal: n, params: _, file: a, ...N }) {
|
|
72
|
+
const { appsConfig: p } = W(), u = a.extension != null ? p.getAppByFileExtension(a.extension) : null;
|
|
73
|
+
return /* @__PURE__ */ l(oe, { className: d.FileProperties, modal: n, params: _, ...N, children: [
|
|
74
|
+
/* @__PURE__ */ l("span", { className: d.Section, children: [
|
|
75
|
+
/* @__PURE__ */ e(D, { className: d.Icon, source: a.getIconUrl() }),
|
|
76
|
+
/* @__PURE__ */ e("p", { className: `${d.Line} ${w.TextBold}`, children: a.id })
|
|
77
77
|
] }),
|
|
78
|
-
/* @__PURE__ */
|
|
79
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ l("span", { className: d.Section, children: [
|
|
79
|
+
/* @__PURE__ */ l("p", { className: d.Line, children: [
|
|
80
80
|
"Type: ",
|
|
81
|
-
|
|
81
|
+
a.getType()
|
|
82
82
|
] }),
|
|
83
|
-
u != null && /* @__PURE__ */
|
|
83
|
+
u != null && /* @__PURE__ */ l("span", { className: d.Line, children: [
|
|
84
84
|
"Opens with:",
|
|
85
85
|
/* @__PURE__ */ e(D, { className: d.AppIcon, source: u.iconUrl ?? "" }),
|
|
86
86
|
u.name
|
|
87
87
|
] })
|
|
88
88
|
] }),
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
-
/* @__PURE__ */
|
|
89
|
+
/* @__PURE__ */ l("span", { className: d.Section, children: [
|
|
90
|
+
/* @__PURE__ */ l("p", { className: d.Line, children: [
|
|
91
91
|
"Location: ",
|
|
92
|
-
|
|
92
|
+
a.path
|
|
93
93
|
] }),
|
|
94
|
-
/* @__PURE__ */
|
|
94
|
+
/* @__PURE__ */ l("p", { className: d.Line, children: [
|
|
95
95
|
"Size: ",
|
|
96
|
-
M.getByteSize(
|
|
96
|
+
M.getByteSize(a.source ?? a.content),
|
|
97
97
|
" bytes"
|
|
98
98
|
] }),
|
|
99
|
-
/* @__PURE__ */
|
|
99
|
+
/* @__PURE__ */ l("p", { className: d.Line, children: [
|
|
100
100
|
"Size on drive: ",
|
|
101
|
-
M.getByteSize(
|
|
101
|
+
M.getByteSize(a.toString()),
|
|
102
102
|
" bytes"
|
|
103
103
|
] })
|
|
104
104
|
] }),
|
|
105
|
-
/* @__PURE__ */ e("span", { className: d.Section, children: /* @__PURE__ */
|
|
105
|
+
/* @__PURE__ */ e("span", { className: d.Section, children: /* @__PURE__ */ l("p", { className: d.Line, children: [
|
|
106
106
|
"Attributes: ",
|
|
107
|
-
|
|
107
|
+
a.isProtected ? "Protected" : "N/A"
|
|
108
108
|
] }) })
|
|
109
109
|
] });
|
|
110
110
|
}
|
|
111
|
-
function
|
|
112
|
-
const
|
|
113
|
-
Actions: (
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
111
|
+
function Ye({ app: n, path: _, selectorMode: a, Footer: N, onSelectionChange: p, onSelectionFinish: u }) {
|
|
112
|
+
const g = N != null && a != null && a !== G.NONE, o = re(), I = ie(), { windowsConfig: v } = W(), [c, B] = S(o == null ? void 0 : o.navigate(_ ?? "~")), [Y, f] = S((c == null ? void 0 : c.path) ?? ""), [L] = S(!0), { history: C, stateIndex: T, pushState: k, undo: j, redo: K, undoAvailable: Q, redoAvailable: X } = le(c.path), { alert: q } = ae(), { openWindowedModal: P } = se(), { onContextMenu: J } = O({
|
|
113
|
+
Actions: (r) => {
|
|
114
|
+
var t;
|
|
115
|
+
return /* @__PURE__ */ l(U, { ...r, children: [
|
|
116
|
+
/* @__PURE__ */ e(b, { label: g ? "Select" : "Open", onTrigger: (i, m) => {
|
|
117
|
+
if (g) {
|
|
118
|
+
p == null || p({ files: [m.id], directory: c }), u == null || u();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
I != null && m.open(I);
|
|
122
|
+
} }),
|
|
123
|
+
((t = r.triggerParams) == null ? void 0 : t.isDownloadable()) && /* @__PURE__ */ e(b, { label: "Export", icon: Ne, onTrigger: (i, m) => {
|
|
124
|
+
m.download();
|
|
125
|
+
} }),
|
|
126
|
+
/* @__PURE__ */ e(b, { label: "Delete", icon: V, onTrigger: (i, m) => {
|
|
127
|
+
m.delete();
|
|
128
|
+
} }),
|
|
129
|
+
/* @__PURE__ */ e(b, { label: "Properties", icon: ge, onTrigger: (i, m) => {
|
|
130
|
+
P({
|
|
131
|
+
title: `${m.id} ${v.titleSeparator} Properties`,
|
|
132
|
+
iconUrl: m.getIconUrl(),
|
|
133
|
+
size: new E(400, 500),
|
|
134
|
+
Modal: (te) => /* @__PURE__ */ e(We, { file: m, ...te })
|
|
135
|
+
});
|
|
136
|
+
} })
|
|
137
|
+
] });
|
|
138
|
+
}
|
|
133
139
|
}), { onContextMenu: Z } = O({
|
|
134
|
-
Actions: (
|
|
135
|
-
/* @__PURE__ */ e(
|
|
136
|
-
|
|
140
|
+
Actions: (r) => /* @__PURE__ */ l(U, { ...r, children: [
|
|
141
|
+
/* @__PURE__ */ e(b, { label: "Open", onTrigger: (t, i) => {
|
|
142
|
+
x(i.linkedPath ?? i.name);
|
|
137
143
|
} }),
|
|
138
|
-
/* @__PURE__ */ e(
|
|
139
|
-
/* @__PURE__ */ e(
|
|
140
|
-
|
|
144
|
+
/* @__PURE__ */ e(ce, {}),
|
|
145
|
+
/* @__PURE__ */ e(b, { label: "Delete", icon: V, onTrigger: (t, i) => {
|
|
146
|
+
i.delete();
|
|
141
147
|
} })
|
|
142
148
|
] })
|
|
143
|
-
}),
|
|
144
|
-
if (
|
|
149
|
+
}), x = he((r, t = !1) => {
|
|
150
|
+
if (r == null)
|
|
145
151
|
return;
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
}, [
|
|
152
|
+
c == null && (t = !0);
|
|
153
|
+
const i = t ? o == null ? void 0 : o.navigate(r) : c.navigate(r);
|
|
154
|
+
i != null && (B(i), f(i.root ? "/" : i.path), k(i.path));
|
|
155
|
+
}, [c, k, o]);
|
|
150
156
|
H(() => {
|
|
151
|
-
if (
|
|
157
|
+
if (C.length === 0)
|
|
152
158
|
return;
|
|
153
|
-
const
|
|
154
|
-
t != null && (
|
|
155
|
-
}, [
|
|
156
|
-
const
|
|
159
|
+
const r = C[T], t = o == null ? void 0 : o.navigate(r);
|
|
160
|
+
t != null && (B(t), f(t.root ? "/" : t.path));
|
|
161
|
+
}, [C, T, o]), H(() => {
|
|
162
|
+
const r = (t) => {
|
|
157
163
|
q({
|
|
158
164
|
title: t.message,
|
|
159
165
|
text: "You have exceeded the virtual drive capacity. Files and folders will not be saved until more storage is freed.",
|
|
160
|
-
iconUrl:
|
|
161
|
-
size: new
|
|
166
|
+
iconUrl: n == null ? void 0 : n.iconUrl,
|
|
167
|
+
size: new E(300, 200),
|
|
162
168
|
single: !0
|
|
163
169
|
});
|
|
164
170
|
};
|
|
165
|
-
return
|
|
166
|
-
|
|
171
|
+
return o == null || o.on(F.EVENT_NAMES.error, r), () => {
|
|
172
|
+
o == null || o.off(F.EVENT_NAMES.error, r);
|
|
167
173
|
};
|
|
168
174
|
}, []);
|
|
169
|
-
const R = (
|
|
170
|
-
f(
|
|
171
|
-
}, ee = (
|
|
172
|
-
let t =
|
|
173
|
-
if (
|
|
175
|
+
const R = (r) => {
|
|
176
|
+
f(r.target.value);
|
|
177
|
+
}, ee = (r) => {
|
|
178
|
+
let t = r.target.value;
|
|
179
|
+
if (r.key === "Enter") {
|
|
174
180
|
t === "" && (t = "~");
|
|
175
|
-
const
|
|
176
|
-
if (
|
|
177
|
-
|
|
181
|
+
const i = o == null ? void 0 : o.navigate(t);
|
|
182
|
+
if (i == null) {
|
|
183
|
+
P({
|
|
178
184
|
title: "Error",
|
|
179
|
-
iconUrl:
|
|
180
|
-
size: new
|
|
181
|
-
Modal: (
|
|
182
|
-
/* @__PURE__ */
|
|
185
|
+
iconUrl: n == null ? void 0 : n.iconUrl,
|
|
186
|
+
size: new E(300, 150),
|
|
187
|
+
Modal: (m) => /* @__PURE__ */ l(z, { ...m, children: [
|
|
188
|
+
/* @__PURE__ */ l("p", { children: [
|
|
183
189
|
'Invalid path: "',
|
|
184
190
|
t,
|
|
185
191
|
'"'
|
|
@@ -189,22 +195,22 @@ function Ge({ app: o, path: h, selectorMode: i, Footer: _, onSelectionChange: p,
|
|
|
189
195
|
});
|
|
190
196
|
return;
|
|
191
197
|
}
|
|
192
|
-
|
|
198
|
+
B(i), f(i.root ? "/" : i.path);
|
|
193
199
|
}
|
|
194
|
-
}, A =
|
|
195
|
-
return /* @__PURE__ */
|
|
196
|
-
/* @__PURE__ */
|
|
200
|
+
}, A = c.getItemCount(L);
|
|
201
|
+
return /* @__PURE__ */ l("div", { className: g ? `${s.FileExplorer} ${s.Selector}` : s.FileExplorer, children: [
|
|
202
|
+
/* @__PURE__ */ l("div", { className: s.Header, children: [
|
|
197
203
|
/* @__PURE__ */ e(
|
|
198
204
|
"button",
|
|
199
205
|
{
|
|
200
206
|
title: "Back",
|
|
201
207
|
tabIndex: 0,
|
|
202
|
-
className:
|
|
208
|
+
className: s.IconButton,
|
|
203
209
|
onClick: () => {
|
|
204
210
|
j();
|
|
205
211
|
},
|
|
206
212
|
disabled: !Q,
|
|
207
|
-
children: /* @__PURE__ */ e(
|
|
213
|
+
children: /* @__PURE__ */ e(h, { icon: Ie })
|
|
208
214
|
}
|
|
209
215
|
),
|
|
210
216
|
/* @__PURE__ */ e(
|
|
@@ -212,12 +218,12 @@ function Ge({ app: o, path: h, selectorMode: i, Footer: _, onSelectionChange: p,
|
|
|
212
218
|
{
|
|
213
219
|
title: "Forward",
|
|
214
220
|
tabIndex: 0,
|
|
215
|
-
className:
|
|
221
|
+
className: s.IconButton,
|
|
216
222
|
onClick: () => {
|
|
217
223
|
K();
|
|
218
224
|
},
|
|
219
225
|
disabled: !X,
|
|
220
|
-
children: /* @__PURE__ */ e(
|
|
226
|
+
children: /* @__PURE__ */ e(h, { icon: xe })
|
|
221
227
|
}
|
|
222
228
|
),
|
|
223
229
|
/* @__PURE__ */ e(
|
|
@@ -225,12 +231,12 @@ function Ge({ app: o, path: h, selectorMode: i, Footer: _, onSelectionChange: p,
|
|
|
225
231
|
{
|
|
226
232
|
title: "Up",
|
|
227
233
|
tabIndex: 0,
|
|
228
|
-
className:
|
|
234
|
+
className: s.IconButton,
|
|
229
235
|
onClick: () => {
|
|
230
|
-
|
|
236
|
+
x("..");
|
|
231
237
|
},
|
|
232
|
-
disabled:
|
|
233
|
-
children: /* @__PURE__ */ e(
|
|
238
|
+
disabled: c.isRoot != null && c.isRoot,
|
|
239
|
+
children: /* @__PURE__ */ e(h, { icon: be })
|
|
234
240
|
}
|
|
235
241
|
),
|
|
236
242
|
/* @__PURE__ */ e(
|
|
@@ -238,20 +244,20 @@ function Ge({ app: o, path: h, selectorMode: i, Footer: _, onSelectionChange: p,
|
|
|
238
244
|
{
|
|
239
245
|
title: "New",
|
|
240
246
|
tabIndex: 0,
|
|
241
|
-
className:
|
|
247
|
+
className: s.IconButton,
|
|
242
248
|
onClick: () => {
|
|
243
|
-
|
|
249
|
+
P({
|
|
244
250
|
title: "Error",
|
|
245
|
-
iconUrl:
|
|
246
|
-
size: new
|
|
247
|
-
Modal: (
|
|
251
|
+
iconUrl: n == null ? void 0 : n.iconUrl,
|
|
252
|
+
size: new E(300, 150),
|
|
253
|
+
Modal: (r) => /* @__PURE__ */ l(z, { ...r, children: [
|
|
248
254
|
/* @__PURE__ */ e("p", { children: "This folder is protected." }),
|
|
249
255
|
/* @__PURE__ */ e("button", { "data-type": $.DIALOG_CONTENT_TYPES.closeButton, children: "Ok" })
|
|
250
256
|
] })
|
|
251
257
|
});
|
|
252
258
|
},
|
|
253
|
-
disabled: !
|
|
254
|
-
children: /* @__PURE__ */ e(
|
|
259
|
+
disabled: !c.canBeEdited,
|
|
260
|
+
children: /* @__PURE__ */ e(h, { icon: fe })
|
|
255
261
|
}
|
|
256
262
|
),
|
|
257
263
|
/* @__PURE__ */ e(
|
|
@@ -260,63 +266,63 @@ function Ge({ app: o, path: h, selectorMode: i, Footer: _, onSelectionChange: p,
|
|
|
260
266
|
value: Y,
|
|
261
267
|
type: "text",
|
|
262
268
|
"aria-label": "Path",
|
|
263
|
-
className:
|
|
269
|
+
className: s.PathInput,
|
|
264
270
|
tabIndex: 0,
|
|
265
271
|
onChange: R,
|
|
266
272
|
onKeyDown: ee,
|
|
267
273
|
placeholder: "Enter a path..."
|
|
268
274
|
}
|
|
269
275
|
),
|
|
270
|
-
/* @__PURE__ */ e(
|
|
271
|
-
/* @__PURE__ */ e("button", { title: "Search", tabIndex: 0, className:
|
|
272
|
-
/* @__PURE__ */ e("button", { title: "Settings", tabIndex: 0, className:
|
|
276
|
+
/* @__PURE__ */ e(Fe, { directory: c }),
|
|
277
|
+
/* @__PURE__ */ e("button", { title: "Search", tabIndex: 0, className: s.IconButton, children: /* @__PURE__ */ e(h, { icon: Ee }) }),
|
|
278
|
+
/* @__PURE__ */ e("button", { title: "Settings", tabIndex: 0, className: s.IconButton, children: /* @__PURE__ */ e(h, { icon: ye }) })
|
|
273
279
|
] }),
|
|
274
|
-
/* @__PURE__ */
|
|
275
|
-
/* @__PURE__ */
|
|
276
|
-
/* @__PURE__ */ e(
|
|
277
|
-
|
|
278
|
-
}, icon: Ee }),
|
|
279
|
-
/* @__PURE__ */ e(E, { name: "Desktop", onClick: () => {
|
|
280
|
-
g("~/Desktop");
|
|
281
|
-
}, icon: ye }),
|
|
282
|
-
/* @__PURE__ */ e(E, { name: "Images", onClick: () => {
|
|
283
|
-
g("~/Pictures");
|
|
280
|
+
/* @__PURE__ */ l("div", { className: s.Body, children: [
|
|
281
|
+
/* @__PURE__ */ l("div", { className: s.Sidebar, children: [
|
|
282
|
+
/* @__PURE__ */ e(y, { name: "Home", onClick: () => {
|
|
283
|
+
x("~");
|
|
284
284
|
}, icon: ve }),
|
|
285
|
-
/* @__PURE__ */ e(
|
|
286
|
-
|
|
287
|
-
}, icon: Be })
|
|
285
|
+
/* @__PURE__ */ e(y, { name: "Desktop", onClick: () => {
|
|
286
|
+
x("~/Desktop");
|
|
287
|
+
}, icon: Be }),
|
|
288
|
+
/* @__PURE__ */ e(y, { name: "Images", onClick: () => {
|
|
289
|
+
x("~/Pictures");
|
|
290
|
+
}, icon: Ce }),
|
|
291
|
+
/* @__PURE__ */ e(y, { name: "Documents", onClick: () => {
|
|
292
|
+
x("~/Documents");
|
|
293
|
+
}, icon: Pe })
|
|
288
294
|
] }),
|
|
289
295
|
/* @__PURE__ */ e(
|
|
290
|
-
|
|
296
|
+
de,
|
|
291
297
|
{
|
|
292
|
-
directory:
|
|
298
|
+
directory: c,
|
|
293
299
|
id: "main",
|
|
294
|
-
className:
|
|
295
|
-
showHidden:
|
|
296
|
-
onOpenFile: (
|
|
297
|
-
if (
|
|
300
|
+
className: s.Main,
|
|
301
|
+
showHidden: L,
|
|
302
|
+
onOpenFile: (r, t) => {
|
|
303
|
+
if (r.preventDefault(), g)
|
|
298
304
|
return void (u == null ? void 0 : u());
|
|
299
|
-
const
|
|
300
|
-
(t.extension === "md" || t.extension != null &&
|
|
305
|
+
const i = {};
|
|
306
|
+
(t.extension === "md" || t.extension != null && ue.includes(t.extension)) && (i.mode = "view"), I == null || I.openFile(t, i);
|
|
301
307
|
},
|
|
302
|
-
onOpenFolder: (
|
|
303
|
-
|
|
308
|
+
onOpenFolder: (r, t) => {
|
|
309
|
+
x(t.linkedPath ?? t.name);
|
|
304
310
|
},
|
|
305
311
|
onContextMenuFile: J,
|
|
306
312
|
onContextMenuFolder: Z,
|
|
307
|
-
allowMultiSelect:
|
|
313
|
+
allowMultiSelect: a !== G.SINGLE,
|
|
308
314
|
onSelectionChange: p
|
|
309
315
|
}
|
|
310
316
|
)
|
|
311
317
|
] }),
|
|
312
|
-
|
|
318
|
+
g ? /* @__PURE__ */ e("div", { className: s.Footer, children: /* @__PURE__ */ e(N, {}) }) : /* @__PURE__ */ e("span", { className: s.Footer, children: /* @__PURE__ */ e("p", { className: w.TextLight, children: A === 1 ? A + " item" : A + " items" }) })
|
|
313
319
|
] });
|
|
314
320
|
}
|
|
315
|
-
var
|
|
316
|
-
const
|
|
317
|
-
|
|
321
|
+
var je = /* @__PURE__ */ ((n) => (n[n.None = 0] = "None", n[n.Single = 1] = "Single", n[n.Multi = 2] = "Multi", n))(je || {});
|
|
322
|
+
const Ke = new me("File Explorer", "file-explorer", Ye).setIconUrl("https://os.prozilla.dev/assets/apps/icons/file-explorer.svg").setRole(pe.APP_ROLES.fileExplorer).setCategory("Utilities & tools");
|
|
323
|
+
Ke.setMetadata({ name: "@prozilla-os/file-explorer", version: "1.1.16", author: "Prozilla" });
|
|
318
324
|
export {
|
|
319
|
-
|
|
320
|
-
|
|
325
|
+
je as FileSelectorMode,
|
|
326
|
+
Ke as fileExplorer
|
|
321
327
|
};
|
|
322
328
|
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sources":["../src/components/QuickAccessButton.tsx","../src/components/ImportButton.tsx","../src/constants/fileExplorer.const.ts","../src/components/modals/file-properties/FileProperties.tsx","../src/components/FileExplorer.tsx","../src/types/utils.ts","../src/main.ts"],"sourcesContent":["import { FontAwesomeIcon, FontAwesomeIconProps } from \"@fortawesome/react-fontawesome\";\r\nimport styles from \"./FileExplorer.module.css\";\r\nimport { MouseEventHandler } from \"react\";\r\nimport { utilStyles } from \"@prozilla-os/core\";\r\n\r\ninterface QuickAcessButton {\r\n\tonClick: MouseEventHandler;\r\n\ticon: FontAwesomeIconProps[\"icon\"];\r\n\tname: string;\r\n}\r\n\r\nexport function QuickAccessButton({ onClick, icon, name }: QuickAcessButton) {\r\n\treturn (\r\n\t\t<button\r\n\t\t\ttabIndex={0}\r\n\t\t\tclassName={`${styles.NavButton} ${utilStyles.TextSemibold}`}\r\n\t\t\tonClick={onClick}\r\n\t\t>\r\n\t\t\t<FontAwesomeIcon icon={icon}/>\r\n\t\t\t{name}\r\n\t\t</button>\r\n\t);\r\n}","import { FormEventHandler, ReactElement } from \"react\";\r\nimport styles from \"./FileExplorer.module.css\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faDownload } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { VirtualFolder, VirtualFile } from \"@prozilla-os/core\";\r\n\r\ninterface ImportButtonProps {\r\n\tdirectory: VirtualFolder;\r\n}\r\n\r\nexport function ImportButton({ directory }: ImportButtonProps): ReactElement {\r\n\tconst onChange = (event: InputEvent) => {\r\n\t\tconst files = (event.target as HTMLInputElement).files;\r\n\r\n\t\tif (files == null)\r\n\t\t\treturn;\r\n\r\n\t\tArray.from(files).forEach((file: File) => {\r\n\t\t\tconst { name, extension } = VirtualFile.splitId(file.name);\r\n\r\n\t\t\tconst reader = new FileReader();\r\n\t\t\treader.onload = (event: Event) => {\r\n\t\t\t\tconst { result } = event.target as FileReader;\r\n\r\n\t\t\t\t// Create a file with the same name and extension, with a base64 string as a source\r\n\t\t\t\tdirectory.createFile(name, extension as string | undefined, (virtualFile) => {\r\n\t\t\t\t\tvirtualFile.setSource(result as string);\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t\treader.readAsDataURL(file);\r\n\t\t});\r\n\t};\r\n\r\n\treturn <label title=\"Import\" tabIndex={0} className={styles.IconButton}>\r\n\t\t<input\r\n\t\t\ttype=\"file\"\r\n\t\t\tid=\"import\"\r\n\t\t\tmultiple\r\n\t\t\tstyle={{ display: \"none\" }}\r\n\t\t\tonChange={onChange as unknown as FormEventHandler}\r\n\t\t/>\r\n\t\t<FontAwesomeIcon icon={faDownload}/>\r\n\t</label>;\r\n}","export const SELECTOR_MODE = {\n\tNONE: 0,\n\tSINGLE: 1,\n\tMULTIPLE: 2,\n};","import styles from \"./FileProperties.module.css\";\r\nimport { ImagePreview, ModalProps, StorageManager, useSystemManager, utilStyles, VirtualFile, WindowedModal } from \"@prozilla-os/core\";\r\n\r\ninterface FilePropetiesProps extends ModalProps {\r\n\tfile: VirtualFile;\r\n}\r\n\r\nexport function FileProperties({ modal, params, file, ...props }: FilePropetiesProps) {\r\n\tconst { appsConfig } = useSystemManager();\r\n\tconst associatedApp = file.extension != null ? appsConfig.getAppByFileExtension(file.extension) : null;\r\n\r\n\treturn <WindowedModal className={styles.FileProperties} modal={modal} params={params} {...props}>\r\n\t\t<span className={styles.Section}>\r\n\t\t\t<ImagePreview className={styles.Icon} source={file.getIconUrl()}/>\r\n\t\t\t<p className={`${styles.Line} ${utilStyles.TextBold}`}>{file.id}</p>\r\n\t\t</span>\r\n\t\t<span className={styles.Section}>\r\n\t\t\t<p className={styles.Line}>Type: {file.getType()}</p>\r\n\t\t\t{associatedApp != null &&\r\n\t\t\t\t<span className={styles.Line}>\r\n\t\t\t\t\tOpens with: \r\n\t\t\t\t\t<ImagePreview className={styles.AppIcon} source={associatedApp.iconUrl ?? \"\"}/>\r\n\t\t\t\t\t{associatedApp.name}\r\n\t\t\t\t</span>\r\n\t\t\t}\r\n\t\t</span>\r\n\t\t<span className={styles.Section}>\r\n\t\t\t<p className={styles.Line}>Location: {file.path}</p>\r\n\t\t\t<p className={styles.Line}>Size: {StorageManager.getByteSize(file.source ?? file.content as string | null)} bytes</p>\r\n\t\t\t<p className={styles.Line}>Size on drive: {StorageManager.getByteSize(file.toString())} bytes</p>\r\n\t\t</span>\r\n\t\t<span className={styles.Section}>\r\n\t\t\t<p className={styles.Line}>Attributes: {file.isProtected ? \"Protected\" : \"N/A\"}</p>\r\n\t\t</span>\r\n\t</WindowedModal>;\r\n}","import { ChangeEventHandler, FC, KeyboardEventHandler, useCallback, useEffect, useState } from \"react\";\nimport styles from \"./FileExplorer.module.css\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faArrowUp, faCaretLeft, faCaretRight, faCircleInfo, faCog, faDesktop, faFileLines, faHouse, faImage, faPlus, faSearch, faTrash } from \"@fortawesome/free-solid-svg-icons\";\nimport { QuickAccessButton } from \"./QuickAccessButton\";\nimport { ImportButton } from \"./ImportButton\";\nimport { Actions, ClickAction, CODE_EXTENSIONS, DialogBox, DirectoryList, Divider, FileEventHandler, FolderEventHandler, ModalProps, ModalsConfig, OnSelectionChangeParams, useAlert, useContextMenu, useHistory, useSystemManager, useVirtualRoot, useWindowedModal, useWindowsManager, utilStyles, Vector2, VirtualFile, VirtualFolder, VirtualFolderLink, VirtualRoot, WindowProps } from \"@prozilla-os/core\";\nimport { SELECTOR_MODE } from \"../constants/fileExplorer.const\";\nimport { FileProperties } from \"./modals/file-properties/FileProperties\";\nimport { JSX } from \"react/jsx-runtime\";\n\nexport interface FileExplorerProps extends WindowProps {\n\tpath?: string;\n\tselectorMode?: number;\n\tFooter?: FC;\n\tonSelectionChange?: (params: OnSelectionChangeParams) => void;\n\tonSelectionFinish?: () => void;\n}\n\nexport function FileExplorer({ app, path: startPath, selectorMode, Footer, onSelectionChange, onSelectionFinish }: FileExplorerProps) {\n\tconst isSelector = (Footer != null && selectorMode != null && selectorMode !== SELECTOR_MODE.NONE);\n\n\tconst virtualRoot = useVirtualRoot();\n\tconst windowsManager = useWindowsManager();\n\tconst { windowsConfig } = useSystemManager();\n\n\tconst [currentDirectory, setCurrentDirectory] = useState<VirtualFolder>(virtualRoot?.navigate(startPath ?? \"~\") as VirtualFolder);\n\tconst [path, setPath] = useState<string>(currentDirectory?.path ?? \"\");\n\tconst [showHidden] = useState(true);\n\tconst { history, stateIndex, pushState, undo, redo, undoAvailable, redoAvailable } = useHistory<string>(currentDirectory.path);\n\tconst { alert } = useAlert();\n\n\tconst { openWindowedModal } = useWindowedModal();\n\tconst { onContextMenu: onContextMenuFile } = useContextMenu({ Actions: (props) =>\n\t\t<Actions {...props}>\n\t\t\t<ClickAction label={!isSelector ? \"Open\" : \"Select\"} onTrigger={(_event, file) => {\n\t\t\t\tif (isSelector) {\n\t\t\t\t\tonSelectionChange?.({ files: [(file as VirtualFile).id], directory: currentDirectory });\n\t\t\t\t\tonSelectionFinish?.();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (windowsManager != null)\t(file as VirtualFile).open(windowsManager);\n\t\t\t}}/>\n\t\t\t<ClickAction label=\"Delete\" icon={faTrash} onTrigger={(_event, file) => {\n\t\t\t\t(file as VirtualFile).delete();\n\t\t\t}}/>\n\t\t\t<ClickAction label=\"Properties\" icon={faCircleInfo} onTrigger={(_event, file) => {\n\t\t\t\topenWindowedModal({\n\t\t\t\t\ttitle: `${(file as VirtualFile).id} ${windowsConfig.titleSeparator} Properties`,\n\t\t\t\t\ticonUrl: (file as VirtualFile).getIconUrl(),\n\t\t\t\t\tsize: new Vector2(400, 500),\n\t\t\t\t\tModal: (props: object) => <FileProperties file={file as VirtualFile} {...props}/>,\n\t\t\t\t});\n\t\t\t}}/>\n\t\t</Actions>,\n\t});\n\tconst { onContextMenu: onContextMenuFolder } = useContextMenu({ Actions: (props) =>\n\t\t<Actions {...props}>\n\t\t\t<ClickAction label=\"Open\" onTrigger={(_event, folder) => {\n\t\t\t\tchangeDirectory((folder as VirtualFolderLink).linkedPath ?? (folder as VirtualFolder).name);\n\t\t\t}}/>\n\t\t\t{/* <ClickAction label={`Open in ${APP_NAMES.TERMINAL}`} icon={APP_ICONS.TERMINAL} onTrigger={(event, folder) => {\n\t\t\t\twindowsManager?.open(APPS.TERMINAL, { startPath: (folder as VirtualFolder).path });\n\t\t\t}}/> */}\n\t\t\t<Divider/>\n\t\t\t<ClickAction label=\"Delete\" icon={faTrash} onTrigger={(_event, folder) => {\n\t\t\t\t(folder as VirtualFolder).delete();\n\t\t\t}}/>\n\t\t</Actions>,\n\t});\n\t// const { onContextMenu: onNew } = useContextMenu({\n\t// \tmodalsManager,\n\t// \toptions: {\n\t// \t\t\"File\": () => { currentDirectory.createFile(\"New File\"); },\n\t// \t\t\"Folder\": () => { currentDirectory.createFolder(\"New Folder\"); }\n\t// \t}\n\t// });\n\n\tconst changeDirectory = useCallback((path: string, absolute = false) => {\n\t\tif (path == null)\n\t\t\treturn;\n\n\t\tif (currentDirectory == null)\n\t\t\tabsolute = true;\n\n\t\tconst directory = absolute ? virtualRoot?.navigate(path) : currentDirectory.navigate(path);\n\n\t\tif (directory != null) {\n\t\t\tsetCurrentDirectory(directory as VirtualFolder);\n\t\t\tsetPath(directory.root ? \"/\" : directory.path);\n\t\t\tpushState(directory.path);\n\t\t}\n\t}, [currentDirectory, pushState, virtualRoot]);\n\n\tuseEffect(() => {\n\t\tif (history.length === 0)\n\t\t\treturn;\n\n\t\tconst path = history[stateIndex];\n\t\tconst directory = virtualRoot?.navigate(path);\n\t\tif (directory != null) {\n\t\t\tsetCurrentDirectory(directory as VirtualFolder);\n\t\t\tsetPath(directory.root ? \"/\" : directory.path);\n\t\t}\n\t}, [history, stateIndex, virtualRoot]);\n\n\tuseEffect(() => {\n\t\ttype Error = { message: string };\n\t\tconst onError = (error: unknown) => {\n\t\t\talert({\n\t\t\t\ttitle: (error as Error).message,\n\t\t\t\ttext: \"You have exceeded the virtual drive capacity. Files and folders will not be saved until more storage is freed.\",\n\t\t\t\ticonUrl: app?.iconUrl as string | undefined,\n\t\t\t\tsize: new Vector2(300, 200),\n\t\t\t\tsingle: true,\n\t\t\t});\n\t\t};\n\n\t\tvirtualRoot?.on(VirtualRoot.EVENT_NAMES.error, onError);\n\n\t\treturn () => {\n\t\t\tvirtualRoot?.off(VirtualRoot.EVENT_NAMES.error, onError);\n\t\t};\n\t}, []);\n\n\tconst onPathChange = (event: Event) => {\n\t\tsetPath((event.target as HTMLInputElement).value);\n\t};\n\n\tconst onKeyDown = (event: KeyboardEvent) => {\n\t\tlet value = (event.target as HTMLInputElement).value;\n\n\t\tif (event.key === \"Enter\") {\n\t\t\tif (value === \"\")\n\t\t\t\tvalue = \"~\";\n\n\t\t\tconst directory = virtualRoot?.navigate(value);\n\n\t\t\tif (directory == null) {\n\t\t\t\topenWindowedModal({\n\t\t\t\t\ttitle: \"Error\",\n\t\t\t\t\ticonUrl: app?.iconUrl as string | undefined,\n\t\t\t\t\tsize: new Vector2(300, 150),\n\t\t\t\t\tModal: (props: JSX.IntrinsicAttributes & ModalProps) =>\n\t\t\t\t\t\t<DialogBox {...props}>\n\t\t\t\t\t\t\t<p>Invalid path: \"{value}\"</p>\n\t\t\t\t\t\t\t<button data-type={ModalsConfig.DIALOG_CONTENT_TYPES.closeButton}>Ok</button>\n\t\t\t\t\t\t</DialogBox>,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetCurrentDirectory(directory as VirtualFolder);\n\t\t\tsetPath(directory.root ? \"/\" : directory.path);\n\t\t}\n\t};\n\n\tconst itemCount = currentDirectory.getItemCount(showHidden);\n\n\treturn (\n\t\t<div className={!isSelector ? styles.FileExplorer : `${styles.FileExplorer} ${styles.Selector}`}>\n\t\t\t<div className={styles.Header}>\n\t\t\t\t<button\n\t\t\t\t\ttitle=\"Back\"\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={styles.IconButton}\n\t\t\t\t\tonClick={() => { undo(); }}\n\t\t\t\t\tdisabled={!undoAvailable}\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon icon={faCaretLeft}/>\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttitle=\"Forward\"\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={styles.IconButton}\n\t\t\t\t\tonClick={() => { redo(); }}\n\t\t\t\t\tdisabled={!redoAvailable}\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon icon={faCaretRight}/>\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttitle=\"Up\"\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={styles.IconButton}\n\t\t\t\t\tonClick={() => { changeDirectory(\"..\"); }}\n\t\t\t\t\tdisabled={currentDirectory.isRoot != null && currentDirectory.isRoot}\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon icon={faArrowUp}/>\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttitle=\"New\"\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={styles.IconButton}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\topenWindowedModal({\n\t\t\t\t\t\t\ttitle: \"Error\",\n\t\t\t\t\t\t\ticonUrl: app?.iconUrl as string | undefined,\n\t\t\t\t\t\t\tsize: new Vector2(300, 150),\n\t\t\t\t\t\t\tModal: (props: JSX.IntrinsicAttributes & ModalProps) =>\n\t\t\t\t\t\t\t\t<DialogBox {...props}>\n\t\t\t\t\t\t\t\t\t<p>This folder is protected.</p>\n\t\t\t\t\t\t\t\t\t<button data-type={ModalsConfig.DIALOG_CONTENT_TYPES.closeButton}>Ok</button>\n\t\t\t\t\t\t\t\t</DialogBox>,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// if (currentDirectory.canBeEdited) {\n\t\t\t\t\t\t// \tonNew(event);\n\t\t\t\t\t\t// } else {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t// }\n\t\t\t\t\t}}\n\t\t\t\t\tdisabled={!currentDirectory.canBeEdited}\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon icon={faPlus}/>\n\t\t\t\t</button>\n\t\t\t\t<input\n\t\t\t\t\tvalue={path}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\taria-label=\"Path\"\n\t\t\t\t\tclassName={styles.PathInput}\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tonChange={onPathChange as unknown as ChangeEventHandler}\n\t\t\t\t\tonKeyDown={onKeyDown as unknown as KeyboardEventHandler}\n\t\t\t\t\tplaceholder=\"Enter a path...\"\n\t\t\t\t/>\n\t\t\t\t<ImportButton directory={currentDirectory}/>\n\t\t\t\t<button title=\"Search\" tabIndex={0} className={styles.IconButton}>\n\t\t\t\t\t<FontAwesomeIcon icon={faSearch}/>\n\t\t\t\t</button>\n\t\t\t\t<button title=\"Settings\" tabIndex={0} className={styles.IconButton}>\n\t\t\t\t\t<FontAwesomeIcon icon={faCog}/>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div className={styles.Body}>\n\t\t\t\t<div className={styles.Sidebar}>\n\t\t\t\t\t<QuickAccessButton name={\"Home\"} onClick={() => { changeDirectory(\"~\"); }} icon={faHouse}/>\n\t\t\t\t\t<QuickAccessButton name={\"Desktop\"} onClick={() => { changeDirectory(\"~/Desktop\"); }} icon={faDesktop}/>\n\t\t\t\t\t<QuickAccessButton name={\"Images\"} onClick={() => { changeDirectory(\"~/Pictures\"); }} icon={faImage}/>\n\t\t\t\t\t<QuickAccessButton name={\"Documents\"} onClick={() => { changeDirectory(\"~/Documents\"); }} icon={faFileLines}/>\n\t\t\t\t</div>\n\t\t\t\t<DirectoryList\n\t\t\t\t\tdirectory={currentDirectory} \n\t\t\t\t\tid=\"main\"\n\t\t\t\t\tclassName={styles.Main}\n\t\t\t\t\tshowHidden={showHidden}\n\t\t\t\t\tonOpenFile={(event, file) => {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tif (isSelector)\n\t\t\t\t\t\t\treturn void onSelectionFinish?.();\n\t\t\t\t\t\tconst options: Record<string, string> = {};\n\t\t\t\t\t\tif (file.extension === \"md\" || (file.extension != null && CODE_EXTENSIONS.includes(file.extension)))\n\t\t\t\t\t\t\toptions.mode = \"view\";\n\t\t\t\t\t\twindowsManager?.openFile(file, options);\n\t\t\t\t\t}}\n\t\t\t\t\tonOpenFolder={(_event, folder) => {\n\t\t\t\t\t\tchangeDirectory((folder as VirtualFolderLink).linkedPath ?? folder.name);\n\t\t\t\t\t}}\n\t\t\t\t\tonContextMenuFile={onContextMenuFile as unknown as FileEventHandler}\n\t\t\t\t\tonContextMenuFolder={onContextMenuFolder as unknown as FolderEventHandler}\n\t\t\t\t\tallowMultiSelect={selectorMode !== SELECTOR_MODE.SINGLE}\n\t\t\t\t\tonSelectionChange={onSelectionChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{!isSelector\n\t\t\t\t? <span className={styles.Footer}>\n\t\t\t\t\t<p className={utilStyles.TextLight}>\n\t\t\t\t\t\t{itemCount === 1\n\t\t\t\t\t\t\t? itemCount + \" item\"\n\t\t\t\t\t\t\t: itemCount + \" items\"\n\t\t\t\t\t\t}\n\t\t\t\t\t</p>\n\t\t\t\t</span>\n\t\t\t\t: <div className={styles.Footer}>\n\t\t\t\t\t<Footer/>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t);\n}","export enum FileSelectorMode {\r\n\tNone = 0,\r\n\tSingle = 1,\r\n\tMulti = 2\r\n}","import { App, AppsConfig } from \"@prozilla-os/core\";\nimport { FileExplorer, FileExplorerProps } from \"./components/FileExplorer\";\n\nconst fileExplorer = new App<FileExplorerProps>(\"File Explorer\", \"file-explorer\", FileExplorer)\n\t.setIconUrl(\"https://os.prozilla.dev/assets/apps/icons/file-explorer.svg\")\n\t.setRole(AppsConfig.APP_ROLES.fileExplorer)\n\t.setCategory(\"Utilities & tools\");\nfileExplorer.setMetadata({ name: \"@prozilla-os/file-explorer\", version: \"1.1.15\", author: \"Prozilla\" });\n\n\nexport { fileExplorer };\nexport { FileSelectorMode } from \"./types/utils\";"],"names":["QuickAccessButton","onClick","icon","name","jsxs","styles","utilStyles","jsx","FontAwesomeIcon","ImportButton","directory","onChange","event","files","file","extension","VirtualFile","reader","result","virtualFile","faDownload","SELECTOR_MODE","FileProperties","modal","params","props","appsConfig","useSystemManager","associatedApp","WindowedModal","ImagePreview","StorageManager","FileExplorer","app","startPath","selectorMode","Footer","onSelectionChange","onSelectionFinish","isSelector","virtualRoot","useVirtualRoot","windowsManager","useWindowsManager","windowsConfig","currentDirectory","setCurrentDirectory","useState","path","setPath","showHidden","history","stateIndex","pushState","undo","redo","undoAvailable","redoAvailable","useHistory","alert","useAlert","openWindowedModal","useWindowedModal","onContextMenuFile","useContextMenu","Actions","ClickAction","_event","faTrash","faCircleInfo","Vector2","onContextMenuFolder","folder","changeDirectory","Divider","useCallback","absolute","useEffect","onError","error","VirtualRoot","onPathChange","onKeyDown","value","DialogBox","ModalsConfig","itemCount","faCaretLeft","faCaretRight","faArrowUp","faPlus","faSearch","faCog","faHouse","faDesktop","faImage","faFileLines","DirectoryList","options","CODE_EXTENSIONS","FileSelectorMode","fileExplorer","App","AppsConfig"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sources":["../src/components/QuickAccessButton.tsx","../src/components/ImportButton.tsx","../src/constants/fileExplorer.const.ts","../src/components/modals/file-properties/FileProperties.tsx","../src/components/FileExplorer.tsx","../src/types/utils.ts","../src/main.ts"],"sourcesContent":["import { FontAwesomeIcon, FontAwesomeIconProps } from \"@fortawesome/react-fontawesome\";\nimport styles from \"./FileExplorer.module.css\";\nimport { MouseEventHandler } from \"react\";\nimport { utilStyles } from \"@prozilla-os/core\";\n\ninterface QuickAcessButton {\n\tonClick: MouseEventHandler;\n\ticon: FontAwesomeIconProps[\"icon\"];\n\tname: string;\n}\n\nexport function QuickAccessButton({ onClick, icon, name }: QuickAcessButton) {\n\treturn (\n\t\t<button\n\t\t\ttabIndex={0}\n\t\t\tclassName={`${styles.NavButton} ${utilStyles.TextSemibold}`}\n\t\t\tonClick={onClick}\n\t\t>\n\t\t\t<FontAwesomeIcon icon={icon}/>\n\t\t\t{name}\n\t\t</button>\n\t);\n}","import { FormEventHandler, ReactElement } from \"react\";\nimport styles from \"./FileExplorer.module.css\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faDownload } from \"@fortawesome/free-solid-svg-icons\";\nimport { VirtualFolder, VirtualFile } from \"@prozilla-os/core\";\n\ninterface ImportButtonProps {\n\tdirectory: VirtualFolder;\n}\n\nexport function ImportButton({ directory }: ImportButtonProps): ReactElement {\n\tconst onChange = (event: InputEvent) => {\n\t\tconst files = (event.target as HTMLInputElement).files;\n\n\t\tif (files == null)\n\t\t\treturn;\n\n\t\tArray.from(files).forEach((file: File) => {\n\t\t\tconst { name, extension } = VirtualFile.splitId(file.name);\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = (event: Event) => {\n\t\t\t\tconst { result } = event.target as FileReader;\n\n\t\t\t\t// Create a file with the same name and extension, with a base64 string as a source\n\t\t\t\tdirectory.createFile(name, extension as string | undefined, (virtualFile) => {\n\t\t\t\t\tvirtualFile.setSource(result as string);\n\t\t\t\t});\n\t\t\t};\n\t\t\treader.readAsDataURL(file);\n\t\t});\n\t};\n\n\treturn <label title=\"Import\" tabIndex={0} className={styles.IconButton}>\n\t\t<input\n\t\t\ttype=\"file\"\n\t\t\tid=\"import\"\n\t\t\tmultiple\n\t\t\tstyle={{ display: \"none\" }}\n\t\t\tonChange={onChange as unknown as FormEventHandler}\n\t\t/>\n\t\t<FontAwesomeIcon icon={faDownload}/>\n\t</label>;\n}","export const SELECTOR_MODE = {\n\tNONE: 0,\n\tSINGLE: 1,\n\tMULTIPLE: 2,\n};","import styles from \"./FileProperties.module.css\";\nimport { ImagePreview, ModalProps, StorageManager, useSystemManager, utilStyles, VirtualFile, WindowedModal } from \"@prozilla-os/core\";\n\ninterface FilePropetiesProps extends ModalProps {\n\tfile: VirtualFile;\n}\n\nexport function FileProperties({ modal, params, file, ...props }: FilePropetiesProps) {\n\tconst { appsConfig } = useSystemManager();\n\tconst associatedApp = file.extension != null ? appsConfig.getAppByFileExtension(file.extension) : null;\n\n\treturn <WindowedModal className={styles.FileProperties} modal={modal} params={params} {...props}>\n\t\t<span className={styles.Section}>\n\t\t\t<ImagePreview className={styles.Icon} source={file.getIconUrl()}/>\n\t\t\t<p className={`${styles.Line} ${utilStyles.TextBold}`}>{file.id}</p>\n\t\t</span>\n\t\t<span className={styles.Section}>\n\t\t\t<p className={styles.Line}>Type: {file.getType()}</p>\n\t\t\t{associatedApp != null &&\n\t\t\t\t<span className={styles.Line}>\n\t\t\t\t\tOpens with: \n\t\t\t\t\t<ImagePreview className={styles.AppIcon} source={associatedApp.iconUrl ?? \"\"}/>\n\t\t\t\t\t{associatedApp.name}\n\t\t\t\t</span>\n\t\t\t}\n\t\t</span>\n\t\t<span className={styles.Section}>\n\t\t\t<p className={styles.Line}>Location: {file.path}</p>\n\t\t\t<p className={styles.Line}>Size: {StorageManager.getByteSize(file.source ?? file.content as string | null)} bytes</p>\n\t\t\t<p className={styles.Line}>Size on drive: {StorageManager.getByteSize(file.toString())} bytes</p>\n\t\t</span>\n\t\t<span className={styles.Section}>\n\t\t\t<p className={styles.Line}>Attributes: {file.isProtected ? \"Protected\" : \"N/A\"}</p>\n\t\t</span>\n\t</WindowedModal>;\n}","import { ChangeEventHandler, FC, KeyboardEventHandler, useCallback, useEffect, useState } from \"react\";\nimport styles from \"./FileExplorer.module.css\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faArrowUp, faCaretLeft, faCaretRight, faCircleInfo, faCog, faDesktop, faFileLines, faHouse, faImage, faPlus, faSearch, faTrash, faUpload } from \"@fortawesome/free-solid-svg-icons\";\nimport { QuickAccessButton } from \"./QuickAccessButton\";\nimport { ImportButton } from \"./ImportButton\";\nimport { Actions, ClickAction, CODE_EXTENSIONS, DialogBox, DirectoryList, Divider, FileEventHandler, FolderEventHandler, ModalProps, ModalsConfig, OnSelectionChangeParams, useAlert, useContextMenu, useHistory, useSystemManager, useVirtualRoot, useWindowedModal, useWindowsManager, utilStyles, Vector2, VirtualFile, VirtualFolder, VirtualFolderLink, VirtualRoot, WindowProps } from \"@prozilla-os/core\";\nimport { SELECTOR_MODE } from \"../constants/fileExplorer.const\";\nimport { FileProperties } from \"./modals/file-properties/FileProperties\";\nimport { JSX } from \"react/jsx-runtime\";\n\nexport interface FileExplorerProps extends WindowProps {\n\tpath?: string;\n\tselectorMode?: number;\n\tFooter?: FC;\n\tonSelectionChange?: (params: OnSelectionChangeParams) => void;\n\tonSelectionFinish?: () => void;\n}\n\nexport function FileExplorer({ app, path: startPath, selectorMode, Footer, onSelectionChange, onSelectionFinish }: FileExplorerProps) {\n\tconst isSelector = (Footer != null && selectorMode != null && selectorMode !== SELECTOR_MODE.NONE);\n\n\tconst virtualRoot = useVirtualRoot();\n\tconst windowsManager = useWindowsManager();\n\tconst { windowsConfig } = useSystemManager();\n\n\tconst [currentDirectory, setCurrentDirectory] = useState<VirtualFolder>(virtualRoot?.navigate(startPath ?? \"~\") as VirtualFolder);\n\tconst [path, setPath] = useState<string>(currentDirectory?.path ?? \"\");\n\tconst [showHidden] = useState(true);\n\tconst { history, stateIndex, pushState, undo, redo, undoAvailable, redoAvailable } = useHistory<string>(currentDirectory.path);\n\tconst { alert } = useAlert();\n\n\tconst { openWindowedModal } = useWindowedModal();\n\tconst { onContextMenu: onContextMenuFile } = useContextMenu({ Actions: (props) =>\n\t\t<Actions {...props}>\n\t\t\t<ClickAction label={!isSelector ? \"Open\" : \"Select\"} onTrigger={(_event, file) => {\n\t\t\t\tif (isSelector) {\n\t\t\t\t\tonSelectionChange?.({ files: [(file as VirtualFile).id], directory: currentDirectory });\n\t\t\t\t\tonSelectionFinish?.();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (windowsManager != null)\t(file as VirtualFile).open(windowsManager);\n\t\t\t}}/>\n\t\t\t{(props.triggerParams as VirtualFile)?.isDownloadable() && \n\t\t\t\t<ClickAction label=\"Export\" icon={faUpload} onTrigger={(_event, file) => {\n\t\t\t\t\t(file as VirtualFile).download();\n\t\t\t\t}}/>\n\t\t\t}\t\t\t\n\t\t\t<ClickAction label=\"Delete\" icon={faTrash} onTrigger={(_event, file) => {\n\t\t\t\t(file as VirtualFile).delete();\n\t\t\t}}/>\n\t\t\t<ClickAction label=\"Properties\" icon={faCircleInfo} onTrigger={(_event, file) => {\n\t\t\t\topenWindowedModal({\n\t\t\t\t\ttitle: `${(file as VirtualFile).id} ${windowsConfig.titleSeparator} Properties`,\n\t\t\t\t\ticonUrl: (file as VirtualFile).getIconUrl(),\n\t\t\t\t\tsize: new Vector2(400, 500),\n\t\t\t\t\tModal: (props: object) => <FileProperties file={file as VirtualFile} {...props}/>,\n\t\t\t\t});\n\t\t\t}}/>\n\t\t</Actions>,\n\t});\n\tconst { onContextMenu: onContextMenuFolder } = useContextMenu({ Actions: (props) =>\n\t\t<Actions {...props}>\n\t\t\t<ClickAction label=\"Open\" onTrigger={(_event, folder) => {\n\t\t\t\tchangeDirectory((folder as VirtualFolderLink).linkedPath ?? (folder as VirtualFolder).name);\n\t\t\t}}/>\n\t\t\t{/* <ClickAction label={`Open in ${APP_NAMES.TERMINAL}`} icon={APP_ICONS.TERMINAL} onTrigger={(event, folder) => {\n\t\t\t\twindowsManager?.open(APPS.TERMINAL, { startPath: (folder as VirtualFolder).path });\n\t\t\t}}/> */}\n\t\t\t<Divider/>\n\t\t\t<ClickAction label=\"Delete\" icon={faTrash} onTrigger={(_event, folder) => {\n\t\t\t\t(folder as VirtualFolder).delete();\n\t\t\t}}/>\n\t\t</Actions>,\n\t});\n\t// const { onContextMenu: onNew } = useContextMenu({\n\t// \tmodalsManager,\n\t// \toptions: {\n\t// \t\t\"File\": () => { currentDirectory.createFile(\"New File\"); },\n\t// \t\t\"Folder\": () => { currentDirectory.createFolder(\"New Folder\"); }\n\t// \t}\n\t// });\n\n\tconst changeDirectory = useCallback((path: string, absolute = false) => {\n\t\tif (path == null)\n\t\t\treturn;\n\n\t\tif (currentDirectory == null)\n\t\t\tabsolute = true;\n\n\t\tconst directory = absolute ? virtualRoot?.navigate(path) : currentDirectory.navigate(path);\n\n\t\tif (directory != null) {\n\t\t\tsetCurrentDirectory(directory as VirtualFolder);\n\t\t\tsetPath(directory.root ? \"/\" : directory.path);\n\t\t\tpushState(directory.path);\n\t\t}\n\t}, [currentDirectory, pushState, virtualRoot]);\n\n\tuseEffect(() => {\n\t\tif (history.length === 0)\n\t\t\treturn;\n\n\t\tconst path = history[stateIndex];\n\t\tconst directory = virtualRoot?.navigate(path);\n\t\tif (directory != null) {\n\t\t\tsetCurrentDirectory(directory as VirtualFolder);\n\t\t\tsetPath(directory.root ? \"/\" : directory.path);\n\t\t}\n\t}, [history, stateIndex, virtualRoot]);\n\n\tuseEffect(() => {\n\t\ttype Error = { message: string };\n\t\tconst onError = (error: unknown) => {\n\t\t\talert({\n\t\t\t\ttitle: (error as Error).message,\n\t\t\t\ttext: \"You have exceeded the virtual drive capacity. Files and folders will not be saved until more storage is freed.\",\n\t\t\t\ticonUrl: app?.iconUrl as string | undefined,\n\t\t\t\tsize: new Vector2(300, 200),\n\t\t\t\tsingle: true,\n\t\t\t});\n\t\t};\n\n\t\tvirtualRoot?.on(VirtualRoot.EVENT_NAMES.error, onError);\n\n\t\treturn () => {\n\t\t\tvirtualRoot?.off(VirtualRoot.EVENT_NAMES.error, onError);\n\t\t};\n\t}, []);\n\n\tconst onPathChange = (event: Event) => {\n\t\tsetPath((event.target as HTMLInputElement).value);\n\t};\n\n\tconst onKeyDown = (event: KeyboardEvent) => {\n\t\tlet value = (event.target as HTMLInputElement).value;\n\n\t\tif (event.key === \"Enter\") {\n\t\t\tif (value === \"\")\n\t\t\t\tvalue = \"~\";\n\n\t\t\tconst directory = virtualRoot?.navigate(value);\n\n\t\t\tif (directory == null) {\n\t\t\t\topenWindowedModal({\n\t\t\t\t\ttitle: \"Error\",\n\t\t\t\t\ticonUrl: app?.iconUrl as string | undefined,\n\t\t\t\t\tsize: new Vector2(300, 150),\n\t\t\t\t\tModal: (props: JSX.IntrinsicAttributes & ModalProps) =>\n\t\t\t\t\t\t<DialogBox {...props}>\n\t\t\t\t\t\t\t<p>Invalid path: \"{value}\"</p>\n\t\t\t\t\t\t\t<button data-type={ModalsConfig.DIALOG_CONTENT_TYPES.closeButton}>Ok</button>\n\t\t\t\t\t\t</DialogBox>,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetCurrentDirectory(directory as VirtualFolder);\n\t\t\tsetPath(directory.root ? \"/\" : directory.path);\n\t\t}\n\t};\n\n\tconst itemCount = currentDirectory.getItemCount(showHidden);\n\n\treturn (\n\t\t<div className={!isSelector ? styles.FileExplorer : `${styles.FileExplorer} ${styles.Selector}`}>\n\t\t\t<div className={styles.Header}>\n\t\t\t\t<button\n\t\t\t\t\ttitle=\"Back\"\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={styles.IconButton}\n\t\t\t\t\tonClick={() => { undo(); }}\n\t\t\t\t\tdisabled={!undoAvailable}\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon icon={faCaretLeft}/>\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttitle=\"Forward\"\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={styles.IconButton}\n\t\t\t\t\tonClick={() => { redo(); }}\n\t\t\t\t\tdisabled={!redoAvailable}\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon icon={faCaretRight}/>\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttitle=\"Up\"\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={styles.IconButton}\n\t\t\t\t\tonClick={() => { changeDirectory(\"..\"); }}\n\t\t\t\t\tdisabled={currentDirectory.isRoot != null && currentDirectory.isRoot}\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon icon={faArrowUp}/>\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttitle=\"New\"\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tclassName={styles.IconButton}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\topenWindowedModal({\n\t\t\t\t\t\t\ttitle: \"Error\",\n\t\t\t\t\t\t\ticonUrl: app?.iconUrl as string | undefined,\n\t\t\t\t\t\t\tsize: new Vector2(300, 150),\n\t\t\t\t\t\t\tModal: (props: JSX.IntrinsicAttributes & ModalProps) =>\n\t\t\t\t\t\t\t\t<DialogBox {...props}>\n\t\t\t\t\t\t\t\t\t<p>This folder is protected.</p>\n\t\t\t\t\t\t\t\t\t<button data-type={ModalsConfig.DIALOG_CONTENT_TYPES.closeButton}>Ok</button>\n\t\t\t\t\t\t\t\t</DialogBox>,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// if (currentDirectory.canBeEdited) {\n\t\t\t\t\t\t// \tonNew(event);\n\t\t\t\t\t\t// } else {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t// }\n\t\t\t\t\t}}\n\t\t\t\t\tdisabled={!currentDirectory.canBeEdited}\n\t\t\t\t>\n\t\t\t\t\t<FontAwesomeIcon icon={faPlus}/>\n\t\t\t\t</button>\n\t\t\t\t<input\n\t\t\t\t\tvalue={path}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\taria-label=\"Path\"\n\t\t\t\t\tclassName={styles.PathInput}\n\t\t\t\t\ttabIndex={0}\n\t\t\t\t\tonChange={onPathChange as unknown as ChangeEventHandler}\n\t\t\t\t\tonKeyDown={onKeyDown as unknown as KeyboardEventHandler}\n\t\t\t\t\tplaceholder=\"Enter a path...\"\n\t\t\t\t/>\n\t\t\t\t<ImportButton directory={currentDirectory}/>\n\t\t\t\t<button title=\"Search\" tabIndex={0} className={styles.IconButton}>\n\t\t\t\t\t<FontAwesomeIcon icon={faSearch}/>\n\t\t\t\t</button>\n\t\t\t\t<button title=\"Settings\" tabIndex={0} className={styles.IconButton}>\n\t\t\t\t\t<FontAwesomeIcon icon={faCog}/>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div className={styles.Body}>\n\t\t\t\t<div className={styles.Sidebar}>\n\t\t\t\t\t<QuickAccessButton name={\"Home\"} onClick={() => { changeDirectory(\"~\"); }} icon={faHouse}/>\n\t\t\t\t\t<QuickAccessButton name={\"Desktop\"} onClick={() => { changeDirectory(\"~/Desktop\"); }} icon={faDesktop}/>\n\t\t\t\t\t<QuickAccessButton name={\"Images\"} onClick={() => { changeDirectory(\"~/Pictures\"); }} icon={faImage}/>\n\t\t\t\t\t<QuickAccessButton name={\"Documents\"} onClick={() => { changeDirectory(\"~/Documents\"); }} icon={faFileLines}/>\n\t\t\t\t</div>\n\t\t\t\t<DirectoryList\n\t\t\t\t\tdirectory={currentDirectory} \n\t\t\t\t\tid=\"main\"\n\t\t\t\t\tclassName={styles.Main}\n\t\t\t\t\tshowHidden={showHidden}\n\t\t\t\t\tonOpenFile={(event, file) => {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tif (isSelector)\n\t\t\t\t\t\t\treturn void onSelectionFinish?.();\n\t\t\t\t\t\tconst options: Record<string, string> = {};\n\t\t\t\t\t\tif (file.extension === \"md\" || (file.extension != null && CODE_EXTENSIONS.includes(file.extension)))\n\t\t\t\t\t\t\toptions.mode = \"view\";\n\t\t\t\t\t\twindowsManager?.openFile(file, options);\n\t\t\t\t\t}}\n\t\t\t\t\tonOpenFolder={(_event, folder) => {\n\t\t\t\t\t\tchangeDirectory((folder as VirtualFolderLink).linkedPath ?? folder.name);\n\t\t\t\t\t}}\n\t\t\t\t\tonContextMenuFile={onContextMenuFile as unknown as FileEventHandler}\n\t\t\t\t\tonContextMenuFolder={onContextMenuFolder as unknown as FolderEventHandler}\n\t\t\t\t\tallowMultiSelect={selectorMode !== SELECTOR_MODE.SINGLE}\n\t\t\t\t\tonSelectionChange={onSelectionChange}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{!isSelector\n\t\t\t\t? <span className={styles.Footer}>\n\t\t\t\t\t<p className={utilStyles.TextLight}>\n\t\t\t\t\t\t{itemCount === 1\n\t\t\t\t\t\t\t? itemCount + \" item\"\n\t\t\t\t\t\t\t: itemCount + \" items\"\n\t\t\t\t\t\t}\n\t\t\t\t\t</p>\n\t\t\t\t</span>\n\t\t\t\t: <div className={styles.Footer}>\n\t\t\t\t\t<Footer/>\n\t\t\t\t</div>\n\t\t\t}\n\t\t</div>\n\t);\n}","export enum FileSelectorMode {\n\tNone = 0,\n\tSingle = 1,\n\tMulti = 2\n}","import { App, AppsConfig } from \"@prozilla-os/core\";\nimport { FileExplorer, FileExplorerProps } from \"./components/FileExplorer\";\n\nconst fileExplorer = new App<FileExplorerProps>(\"File Explorer\", \"file-explorer\", FileExplorer)\n\t.setIconUrl(\"https://os.prozilla.dev/assets/apps/icons/file-explorer.svg\")\n\t.setRole(AppsConfig.APP_ROLES.fileExplorer)\n\t.setCategory(\"Utilities & tools\");\nfileExplorer.setMetadata({ name: \"@prozilla-os/file-explorer\", version: \"1.1.16\", author: \"Prozilla\" });\n\n\nexport { fileExplorer };\nexport { FileSelectorMode } from \"./types/utils\";"],"names":["QuickAccessButton","onClick","icon","name","jsxs","styles","utilStyles","jsx","FontAwesomeIcon","ImportButton","directory","onChange","event","files","file","extension","VirtualFile","reader","result","virtualFile","faDownload","SELECTOR_MODE","FileProperties","modal","params","props","appsConfig","useSystemManager","associatedApp","WindowedModal","ImagePreview","StorageManager","FileExplorer","app","startPath","selectorMode","Footer","onSelectionChange","onSelectionFinish","isSelector","virtualRoot","useVirtualRoot","windowsManager","useWindowsManager","windowsConfig","currentDirectory","setCurrentDirectory","useState","path","setPath","showHidden","history","stateIndex","pushState","undo","redo","undoAvailable","redoAvailable","useHistory","alert","useAlert","openWindowedModal","useWindowedModal","onContextMenuFile","useContextMenu","Actions","ClickAction","_event","_a","faUpload","faTrash","faCircleInfo","Vector2","onContextMenuFolder","folder","changeDirectory","Divider","useCallback","absolute","useEffect","onError","error","VirtualRoot","onPathChange","onKeyDown","value","DialogBox","ModalsConfig","itemCount","faCaretLeft","faCaretRight","faArrowUp","faPlus","faSearch","faCog","faHouse","faDesktop","faImage","faFileLines","DirectoryList","options","CODE_EXTENSIONS","FileSelectorMode","fileExplorer","App","AppsConfig"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prozilla-os/file-explorer",
|
|
3
3
|
"description": "A standard ProzillaOS application for browsing files.",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.17",
|
|
5
5
|
"homepage": "https://os.prozilla.dev/file-explorer",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Prozilla",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"@fortawesome/free-solid-svg-icons": "^6.5.2",
|
|
24
24
|
"@fortawesome/react-fontawesome": "^0.2.2",
|
|
25
25
|
"react": "^18.3.1",
|
|
26
|
-
"@prozilla-os/core": "1.3.
|
|
26
|
+
"@prozilla-os/core": "1.3.12"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^20.14.5",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"vite": "^5.4.8",
|
|
34
34
|
"vite-plugin-dts": "^3.9.1",
|
|
35
35
|
"vite-plugin-lib-inject-css": "^2.1.1",
|
|
36
|
-
"@prozilla-os/dev-tools": "1.1.
|
|
36
|
+
"@prozilla-os/dev-tools": "1.1.9"
|
|
37
37
|
},
|
|
38
38
|
"files": [
|
|
39
39
|
"dist"
|