@webhandle/tree-file-browser 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 (39) hide show
  1. package/README.md +144 -0
  2. package/client-lib/base-image-name.mjs +41 -0
  3. package/client-lib/data-to-image.mjs +45 -0
  4. package/client-lib/dynamic-load.mjs +21 -0
  5. package/client-lib/file-select-dialog.mjs +70 -0
  6. package/client-lib/form-answer-dialog.mjs +65 -0
  7. package/client-lib/format-bytes.mjs +10 -0
  8. package/client-lib/get-extension-from-mime.mjs +17 -0
  9. package/client-lib/get-file-image-stats.mjs +17 -0
  10. package/client-lib/get-image-stats.mjs +11 -0
  11. package/client-lib/image-browser-view-methods/create-directory.mjs +23 -0
  12. package/client-lib/image-browser-view-methods/delete.mjs +100 -0
  13. package/client-lib/image-browser-view-methods/drag-and-drop.mjs +57 -0
  14. package/client-lib/image-browser-view-methods/file-obj-manipulation.mjs +190 -0
  15. package/client-lib/image-browser-view-methods/sink.mjs +20 -0
  16. package/client-lib/image-browser-view-methods/upload.mjs +159 -0
  17. package/client-lib/image-browser-view-methods/utils.mjs +108 -0
  18. package/client-lib/image-browser-view-methods/view-interactions.mjs +96 -0
  19. package/client-lib/image-browser-view.mjs +227 -0
  20. package/client-lib/image-resize.mjs +32 -0
  21. package/client-lib/info-dialog.mjs +36 -0
  22. package/client-lib/load-styles.mjs +14 -0
  23. package/client-lib/make-image-set.mjs +75 -0
  24. package/client-lib/name-parts.mjs +24 -0
  25. package/client-lib/styles-loaded.mjs +18 -0
  26. package/less/components.less +357 -0
  27. package/package.json +80 -0
  28. package/public/tree-file-browser/resources/css/tree-browser.css +394 -0
  29. package/public/tree-file-browser/resources/css/tree-browser.css.map +1 -0
  30. package/public/tree-file-browser/resources/js/tree-file-browser.js +2 -0
  31. package/public/tree-file-browser/resources/js/tree-file-browser.js.map +1 -0
  32. package/server-lib/initialize-tree-browser-resources.cjs +17 -0
  33. package/server-lib/initialize-tree-browser-resources.mjs +15 -0
  34. package/views/load-browser-views.js +13 -0
  35. package/views/webhandle-tree-image-browser/extension-pill.tri +1 -0
  36. package/views/webhandle-tree-image-browser/guilded-file-upload-form.tri +11 -0
  37. package/views/webhandle-tree-image-browser/guilded-image-upload-form.tri +33 -0
  38. package/views/webhandle-tree-image-browser/image-browser-frame.tri +122 -0
  39. package/views/webhandle-tree-image-browser/variant-choice-box.tri +25 -0
@@ -0,0 +1,357 @@
1
+
2
+ .webhandle-file-tree-image-browser-colors() {
3
+ @webhandle-file-tree-image-box-background: #eeeeee;
4
+ @webhandle-file-tree-image-selected-box-hightlight: blue;
5
+ }
6
+
7
+ .webhandle-file-tree-image-browser-colors();
8
+
9
+ .webhandle-file-tree-image-browser-test {
10
+ background-color: #656963;
11
+ }
12
+
13
+ .webhandle-file-tree-image-browser {
14
+ --webhandle-file-tree-image-box-background: @webhandle-file-tree-image-box-background;
15
+ --webhandle-file-tree-image-selected-box-hightlight: @webhandle-file-tree-image-selected-box-hightlight;
16
+
17
+ @box-padding-right: 20px;
18
+
19
+
20
+ .file-lines {
21
+ grid-auto-flow: row dense;
22
+ grid-template-columns: 100px 1fr auto auto auto;
23
+ overflow-x: hidden;
24
+
25
+ .variant-choice-box {
26
+ display: contents;
27
+ .bottom {
28
+ display: contents;
29
+
30
+ .content {
31
+ display: contents;
32
+ }
33
+ }
34
+
35
+ &.selected {
36
+ .extensions, .basename, .size-line, .actions, .img {
37
+ z-index: 2;
38
+ }
39
+
40
+ .img:before {
41
+ content: '\00a0';
42
+ position: absolute;
43
+ top: -3px;
44
+ bottom: 0px;
45
+ left: -3px;
46
+ width: 100vw;
47
+ background-color: #f0f0f0;
48
+ }
49
+ }
50
+ }
51
+
52
+ .extensions {
53
+ // align-self: start;
54
+ display: block !important;
55
+ grid-column: 3;
56
+ padding-top: 3px;
57
+ .extension-pill {
58
+ display: inline-block;
59
+ margin-right: 2px;
60
+ }
61
+
62
+ }
63
+ .basename {
64
+ grid-column: 2;
65
+ }
66
+ .size-line {
67
+ grid-column: 4;
68
+ }
69
+ .img {
70
+ max-width: 100px;
71
+
72
+ .thumbnail-icon {
73
+ font-size: 30px;
74
+ position: relative;
75
+ z-index: 2;
76
+ }
77
+ }
78
+ .actions {
79
+ grid-column: 5;
80
+ }
81
+ }
82
+
83
+ .image-browser {
84
+ .image-browser-frame {
85
+ position: relative;
86
+ display: grid;
87
+ grid-template-columns: minmax(300px, 30%) 1fr;
88
+ column-gap: 20px;
89
+ background-color: white;
90
+
91
+ & > .directory-side {
92
+ height: 800px;
93
+ .the-dialog & {
94
+ max-height: 67vh;
95
+ }
96
+ max-height: 90vh;
97
+ position: relative;
98
+
99
+ display: grid;
100
+ grid-template-rows: 1fr auto;
101
+
102
+ button {
103
+ border: none;
104
+ background-color: transparent;
105
+ color: white;
106
+ }
107
+ .directory-controls {
108
+ background-color: #393C40;
109
+ }
110
+ }
111
+ }
112
+
113
+
114
+ .node-content {
115
+ position: relative;
116
+ }
117
+ .box-holder {
118
+ position: absolute;
119
+ box-sizing: border-box;
120
+ height: 100%;
121
+ width: 100%;
122
+ top: 0;
123
+ left: 0;
124
+ overflow: auto;
125
+ padding-right: @box-padding-right;
126
+ padding-bottom: 20px;
127
+ padding-top: 3px;
128
+ padding-left: 3px;
129
+ }
130
+
131
+ .node-view {
132
+ display: grid;
133
+ grid-template-rows: auto 1fr auto;
134
+ row-gap: 12px;
135
+
136
+ .view-controls {
137
+ display: grid;
138
+ grid-template-columns: auto auto;
139
+ padding-right: @box-padding-right;
140
+ padding-top: 4px;
141
+
142
+ .right {
143
+ text-align: right;
144
+ -webkit-user-select: none; /* Safari */
145
+ user-select: none; /* Standard syntax */
146
+ }
147
+
148
+
149
+ button {
150
+ border: none;
151
+ background: none;
152
+ }
153
+
154
+ }
155
+ }
156
+
157
+ .choice-boxes {
158
+ display: grid;
159
+ grid-template-columns: repeat(3, 1fr);
160
+ column-gap: 20px;
161
+ row-gap: 20px;
162
+
163
+ &.grid-small {
164
+ grid-template-columns: repeat(5, 1fr);
165
+ }
166
+ &.rows {
167
+ .webhandle-file-tree-image-browser.file-lines();
168
+ }
169
+
170
+ &.list-text {
171
+ .webhandle-file-tree-image-browser.file-lines();
172
+ grid-template-columns: auto 1fr auto auto auto;
173
+ row-gap: 5px;
174
+ .img {
175
+ aspect-ratio: auto;
176
+ img {
177
+ display: none;
178
+ }
179
+ .thumbnail-icon {
180
+ font-size: 0;
181
+ }
182
+ }
183
+ }
184
+ }
185
+
186
+ .variant-choice-box {
187
+ padding: 10px;
188
+ border-radius: 5px;
189
+ box-shadow: 1px 1px 5px #cccccc;
190
+ -webkit-user-select: none; /* Safari */
191
+ user-select: none; /* Standard syntax */
192
+
193
+ .img {
194
+ display: grid;
195
+ aspect-ratio: 1.6;
196
+ position: relative;
197
+
198
+ .thumbnail-icon {
199
+ font-size: 70px;
200
+ }
201
+
202
+ & > span {
203
+ grid-column: 1;
204
+ grid-row: 1;
205
+ justify-self: center;
206
+ align-self: center;
207
+ }
208
+
209
+ img {
210
+ position: absolute;
211
+ top: 50%;
212
+ left: 50%;
213
+ transform: translate(-50%, -50%);
214
+ max-width: 100%;
215
+ max-height: 100%;
216
+ }
217
+ }
218
+
219
+ .bottom {
220
+ display: grid;
221
+ grid-template-columns: 1fr auto;
222
+ .basename {
223
+ display: inline;
224
+ }
225
+
226
+ .extensions {
227
+ display: inline-flex;
228
+ column-gap: 5px;
229
+ }
230
+
231
+ .actions {
232
+ button {
233
+ border: 0;
234
+ background: none;
235
+ cursor: pointer;
236
+ }
237
+ }
238
+ }
239
+
240
+ &.selected {
241
+ box-shadow: 1px 1px 10px var(--webhandle-file-tree-image-selected-box-hightlight);
242
+ }
243
+ &.hidden {
244
+ display: none;
245
+ & > * {
246
+ display: none !important;
247
+ }
248
+ }
249
+ }
250
+
251
+
252
+ .bottom-controls {
253
+ display: grid;
254
+ grid-template-columns: 1fr auto;
255
+ padding-right: 34px;
256
+ padding-top: 10px;
257
+
258
+ button {
259
+ border: none;
260
+ background-color: transparent;
261
+ }
262
+ }
263
+
264
+ .drop-cover {
265
+ position: absolute;
266
+ inset: 0;
267
+ background-color: rgba(255, 255, 255, .8);
268
+ z-index: -1;
269
+
270
+ display: grid;
271
+ column-gap: 30px;
272
+ row-gap: 30px;
273
+ transition: opacity .3s;
274
+ opacity: .2;
275
+
276
+ .drop-type {
277
+ display: flex;
278
+ align-items: center;
279
+ text-align: center;
280
+
281
+ padding: 12px;
282
+ border: solid 1px black;
283
+ border-radius: 5px;
284
+ box-shadow: 1px 1px 5px #cccccc;
285
+ background-color: fade(@webhandle-file-tree-image-box-background, 70%);
286
+
287
+ .msg {
288
+ width: 100%;
289
+ }
290
+
291
+ &:hover {
292
+ background-color: @webhandle-file-tree-image-box-background;
293
+
294
+ }
295
+ }
296
+
297
+ &.file-dropping {
298
+ z-index: 2;
299
+ opacity: 1;
300
+ }
301
+ }
302
+
303
+ .img-drop-cover {
304
+
305
+ grid-template-columns: repeat(3, 1fr);
306
+ grid-template-rows: repeat(4, 1fr);
307
+
308
+
309
+ .guided-upload {
310
+ grid-row: 1 / span 4;
311
+ grid-column: 1 / span 2;
312
+ }
313
+ .automatic {
314
+ grid-row: 1 / span 3;
315
+ grid-column: 3;
316
+ }
317
+ .literal {
318
+ grid-row: 4;
319
+ grid-column: 3;
320
+ }
321
+
322
+ }
323
+
324
+
325
+ }
326
+
327
+
328
+ .extension-pill {
329
+ padding: 3px 5px;
330
+ border-radius: 5px;
331
+ background-color: var(--webhandle-file-tree-image-box-background);
332
+ }
333
+
334
+ .radio-options {
335
+ label {
336
+ display: inline-block;
337
+ position: relative;
338
+ input[type=radio] {
339
+ position: absolute;
340
+ display: inline-block;
341
+ left: -10000px;
342
+ }
343
+ input[type=radio]:not(:checked) + .extension-pill {
344
+ background-color: transparent;
345
+ }
346
+
347
+ }
348
+ }
349
+
350
+ .hidden-elements {
351
+ position: absolute;
352
+ left: -10000px;
353
+ top: 0;
354
+ }
355
+
356
+ }
357
+
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@webhandle/tree-file-browser",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "client-lib/image-browser-view.mjs",
6
+ "scripts": {
7
+ "test": "node_modules/mocha/bin/mocha",
8
+ "less-build": "npx lessc --source-map --source-map-include-source less/pages.less public/css/pages.css; npx lessc --source-map --source-map-include-source less/components.less public/tree-file-browser/resources/css/tree-browser.css",
9
+ "less-compress": "npx uglifycss public/css/pages.css > public/css/pages.min.css",
10
+ "client-js-build": "npx webpack --config pages.webpack.cjs",
11
+ "client-js-compress": "npx uglifyjs public/js/pages.cjs -o public/js/pages.min.cjs -c --source-map url=public/js/pages.min.cjs.map",
12
+ "client-js-browserify-build": "npm run client-js-pages-browserify-build",
13
+ "client-js-pages-browserify build": "npx browserify client-js/pages.cjs --debug | npx exorcist public/js/pages.cjs.map > public/js/pages.cjs",
14
+ "dev-less-watch": "onchange 'less/**/*.less' -- npm run less-build",
15
+ "dev-client-js-watch": "onchange 'client-lib/**/*js' 'views/webhandle-tree-image-browser/**/*tri' 'client-js/**/*js' -- npm run client-js-build",
16
+ "dev-server-js-watch": "onchange 'server-lib/**/*js' 'server-js/**/*js' -- pm2 restart webhandle-tree-image-browser-web",
17
+ "start": "node ./web-server.js",
18
+ "testDebug": "node --inspect-brk node_modules/mocha/bin/mocha",
19
+ "bg": "parallelshell 'npm run dev-less-watch' 'npm run dev-client-js-watch'",
20
+ "pm2-bg": "parallelshell 'npm run dev-less-watch' 'npm run dev-client-js-watch' 'npm run dev-server-js-watch'",
21
+ "dev": "parallelshell 'npm run start' 'npm run dev-less-watch' 'npm run dev-client-js-watch'"
22
+ },
23
+ "keywords": [],
24
+ "author": "",
25
+ "license": "ISC",
26
+ "devDependencies": {
27
+ "@dankolz/ei-css-grid": "^1.0.0",
28
+ "@webhandle/event-notification-panel": "^1.0.0",
29
+ "browserify": "^14.4.0",
30
+ "chai": "^4.3.4",
31
+ "ei-form-styles-1": "^1.0.2",
32
+ "ei-pic-browser": "^1.0.15",
33
+ "exorcist": "^2.0.0",
34
+ "express": "^4.17.1",
35
+ "file-sink": "^1.0.13",
36
+ "file-sink-remote-http": "^1.0.2",
37
+ "file-sink-server": "^1.0.5",
38
+ "filter-log": "0.0.5",
39
+ "jsdoc": "^3.6.11",
40
+ "less": "^3.10.3",
41
+ "mocha": "^9.1.3",
42
+ "node-polyfill-webpack-plugin": "^2.0.1",
43
+ "onchange": "^3.2.1",
44
+ "parallelshell": "3.0.1",
45
+ "raw-loader": "^4.0.2",
46
+ "tripartite": "^1.1.1",
47
+ "uglify-js": "^3.17.4",
48
+ "webhandle": "^1.0.32",
49
+ "webhandle-js-widget-setup": "^1.0.5",
50
+ "webpack-cli": "^5.1.4"
51
+ },
52
+ "dependencies": {
53
+ "@dankolz/escape-html-attribute-value": "^1.0.0",
54
+ "@dankolz/webhandle-admin-icons": "^1.0.2",
55
+ "@dankolz/webp-detection": "^1.0.14",
56
+ "@webhandle/backbone-view": "^1.0.1",
57
+ "@webhandle/gather-form-data": "^1.0.0",
58
+ "@webhandle/minimal-browser-event-emitter": "^1.0.2",
59
+ "ei-dialog": "^1.0.9",
60
+ "form-value-injector": "^1.0.6",
61
+ "input-value-injector": "^1.0.11",
62
+ "kalpa-tree-on-page": "^1.0.2",
63
+ "select-value-injector": "^1.0.3",
64
+ "textarea-value-injector": "^1.0.3"
65
+ },
66
+ "browserify": {
67
+ "transform": [
68
+ "tripartite/browserify-transform"
69
+ ]
70
+ },
71
+ "files": [
72
+ "/client-lib",
73
+ "/less/components.less",
74
+ "/server-lib",
75
+ "public/tree-file-browser",
76
+ "/views/load-browser-views.js",
77
+ "/views/webhandle-tree-image-browser"
78
+ ],
79
+ "type": "module"
80
+ }