Add Gallery

This commit is contained in:
Miloš Holba
2020-08-08 21:46:56 +02:00
parent a947882449
commit 785dade6b2
15 changed files with 144565 additions and 3629 deletions

View File

@@ -1,71 +0,0 @@
APP_NAME=VueFileManager
APP_ENV=production
APP_KEY=base64:sB1YuKsbWv7MdWugb9ZsYBqv2QZJ+QOuHZHEddOsUuo=
APP_DEBUG=true
APP_URL=http://localhost
APP_DEMO=false
LOG_CHANNEL=stack
SCOUT_DRIVER=tntsearch
FILESYSTEM_DRIVER=
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=
MAIL_FROM_ADDRESS="${MAIL_USERNAME}"
MAIL_FROM_NAME="${MAIL_USERNAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
DO_SPACES_KEY=
DO_SPACES_SECRET=
DO_SPACES_ENDPOINT=
DO_SPACES_REGION=
DO_SPACES_BUCKET=
WASABI_KEY=
WASABI_SECRET=
WASABI_ENDPOINT=
WASABI_REGION=
WASABI_BUCKET=
BACKBLAZE_KEY=
BACKBLAZE_SECRET=
BACKBLAZE_ENDPOINT=
BACKBLAZE_REGION=
BACKBLAZE_BUCKET=
PASSPORT_CLIENT_ID=
PASSPORT_CLIENT_SECRET=
APP_DEPLOY_SECRET=
CASHIER_LOGGER=stack
CASHIER_CURRENCY=
STRIPE_KEY=
STRIPE_SECRET=
STRIPE_WEBHOOK_SECRET=
CASHIER_PAYMENT_NOTIFICATION=App\Notifications\ConfirmPayment

323
package-lock.json generated
View File

@@ -993,19 +993,12 @@
"integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
"dev": true "dev": true
}, },
"@types/events": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
"integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
"dev": true
},
"@types/glob": { "@types/glob": {
"version": "7.1.1", "version": "7.1.3",
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/events": "*",
"@types/minimatch": "*", "@types/minimatch": "*",
"@types/node": "*" "@types/node": "*"
} }
@@ -1017,9 +1010,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "13.11.0", "version": "14.0.27",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.11.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.27.tgz",
"integrity": "sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ==", "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==",
"dev": true "dev": true
}, },
"@types/q": { "@types/q": {
@@ -1353,8 +1346,7 @@
"ajv-keywords": { "ajv-keywords": {
"version": "3.4.1", "version": "3.4.1",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
"integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ=="
"dev": true
}, },
"alphanum-sort": { "alphanum-sort": {
"version": "1.0.2", "version": "1.0.2",
@@ -1725,6 +1717,11 @@
"object.assign": "^4.1.0" "object.assign": "^4.1.0"
} }
}, },
"babel-plugin-syntax-dynamic-import": {
"version": "6.18.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
"integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo="
},
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -1808,8 +1805,7 @@
"big.js": { "big.js": {
"version": "5.2.2", "version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
"dev": true
}, },
"binary-extensions": { "binary-extensions": {
"version": "1.13.1", "version": "1.13.1",
@@ -3323,9 +3319,9 @@
"dev": true "dev": true
}, },
"elliptic": { "elliptic": {
"version": "6.5.2", "version": "6.5.3",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
"integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
"dev": true, "dev": true,
"requires": { "requires": {
"bn.js": "^4.4.0", "bn.js": "^4.4.0",
@@ -3345,8 +3341,7 @@
"emojis-list": { "emojis-list": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
"dev": true
}, },
"encodeurl": { "encodeurl": {
"version": "1.0.2", "version": "1.0.2",
@@ -3513,9 +3508,9 @@
"dev": true "dev": true
}, },
"eventemitter3": { "eventemitter3": {
"version": "4.0.0", "version": "4.0.4",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
"integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
"dev": true "dev": true
}, },
"events": { "events": {
@@ -5065,9 +5060,9 @@
"dev": true "dev": true
}, },
"html-entities": { "html-entities": {
"version": "1.2.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz",
"integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==",
"dev": true "dev": true
}, },
"html-loader": { "html-loader": {
@@ -5125,16 +5120,10 @@
} }
} }
}, },
"http-parser-js": {
"version": "0.4.10",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
"integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=",
"dev": true
},
"http-proxy": { "http-proxy": {
"version": "1.18.0", "version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"eventemitter3": "^4.0.0", "eventemitter3": "^4.0.0",
@@ -5805,7 +5794,6 @@
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz",
"integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==",
"dev": true,
"requires": { "requires": {
"minimist": "^1.2.5" "minimist": "^1.2.5"
}, },
@@ -5813,8 +5801,7 @@
"minimist": { "minimist": {
"version": "1.2.5", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
"dev": true
} }
} }
}, },
@@ -5967,7 +5954,6 @@
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
"dev": true,
"requires": { "requires": {
"big.js": "^5.2.2", "big.js": "^5.2.2",
"emojis-list": "^3.0.0", "emojis-list": "^3.0.0",
@@ -5978,7 +5964,6 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"requires": { "requires": {
"minimist": "^1.2.0" "minimist": "^1.2.0"
} }
@@ -6099,9 +6084,9 @@
"dev": true "dev": true
}, },
"loglevel": { "loglevel": {
"version": "1.6.7", "version": "1.6.8",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz",
"integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==",
"dev": true "dev": true
}, },
"loose-envify": { "loose-envify": {
@@ -6374,9 +6359,9 @@
} }
}, },
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
}, },
"minipass": { "minipass": {
"version": "3.1.1", "version": "3.1.1",
@@ -6443,18 +6428,11 @@
} }
}, },
"mkdirp": { "mkdirp": {
"version": "0.5.1", "version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "^1.2.5"
},
"dependencies": {
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
}
} }
}, },
"move-concurrently": { "move-concurrently": {
@@ -6830,10 +6808,14 @@
"dev": true "dev": true
}, },
"object-is": { "object-is": {
"version": "1.0.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
"integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
"dev": true "dev": true,
"requires": {
"define-properties": "^1.1.3",
"es-abstract": "^1.17.5"
}
}, },
"object-keys": { "object-keys": {
"version": "1.1.1", "version": "1.1.1",
@@ -7210,6 +7192,11 @@
"sha.js": "^2.4.8" "sha.js": "^2.4.8"
} }
}, },
"pdfjs-dist": {
"version": "2.5.207",
"resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.5.207.tgz",
"integrity": "sha512-xGDUhnCYPfHy+unMXCLCJtlpZaaZ17Ew3WIL0tnSgKFUZXHAPD49GO9xScyszSsQMoutNDgRb+rfBXIaX/lJbw=="
},
"performance-now": { "performance-now": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -7298,14 +7285,14 @@
} }
}, },
"portfinder": { "portfinder": {
"version": "1.0.25", "version": "1.0.28",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
"integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
"dev": true, "dev": true,
"requires": { "requires": {
"async": "^2.6.2", "async": "^2.6.2",
"debug": "^3.1.1", "debug": "^3.1.1",
"mkdirp": "^0.5.1" "mkdirp": "^0.5.5"
}, },
"dependencies": { "dependencies": {
"debug": { "debug": {
@@ -8171,6 +8158,27 @@
} }
} }
}, },
"raw-loader": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.1.tgz",
"integrity": "sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A==",
"requires": {
"loader-utils": "^2.0.0",
"schema-utils": "^2.6.5"
},
"dependencies": {
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
}
}
},
"read-pkg": { "read-pkg": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@@ -8767,7 +8775,6 @@
"version": "2.6.5", "version": "2.6.5",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz",
"integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==",
"dev": true,
"requires": { "requires": {
"ajv": "^6.12.0", "ajv": "^6.12.0",
"ajv-keywords": "^3.4.1" "ajv-keywords": "^3.4.1"
@@ -9163,13 +9170,14 @@
} }
}, },
"sockjs": { "sockjs": {
"version": "0.3.19", "version": "0.3.20",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz",
"integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==",
"dev": true, "dev": true,
"requires": { "requires": {
"faye-websocket": "^0.10.0", "faye-websocket": "^0.10.0",
"uuid": "^3.0.1" "uuid": "^3.4.0",
"websocket-driver": "0.6.5"
} }
}, },
"sockjs-client": { "sockjs-client": {
@@ -9290,9 +9298,9 @@
"integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
}, },
"spdy": { "spdy": {
"version": "4.0.1", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
"integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
"dev": true, "dev": true,
"requires": { "requires": {
"debug": "^4.1.0", "debug": "^4.1.0",
@@ -10346,6 +10354,24 @@
"vue-style-loader": "^4.1.0" "vue-style-loader": "^4.1.0"
} }
}, },
"vue-pdf": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/vue-pdf/-/vue-pdf-4.1.0.tgz",
"integrity": "sha512-kjDmCJplCtf5+qQv6uMuUoh01AsoyKNsawHtfi9x739f1sTxdIwrLu25g+EhfRdtjh6JBqW46Mff1wijKa79wA==",
"requires": {
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"loader-utils": "^1.4.0",
"pdfjs-dist": "^2.5.207",
"raw-loader": "^4.0.1",
"vue-resize-sensor": "^2.0.0",
"worker-loader": "^2.0.0"
}
},
"vue-resize-sensor": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz",
"integrity": "sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ=="
},
"vue-router": { "vue-router": {
"version": "3.3.4", "version": "3.3.4",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.3.4.tgz", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.3.4.tgz",
@@ -10702,17 +10728,17 @@
}, },
"dependencies": { "dependencies": {
"mime": { "mime": {
"version": "2.4.4", "version": "2.4.6",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
"integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
"dev": true "dev": true
} }
} }
}, },
"webpack-dev-server": { "webpack-dev-server": {
"version": "3.10.3", "version": "3.11.0",
"resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz",
"integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==", "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==",
"dev": true, "dev": true,
"requires": { "requires": {
"ansi-html": "0.0.7", "ansi-html": "0.0.7",
@@ -10723,33 +10749,39 @@
"debug": "^4.1.1", "debug": "^4.1.1",
"del": "^4.1.1", "del": "^4.1.1",
"express": "^4.17.1", "express": "^4.17.1",
"html-entities": "^1.2.1", "html-entities": "^1.3.1",
"http-proxy-middleware": "0.19.1", "http-proxy-middleware": "0.19.1",
"import-local": "^2.0.0", "import-local": "^2.0.0",
"internal-ip": "^4.3.0", "internal-ip": "^4.3.0",
"ip": "^1.1.5", "ip": "^1.1.5",
"is-absolute-url": "^3.0.3", "is-absolute-url": "^3.0.3",
"killable": "^1.0.1", "killable": "^1.0.1",
"loglevel": "^1.6.6", "loglevel": "^1.6.8",
"opn": "^5.5.0", "opn": "^5.5.0",
"p-retry": "^3.0.1", "p-retry": "^3.0.1",
"portfinder": "^1.0.25", "portfinder": "^1.0.26",
"schema-utils": "^1.0.0", "schema-utils": "^1.0.0",
"selfsigned": "^1.10.7", "selfsigned": "^1.10.7",
"semver": "^6.3.0", "semver": "^6.3.0",
"serve-index": "^1.9.1", "serve-index": "^1.9.1",
"sockjs": "0.3.19", "sockjs": "0.3.20",
"sockjs-client": "1.4.0", "sockjs-client": "1.4.0",
"spdy": "^4.0.1", "spdy": "^4.0.2",
"strip-ansi": "^3.0.1", "strip-ansi": "^3.0.1",
"supports-color": "^6.1.0", "supports-color": "^6.1.0",
"url": "^0.11.0", "url": "^0.11.0",
"webpack-dev-middleware": "^3.7.2", "webpack-dev-middleware": "^3.7.2",
"webpack-log": "^2.0.0", "webpack-log": "^2.0.0",
"ws": "^6.2.1", "ws": "^6.2.1",
"yargs": "12.0.5" "yargs": "^13.3.2"
}, },
"dependencies": { "dependencies": {
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
"debug": { "debug": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -10759,18 +10791,61 @@
"ms": "^2.1.1" "ms": "^2.1.1"
} }
}, },
"find-up": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
"locate-path": "^3.0.0"
}
},
"is-absolute-url": { "is-absolute-url": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
"integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
"dev": true "dev": true
}, },
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"ms": { "ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true "dev": true
}, },
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"requires": {
"p-limit": "^2.0.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"schema-utils": { "schema-utils": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
@@ -10788,6 +10863,28 @@
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true "dev": true
}, },
"string-width": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
"dev": true,
"requires": {
"emoji-regex": "^7.0.1",
"is-fullwidth-code-point": "^2.0.0",
"strip-ansi": "^5.1.0"
},
"dependencies": {
"strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"dev": true,
"requires": {
"ansi-regex": "^4.1.0"
}
}
}
},
"supports-color": { "supports-color": {
"version": "6.1.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
@@ -10796,6 +10893,24 @@
"requires": { "requires": {
"has-flag": "^3.0.0" "has-flag": "^3.0.0"
} }
},
"yargs": {
"version": "13.3.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
"integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
"dev": true,
"requires": {
"cliui": "^5.0.0",
"find-up": "^3.0.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^13.1.2"
}
} }
} }
}, },
@@ -10848,20 +10963,18 @@
} }
}, },
"websocket-driver": { "websocket-driver": {
"version": "0.7.3", "version": "0.6.5",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
"integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
"dev": true, "dev": true,
"requires": { "requires": {
"http-parser-js": ">=0.4.0 <0.4.11",
"safe-buffer": ">=5.1.0",
"websocket-extensions": ">=0.1.1" "websocket-extensions": ">=0.1.1"
} }
}, },
"websocket-extensions": { "websocket-extensions": {
"version": "0.1.3", "version": "0.1.4",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
"integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
"dev": true "dev": true
}, },
"which": { "which": {
@@ -10894,6 +11007,26 @@
"errno": "~0.1.7" "errno": "~0.1.7"
} }
}, },
"worker-loader": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz",
"integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==",
"requires": {
"loader-utils": "^1.0.0",
"schema-utils": "^0.4.0"
},
"dependencies": {
"schema-utils": {
"version": "0.4.7",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
"integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
"requires": {
"ajv": "^6.1.0",
"ajv-keywords": "^3.1.0"
}
}
}
},
"wrap-ansi": { "wrap-ansi": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",

View File

@@ -27,6 +27,7 @@
"vue": "^2.6.10", "vue": "^2.6.10",
"vue-feather-icons": "^5.0.0", "vue-feather-icons": "^5.0.0",
"vue-i18n": "^8.18.2", "vue-i18n": "^8.18.2",
"vue-pdf": "^4.1.0",
"vue-router": "^3.3.4", "vue-router": "^3.3.4",
"vuex": "^3.5.1" "vuex": "^3.5.1"
} }

420
public/css/app.css vendored

File diff suppressed because one or more lines are too long

140193
public/js/main.js vendored

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,34 @@
{ {
"/js/main.js": "/js/main.js", "/js/main.js": "/js/main.js",
"/css/app.css": "/css/app.css" "/css/app.css": "/css/app.css",
"/js/main.e2bb1fd747fa15021705.hot-update.js": "/js/main.e2bb1fd747fa15021705.hot-update.js",
"/js/main.9c20ee6a60faeb34bc30.hot-update.js": "/js/main.9c20ee6a60faeb34bc30.hot-update.js",
"/js/main.83f43d6f0ad85db8835f.hot-update.js": "/js/main.83f43d6f0ad85db8835f.hot-update.js",
"/js/main.f87a7ee7d93fc1c7b5de.hot-update.js": "/js/main.f87a7ee7d93fc1c7b5de.hot-update.js",
"/js/main.77f22ac085cba98620f1.hot-update.js": "/js/main.77f22ac085cba98620f1.hot-update.js",
"/js/main.fcf0a9a192751c92a149.hot-update.js": "/js/main.fcf0a9a192751c92a149.hot-update.js",
"/js/main.a554eb36a5c74f647c71.hot-update.js": "/js/main.a554eb36a5c74f647c71.hot-update.js",
"/js/main.35658cce779a3f465bec.hot-update.js": "/js/main.35658cce779a3f465bec.hot-update.js",
"/js/main.d5d36b8ab06c646ec418.hot-update.js": "/js/main.d5d36b8ab06c646ec418.hot-update.js",
"/js/main.fdc1d3ffdd9903f395f7.hot-update.js": "/js/main.fdc1d3ffdd9903f395f7.hot-update.js",
"/js/main.0ae540f4c05df5ccebb0.hot-update.js": "/js/main.0ae540f4c05df5ccebb0.hot-update.js",
"/js/main.49391b7e1762ea0c5b10.hot-update.js": "/js/main.49391b7e1762ea0c5b10.hot-update.js",
"/js/main.beae3c9aef47942197b0.hot-update.js": "/js/main.beae3c9aef47942197b0.hot-update.js",
"/js/main.51c52c383348b005243c.hot-update.js": "/js/main.51c52c383348b005243c.hot-update.js",
"/js/main.964dc232d2c393dacc65.hot-update.js": "/js/main.964dc232d2c393dacc65.hot-update.js",
"/js/main.b98b9f46629be99210d2.hot-update.js": "/js/main.b98b9f46629be99210d2.hot-update.js",
"/js/main.aab577d0ec8e8a204961.hot-update.js": "/js/main.aab577d0ec8e8a204961.hot-update.js",
"/js/main.0217718f0db88a657b2f.hot-update.js": "/js/main.0217718f0db88a657b2f.hot-update.js",
"/js/main.5391ccc6f3c903bf0b23.hot-update.js": "/js/main.5391ccc6f3c903bf0b23.hot-update.js",
"/js/main.0954e76b99db04ffbe6c.hot-update.js": "/js/main.0954e76b99db04ffbe6c.hot-update.js",
"/js/main.df14fcfae8664b0f2904.hot-update.js": "/js/main.df14fcfae8664b0f2904.hot-update.js",
"/js/main.75a01658c34a6e530b1a.hot-update.js": "/js/main.75a01658c34a6e530b1a.hot-update.js",
"/js/main.62b26161fb5207445a1c.hot-update.js": "/js/main.62b26161fb5207445a1c.hot-update.js",
"/js/main.88d224990b79bf089c9a.hot-update.js": "/js/main.88d224990b79bf089c9a.hot-update.js",
"/js/main.81dd5da55c0dd05b096b.hot-update.js": "/js/main.81dd5da55c0dd05b096b.hot-update.js",
"/js/main.604934fc10ca0ad73e89.hot-update.js": "/js/main.604934fc10ca0ad73e89.hot-update.js",
"/js/main.c85e590457277f990184.hot-update.js": "/js/main.c85e590457277f990184.hot-update.js",
"/js/main.7617058999e77f4960b6.hot-update.js": "/js/main.7617058999e77f4960b6.hot-update.js",
"/js/main.e41e72be1336cbf4b175.hot-update.js": "/js/main.e41e72be1336cbf4b175.hot-update.js",
"/js/main.6acdea49771ee695139c.hot-update.js": "/js/main.6acdea49771ee695139c.hot-update.js"
} }

View File

@@ -1,213 +1,216 @@
<template> <template>
<div id="vue-file-manager" v-cloak> <div id="vue-file-manager" v-cloak>
<!--System alerts-->
<Alert />
<!--System alerts--> <div id="application-wrapper" v-if="layout === 'authorized'">
<Alert/> <!-- Full File Preview -->
<FileFullPreview />
<div id="application-wrapper" v-if="layout === 'authorized'"> <!--Mobile Navigation-->
<MobileNavigation />
<!--Mobile Navigation--> <!--Confirm Popup-->
<MobileNavigation /> <Confirm />
<!--Confirm Popup--> <!--Share Item setup-->
<Confirm /> <ShareCreate />
<ShareEdit />
<!--Share Item setup--> <!--Move item setup-->
<ShareCreate/> <MoveItem />
<ShareEdit/>
<!--Move item setup--> <!--Mobile Menu-->
<MoveItem/> <MobileMenu />
<!--Mobile Menu--> <!--Navigation Sidebar-->
<MobileMenu/> <MenuBar />
<!--Navigation Sidebar--> <!--Toastr-->
<MenuBar/> <ToastrWrapper />
<!--Toastr--> <!--File page-->
<ToastrWrapper/> <keep-alive :include="['Admin', 'Users']">
<router-view :class="{ 'is-scaled-down': isScaledDown }" />
<!--File page--> </keep-alive>
<keep-alive :include="['Admin', 'Users']">
<router-view :class="{'is-scaled-down': isScaledDown}"/>
</keep-alive>
</div>
<router-view v-if="layout === 'unauthorized'"/>
<CookieDisclaimer />
<!--Background vignette-->
<Vignette/>
</div> </div>
<router-view v-if="layout === 'unauthorized'" />
<CookieDisclaimer />
<!--Background vignette-->
<Vignette />
</div>
</template> </template>
<script> <script>
import ToastrWrapper from '@/components/Others/Notifications/ToastrWrapper' import ToastrWrapper from "@/components/Others/Notifications/ToastrWrapper";
import MobileNavigation from '@/components/Others/MobileNavigation' import MobileNavigation from "@/components/Others/MobileNavigation";
import CookieDisclaimer from '@/components/Others/CookieDisclaimer' import CookieDisclaimer from "@/components/Others/CookieDisclaimer";
import MobileMenu from '@/components/FilesView/MobileMenu' import FileFullPreview from "@/components/FilesView/FileFullPreview";
import ShareCreate from '@/components/Others/ShareCreate' import MobileMenu from "@/components/FilesView/MobileMenu";
import Confirm from '@/components/Others/Popup/Confirm' import ShareCreate from "@/components/Others/ShareCreate";
import ShareEdit from '@/components/Others/ShareEdit' import Confirm from "@/components/Others/Popup/Confirm";
import MoveItem from '@/components/Others/MoveItem' import ShareEdit from "@/components/Others/ShareEdit";
import Vignette from '@/components/Others/Vignette' import MoveItem from "@/components/Others/MoveItem";
import MenuBar from '@/components/Sidebar/MenuBar' import Vignette from "@/components/Others/Vignette";
import Alert from '@/components/FilesView/Alert' import MenuBar from "@/components/Sidebar/MenuBar";
import {includes} from 'lodash' import Alert from "@/components/FilesView/Alert";
import {mapGetters} from 'vuex' import { includes } from "lodash";
import {events} from "./bus" import { mapGetters } from "vuex";
import { events } from "./bus";
export default { export default {
name: 'app', name: "app",
components: { components: {
MobileNavigation, MobileNavigation,
CookieDisclaimer, CookieDisclaimer,
ToastrWrapper, ToastrWrapper,
ShareCreate, ShareCreate,
MobileMenu, FileFullPreview,
ShareEdit, MobileMenu,
MoveItem, ShareEdit,
Vignette, MoveItem,
Confirm, Vignette,
MenuBar, Confirm,
Alert, MenuBar,
}, Alert,
computed: { },
...mapGetters([ computed: {
'isLogged', 'isGuest', 'config' ...mapGetters(["isLogged", "isGuest", "config"]),
]), layout() {
layout() { if (
if (includes([ includes(
'InstallationDisclaimer', [
'SubscriptionService', "InstallationDisclaimer",
'StripeCredentials', "SubscriptionService",
'SubscriptionPlans', "StripeCredentials",
'ForgottenPassword', "SubscriptionPlans",
'CreateNewPassword', "ForgottenPassword",
'EnvironmentSetup', "CreateNewPassword",
'VerifyByPassword', "EnvironmentSetup",
'SaaSLandingPage', "VerifyByPassword",
'BillingsDetail', "SaaSLandingPage",
'NotFoundShared', "BillingsDetail",
'AdminAccount', "NotFoundShared",
'PurchaseCode', "AdminAccount",
'DynamicPage', "PurchaseCode",
'SharedPage', "DynamicPage",
'ContactUs', "SharedPage",
'AppSetup', "ContactUs",
'Database', "AppSetup",
'Upgrade', "Database",
'SignIn', "Upgrade",
'SignUp', "SignIn",
], this.$route.name) "SignUp",
) { ],
return 'unauthorized' this.$route.name
} )
) {
return "unauthorized";
}
return 'authorized' return "authorized";
} },
}, },
data() { data() {
return { return {
isScaledDown: false, isScaledDown: false,
} };
}, },
beforeMount() { beforeMount() {
// Store config to vuex
this.$store.commit("INIT", {
authCookie: this.$root.$data.config.hasAuthCookie,
config: this.$root.$data.config,
rootDirectory: {
name: this.$t("locations.home"),
location: "base",
unique_id: 0,
},
});
// Store config to vuex // Get installation state
this.$store.commit('INIT', { let installation = this.$root.$data.config.installation;
authCookie: this.$root.$data.config.hasAuthCookie,
config: this.$root.$data.config,
rootDirectory: {
name: this.$t('locations.home'),
location: 'base',
unique_id: 0,
}
})
// Get installation state // Redirect to database verify code
let installation = this.$root.$data.config.installation if (installation === "setup-database") {
this.$router.push({ name: "PurchaseCode" });
// Redirect to database verify code
if ( installation === 'setup-database') {
this.$router.push({name: 'PurchaseCode'})
}
// Redirect to starting installation process
if ( installation === 'setup-disclaimer' ) {
this.$router.push({name: 'InstallationDisclaimer'})
}
},
mounted() {
// Handle mobile navigation scale animation
events.$on('show:mobile-navigation', () => this.isScaledDown = true)
events.$on('hide:mobile-navigation', () => this.isScaledDown = false)
events.$on('mobileMenu:show', () => this.isScaledDown = true)
events.$on('fileItem:deselect', () => this.isScaledDown = false)
}
} }
// Redirect to starting installation process
if (installation === "setup-disclaimer") {
this.$router.push({ name: "InstallationDisclaimer" });
}
},
mounted() {
// Handle mobile navigation scale animation
events.$on("show:mobile-navigation", () => (this.isScaledDown = true));
events.$on("hide:mobile-navigation", () => (this.isScaledDown = false));
events.$on("mobileMenu:show", () => (this.isScaledDown = true));
events.$on("fileItem:deselect", () => (this.isScaledDown = false));
},
};
</script> </script>
<style lang="scss"> <style lang="scss">
@import url('https://fonts.googleapis.com/css2?family=Nunito:wght@200;300;400;600;700;800;900&display=swap'); @import url("https://fonts.googleapis.com/css2?family=Nunito:wght@200;300;400;600;700;800;900&display=swap");
@import '@assets/vue-file-manager/_variables'; @import "@assets/vue-file-manager/_variables";
@import '@assets/vue-file-manager/_mixins'; @import "@assets/vue-file-manager/_mixins";
[v-cloak], [v-cloak],
[v-cloak] > * { [v-cloak] > * {
display: none display: none;
} }
* { * {
outline: 0; outline: 0;
margin: 0; margin: 0;
padding: 0; padding: 0;
font-family: 'Nunito', sans-serif; font-family: "Nunito", sans-serif;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
box-sizing: border-box; box-sizing: border-box;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
font-size: 16px; font-size: 16px;
text-decoration: none; text-decoration: none;
color: $text; color: $text;
} }
#auth { #auth {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
#vue-file-manager { #vue-file-manager {
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow-y: auto; overflow-y: auto;
scroll-behavior:smooth; scroll-behavior: smooth;
} }
@media only screen and (max-width: 690px) { @media only screen and (max-width: 690px) {
.is-scaled-down {
.is-scaled-down { @include transform(scale(0.95));
@include transform(scale(0.95)); }
} }
}
// Dark mode support
// Dark mode support @media (prefers-color-scheme: dark) {
@media (prefers-color-scheme: dark) { * {
color: $dark_mode_text_primary;
* { }
color: $dark_mode_text_primary;
} body,
html {
body, html { background: $dark_mode_background;
background: $dark_mode_background; color: $dark_mode_text_primary;
color: $dark_mode_text_primary;
img {
img { opacity: 0.95;
opacity: .95;
}
}
} }
}
}
</style> </style>

File diff suppressed because it is too large Load Diff

View File

@@ -1,473 +1,514 @@
<template> <template>
<div
class="file-wrapper"
@click.stop="clickedItem"
@dblclick="goToItem"
spellcheck="false"
>
<!--List preview-->
<div <div
class="file-wrapper" :draggable="canDrag"
@click.stop="clickedItem" @dragstart="$emit('dragstart')"
@dblclick="goToItem" @drop="
spellcheck="false" $emit('drop');
area = false;
"
@dragleave="dragLeave"
@dragover.prevent="dragEnter"
class="file-item"
:class="{ 'is-clicked': isClicked, 'is-dragenter': area }"
> >
<!--List preview--> <!--Thumbnail for item-->
<div <div class="icon-item">
:draggable="canDrag" <!--If is file or image, then link item-->
@dragstart="$emit('dragstart')" <span v-if="isFile" class="file-icon-text">
@drop=" {{ data.mimetype | limitCharacters }}
$emit('drop') </span>
area = false
" <!--Folder thumbnail-->
@dragleave="dragLeave" <FontAwesomeIcon v-if="isFile" class="file-icon" icon="file" />
@dragover.prevent="dragEnter"
class="file-item" <!--Image thumbnail-->
:class="{ 'is-clicked': isClicked, 'is-dragenter': area }" <img
v-if="isImage"
class="image"
:src="data.thumbnail"
:alt="data.name"
/>
<!--Else show only folder icon-->
<FontAwesomeIcon
v-if="isFolder"
:class="{ 'is-deleted': isDeleted }"
class="folder-icon"
icon="folder"
/>
</div>
<!--Name-->
<div class="item-name">
<!--Name-->
<b
ref="name"
@input="renameItem"
:contenteditable="canEditName"
class="name"
> >
<!--Thumbnail for item--> {{ itemName }}
<div class="icon-item"> </b>
<!--If is file or image, then link item-->
<span v-if="isFile" class="file-icon-text">
{{ data.mimetype | limitCharacters }}
</span>
<!--Folder thumbnail--> <div class="item-info">
<FontAwesomeIcon v-if="isFile" class="file-icon" icon="file"/> <!--Shared Icon-->
<div
v-if="$checkPermission('master') && data.shared"
class="item-shared"
>
<link-icon size="12" class="shared-icon"></link-icon>
</div>
<!--Image thumbnail--> <!--Participant owner Icon-->
<img v-if="isImage" class="image" :src="data.thumbnail" :alt="data.name"/> <div
v-if="$checkPermission('master') && data.user_scope !== 'master'"
class="item-shared"
>
<user-plus-icon size="12" class="shared-icon"></user-plus-icon>
</div>
<!--Else show only folder icon--> <!--Filesize and timestamp-->
<FontAwesomeIcon v-if="isFolder" :class="{'is-deleted': isDeleted}" class="folder-icon" icon="folder"/> <span v-if="!isFolder" class="item-size"
</div> >{{ data.filesize }}, {{ timeStamp }}</span
>
<!--Name--> <!--Folder item counts-->
<div class="item-name"> <span v-if="isFolder" class="item-length">
<!--Name--> {{
<b folderItems == 0
ref="name" ? $t("folder.empty")
@input="renameItem" : $tc("folder.item_counts", folderItems)
:contenteditable="canEditName" }}, {{ timeStamp }}
class="name" </span>
>
{{ itemName }}
</b>
<div class="item-info">
<!--Shared Icon-->
<div v-if="$checkPermission('master') && data.shared" class="item-shared">
<link-icon size="12" class="shared-icon"></link-icon>
</div>
<!--Participant owner Icon-->
<div v-if="$checkPermission('master') && data.user_scope !== 'master'" class="item-shared">
<user-plus-icon size="12" class="shared-icon"></user-plus-icon>
</div>
<!--Filesize and timestamp-->
<span v-if="! isFolder" class="item-size">{{ data.filesize }}, {{ timeStamp }}</span>
<!--Folder item counts-->
<span v-if="isFolder" class="item-length">
{{ folderItems == 0 ? $t('folder.empty') : $tc('folder.item_counts', folderItems) }}, {{ timeStamp }}
</span>
</div>
</div>
<!--Go Next icon-->
<div class="actions" v-if="$isMobile() && ! ( $checkPermission('visitor') && isFolder )">
<span @click.stop="showItemActions" class="show-actions">
<FontAwesomeIcon icon="ellipsis-v" class="icon-action"></FontAwesomeIcon>
</span>
</div>
</div> </div>
</div>
<!--Go Next icon-->
<div
class="actions"
v-if="$isMobile() && !($checkPermission('visitor') && isFolder)"
>
<span @click.stop="showItemActions" class="show-actions">
<FontAwesomeIcon
icon="ellipsis-v"
class="icon-action"
></FontAwesomeIcon>
</span>
</div>
</div> </div>
</div>
</template> </template>
<script> <script>
import { LinkIcon, UserPlusIcon } from 'vue-feather-icons' import { LinkIcon, UserPlusIcon } from "vue-feather-icons";
import {debounce} from 'lodash' import { debounce } from "lodash";
import {mapGetters} from 'vuex' import { mapGetters } from "vuex";
import {events} from '@/bus' import { events } from "@/bus";
export default { export default {
name: 'FileItemList', name: "FileItemList",
props: ['data'], props: ["data"],
components: { components: {
UserPlusIcon, UserPlusIcon,
LinkIcon, LinkIcon,
}, },
computed: { computed: {
...mapGetters(['FilePreviewType']), ...mapGetters(["FilePreviewType"]),
isFolder() { isFolder() {
return this.data.type === 'folder' return this.data.type === "folder";
}, },
isFile() { isFile() {
return this.data.type !== 'folder' && this.data.type !== 'image' return this.data.type !== "folder" && this.data.type !== "image";
}, },
isImage() { isImage() {
return this.data.type === 'image' return this.data.type === "image";
}, },
canEditName() { isPdf() {
return !this.$isMobile() return this.data.mimetype === "pdf";
&& !this.$isThisLocation(['trash', 'trash-root']) },
&& !this.$checkPermission('visitor') isVideo() {
&& !(this.sharedDetail && this.sharedDetail.type === 'file') return this.data.type === "video";
}, },
canDrag() { canEditName() {
return !this.isDeleted && this.$checkPermission(['master', 'editor']) return (
}, !this.$isMobile() &&
timeStamp() { !this.$isThisLocation(["trash", "trash-root"]) &&
return this.data.deleted_at ? this.$t('item_thumbnail.deleted_at', {time: this.data.deleted_at}) : this.data.created_at !this.$checkPermission("visitor") &&
}, !(this.sharedDetail && this.sharedDetail.type === "file")
folderItems() { );
return this.data.deleted_at ? this.data.trashed_items : this.data.items },
}, canDrag() {
isDeleted() { return !this.isDeleted && this.$checkPermission(["master", "editor"]);
return this.data.deleted_at ? true : false },
} timeStamp() {
}, return this.data.deleted_at
filters: { ? this.$t("item_thumbnail.deleted_at", { time: this.data.deleted_at })
limitCharacters(str) { : this.data.created_at;
},
folderItems() {
return this.data.deleted_at ? this.data.trashed_items : this.data.items;
},
isDeleted() {
return this.data.deleted_at ? true : false;
},
},
filters: {
limitCharacters(str) {
if (str.length > 3) {
return str.substring(0, 3) + "...";
} else {
return str.substring(0, 3);
}
},
},
data() {
return {
isClicked: false,
area: false,
itemName: undefined,
};
},
methods: {
showItemActions() {
// Load file info detail
this.$store.commit("GET_FILEINFO_DETAIL", this.data);
if (str.length > 3) { //this.isClicked = true
return str.substring(0, 3) + '...';
} else {
return str.substring(0, 3);
}
} events.$emit("mobileMenu:show");
}, },
data() { dragEnter() {
return { if (this.data.type !== "folder") return;
isClicked: false,
area: false,
itemName: undefined,
}
},
methods: {
showItemActions() {
// Load file info detail
this.$store.commit('GET_FILEINFO_DETAIL', this.data)
//this.isClicked = true this.area = true;
},
dragLeave() {
this.area = false;
},
clickedItem(e) {
events.$emit("contextMenu:hide");
events.$emit("fileItem:deselect");
events.$emit('mobileMenu:show') // Set clicked item
}, this.isClicked = true;
dragEnter() {
if (this.data.type !== 'folder') return
this.area = true // Open in mobile version on first click
}, if (this.$isMobile() && this.isFolder) {
dragLeave() { // Go to folder
this.area = false if (this.$isThisLocation("public")) {
}, this.$store.dispatch("browseShared", [
clickedItem(e) { { folder: this.data, back: false, init: false },
events.$emit('contextMenu:hide') ]);
events.$emit('fileItem:deselect') } else {
this.$store.dispatch("getFolder", [
{ folder: this.data, back: false, init: false },
]);
}
}
// Set clicked item if (this.$isMobile()) {
this.isClicked = true if (this.isImage || this.isVideo) {
events.$emit("fileFullPreview:show");
}
}
// Open in mobile version on first click // Load file info detail
if (this.$isMobile() && this.isFolder) { this.$store.commit("GET_FILEINFO_DETAIL", this.data);
// Go to folder // Get target classname
if (this.$isThisLocation('public')) { let itemClass = e.target.className;
this.$store.dispatch('browseShared', [{folder: this.data, back: false, init: false}])
} else {
this.$store.dispatch('getFolder', [{folder: this.data, back: false, init: false}])
}
}
// Load file info detail if (["name", "icon", "file-link", "file-icon-text"].includes(itemClass))
this.$store.commit('GET_FILEINFO_DETAIL', this.data) return;
},
goToItem() {
if (this.isImage || this.isVideo) {
// this.$openImageOnNewTab(this.data.file_url)
events.$emit("fileFullPreview:show");
}
// Get target classname if (this.isFile && !this.isPdf && !this.isVideo) {
let itemClass = e.target.className this.$downloadFile(
this.data.file_url,
this.data.name + "." + this.data.mimetype
);
}
if (['name', 'icon', 'file-link', 'file-icon-text'].includes(itemClass)) if (this.isFolder) {
return if (this.$isThisLocation("public")) {
}, this.$store.dispatch("browseShared", [
goToItem() { { folder: this.data, back: false, init: false },
if (this.isImage) { ]);
this.$openImageOnNewTab(this.data.file_url) } else {
} this.$store.dispatch("getFolder", [
{ folder: this.data, back: false, init: false },
]);
}
}
},
renameItem: debounce(function (e) {
// Prevent submit empty string
if (e.target.innerText.trim() === "") return;
if (this.isFile) { this.$store.dispatch("renameItem", {
this.$downloadFile( unique_id: this.data.unique_id,
this.data.file_url, type: this.data.type,
this.data.name + '.' + this.data.mimetype name: e.target.innerText,
) });
} }, 300),
},
created() {
this.itemName = this.data.name;
if (this.isFolder) { events.$on("fileItem:deselect", () => {
// Deselect file
this.isClicked = false;
});
if (this.$isThisLocation('public')) { // Change item name
this.$store.dispatch('browseShared', [{folder: this.data, back: false, init: false}]) events.$on("change:name", (item) => {
} else { if (this.data.unique_id == item.unique_id) this.itemName = item.name;
this.$store.dispatch('getFolder', [{folder: this.data, back: false, init: false}]) });
} },
} };
},
renameItem: debounce(function (e) {
// Prevent submit empty string
if (e.target.innerText.trim() === '') return
this.$store.dispatch('renameItem', {
unique_id: this.data.unique_id,
type: this.data.type,
name: e.target.innerText
})
}, 300)
},
created() {
this.itemName = this.data.name
events.$on('fileItem:deselect', () => {
// Deselect file
this.isClicked = false
})
// Change item name
events.$on('change:name', (item) => {
if (this.data.unique_id == item.unique_id) this.itemName = item.name
})
},
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import '@assets/vue-file-manager/_variables'; @import "@assets/vue-file-manager/_variables";
@import '@assets/vue-file-manager/_mixins'; @import "@assets/vue-file-manager/_mixins";
.file-wrapper { .file-wrapper {
user-select: none; user-select: none;
position: relative; position: relative;
&:hover { &:hover {
border-color: transparent; border-color: transparent;
}
.actions {
text-align: right;
width: 50px;
.show-actions {
cursor: pointer;
padding: 12px 6px 12px;
.icon-action {
@include font-size(14);
path {
fill: $theme;
} }
}
}
}
.actions { .item-name {
text-align: right; display: block;
width: 50px; width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
.show-actions { .item-info {
cursor: pointer; display: block;
padding: 12px 6px 12px; line-height: 1;
.icon-action {
@include font-size(14);
path {
fill: $theme;
}
}
}
}
.item-name {
display: block;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
.item-info {
display: block;
line-height: 1;
}
.item-shared {
display: inline-block;
.label {
@include font-size(12);
font-weight: 400;
color: $theme;
}
.shared-icon {
vertical-align: middle;
path, circle, line {
stroke: $theme;
}
}
}
.item-size,
.item-length {
@include font-size(11);
font-weight: 400;
color: rgba($text, 0.7);
}
.name {
white-space: nowrap;
&[contenteditable] {
-webkit-user-select: text;
user-select: text;
}
&[contenteditable='true']:hover {
text-decoration: underline;
}
}
.name {
color: $text;
@include font-size(14);
font-weight: 700;
max-height: 40px;
overflow: hidden;
text-overflow: ellipsis;
&.actived {
max-height: initial;
}
}
}
&.selected {
.file-item {
background: $light_background;
}
}
.icon-item {
text-align: center;
position: relative;
flex: 0 0 50px;
line-height: 0;
margin-right: 20px;
.folder-icon {
@include font-size(52);
path {
fill: $theme;
}
&.is-deleted {
path {
fill: $dark_background;
}
}
}
.file-icon {
@include font-size(45);
path {
fill: #fafafc;
stroke: #dfe0e8;
stroke-width: 1;
}
}
.file-icon-text {
line-height: 1;
top: 40%;
@include font-size(11);
margin: 0 auto;
position: absolute;
text-align: center;
left: 0;
right: 0;
color: $theme;
font-weight: 600;
user-select: none;
max-width: 50px;
max-height: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.image {
object-fit: cover;
user-select: none;
max-width: 100%;
border-radius: 5px;
width: 50px;
height: 50px;
pointer-events: none;
}
}
.file-item {
border: 2px dashed transparent;
width: 100%;
display: flex;
align-items: center;
padding: 7px;
&.is-dragenter {
border: 2px dashed $theme;
border-radius: 8px;
}
&:hover,
&.is-clicked {
border-radius: 8px;
background: $light_background;
.item-name .name {
color: $theme;
}
}
}
} }
@media (prefers-color-scheme: dark) { .item-shared {
display: inline-block;
.file-wrapper { .label {
@include font-size(12);
font-weight: 400;
color: $theme;
}
.icon-item { .shared-icon {
.file-icon { vertical-align: middle;
path { path,
fill: $dark_mode_foreground; circle,
stroke: #2F3C54; line {
} stroke: $theme;
}
.folder-icon {
&.is-deleted {
path {
fill: lighten($dark_mode_foreground, 5%);
}
}
}
}
.file-item {
&:hover,
&.is-clicked {
background: $dark_mode_foreground;
.file-icon {
path {
fill: $dark_mode_background;
}
}
}
}
.item-name {
.name {
color: $dark_mode_text_primary;
}
.item-size,
.item-length {
color: $dark_mode_text_secondary;
}
}
} }
}
} }
.item-size,
.item-length {
@include font-size(11);
font-weight: 400;
color: rgba($text, 0.7);
}
.name {
white-space: nowrap;
&[contenteditable] {
-webkit-user-select: text;
user-select: text;
}
&[contenteditable="true"]:hover {
text-decoration: underline;
}
}
.name {
color: $text;
@include font-size(14);
font-weight: 700;
max-height: 40px;
overflow: hidden;
text-overflow: ellipsis;
&.actived {
max-height: initial;
}
}
}
&.selected {
.file-item {
background: $light_background;
}
}
.icon-item {
text-align: center;
position: relative;
flex: 0 0 50px;
line-height: 0;
margin-right: 20px;
.folder-icon {
@include font-size(52);
path {
fill: $theme;
}
&.is-deleted {
path {
fill: $dark_background;
}
}
}
.file-icon {
@include font-size(45);
path {
fill: #fafafc;
stroke: #dfe0e8;
stroke-width: 1;
}
}
.file-icon-text {
line-height: 1;
top: 40%;
@include font-size(11);
margin: 0 auto;
position: absolute;
text-align: center;
left: 0;
right: 0;
color: $theme;
font-weight: 600;
user-select: none;
max-width: 50px;
max-height: 20px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.image {
object-fit: cover;
user-select: none;
max-width: 100%;
border-radius: 5px;
width: 50px;
height: 50px;
pointer-events: none;
}
}
.file-item {
border: 2px dashed transparent;
width: 100%;
display: flex;
align-items: center;
padding: 7px;
&.is-dragenter {
border: 2px dashed $theme;
border-radius: 8px;
}
&:hover,
&.is-clicked {
border-radius: 8px;
background: $light_background;
.item-name .name {
color: $theme;
}
}
}
}
@media (prefers-color-scheme: dark) {
.file-wrapper {
.icon-item {
.file-icon {
path {
fill: $dark_mode_foreground;
stroke: #2f3c54;
}
}
.folder-icon {
&.is-deleted {
path {
fill: lighten($dark_mode_foreground, 5%);
}
}
}
}
.file-item {
&:hover,
&.is-clicked {
background: $dark_mode_foreground;
.file-icon {
path {
fill: $dark_mode_background;
}
}
}
}
.item-name {
.name {
color: $dark_mode_text_primary;
}
.item-size,
.item-length {
color: $dark_mode_text_secondary;
}
}
}
}
</style> </style>

File diff suppressed because it is too large Load Diff

View File

@@ -1,75 +1,108 @@
<template> <template>
<button class="button" :title="action"> <button class="button" :title="action">
<corner-down-right-icon v-if="source === 'move'" size="19"></corner-down-right-icon> <corner-down-right-icon
<folder-plus-icon v-if="source === 'folder-plus'" size="19"></folder-plus-icon> v-if="source === 'move'"
<trash-2-icon v-if="source === 'trash'" size="19"></trash-2-icon> size="19"
<list-icon v-if="source === 'th-list'" size="19"></list-icon> ></corner-down-right-icon>
<info-icon v-if="source === 'info'" size="19"></info-icon> <download-cloud-icon
<grid-icon v-if="source === 'th'" size="19"></grid-icon> v-if="source === 'download'"
<link-icon v-if="source === 'share'" size="19"></link-icon> size="19"
</button> ></download-cloud-icon>
<folder-plus-icon
v-if="source === 'folder-plus'"
size="19"
></folder-plus-icon>
<edit-2-icon v-if="source === 'rename'" size="19"></edit-2-icon>
<printer-icon v-if="source === 'print'" size="19"></printer-icon>
<trash-2-icon v-if="source === 'trash'" size="19"></trash-2-icon>
<list-icon v-if="source === 'th-list'" size="19"></list-icon>
<info-icon v-if="source === 'info'" size="19"></info-icon>
<grid-icon v-if="source === 'th'" size="19"></grid-icon>
<link-icon v-if="source === 'share'" size="19"></link-icon>
</button>
</template> </template>
<script> <script>
import {FolderPlusIcon, Trash2Icon, GridIcon, ListIcon, InfoIcon, CornerDownRightIcon, LinkIcon} from 'vue-feather-icons' import {
FolderPlusIcon,
Trash2Icon,
GridIcon,
ListIcon,
Edit2Icon,
InfoIcon,
CornerDownRightIcon,
LinkIcon,
DownloadCloudIcon,
PrinterIcon,
} from "vue-feather-icons";
export default { export default {
name: 'ToolbarButton', name: "ToolbarButton",
props: ['source', 'action'], props: ["source", "action"],
components: { components: {
CornerDownRightIcon, CornerDownRightIcon,
FolderPlusIcon, DownloadCloudIcon,
Trash2Icon, FolderPlusIcon,
ListIcon, PrinterIcon,
GridIcon, Trash2Icon,
InfoIcon, Edit2Icon,
LinkIcon, ListIcon,
}, GridIcon,
} InfoIcon,
LinkIcon,
},
};
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@import '@assets/vue-file-manager/_variables'; @import "@assets/vue-file-manager/_variables";
@import '@assets/vue-file-manager/_mixins'; @import "@assets/vue-file-manager/_mixins";
.button { .button {
height: 42px; height: 42px;
width: 42px; width: 42px;
border-radius: 8px; border-radius: 8px;
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
padding: 0; padding: 0;
text-align: center; text-align: center;
cursor: pointer; cursor: pointer;
white-space: nowrap; white-space: nowrap;
outline: none; outline: none;
border: none; border: none;
@include transition(150ms); @include transition(150ms);
background: transparent; background: transparent;
&:hover { &:hover {
background: $light_background; background: $light_background;
path, line, polyline, rect, circle { path,
@include transition(150ms); line,
stroke: $theme; polyline,
} rect,
} circle {
@include transition(150ms);
stroke: $theme;
}
}
}
@media (prefers-color-scheme: dark) {
.button {
background: transparent;
&:hover {
background: $dark_mode_foreground;
} }
@media (prefers-color-scheme: dark) { path,
line,
.button { polyline,
background: transparent; rect,
circle {
&:hover { stroke: $dark_mode_text_primary;
background: $dark_mode_foreground;
}
path, line, polyline, rect, circle {
stroke: $dark_mode_text_primary;
}
}
} }
}
}
</style> </style>

View File

@@ -1,276 +1,284 @@
import store from './store/index' import store from "./store/index";
import {debounce, includes} from "lodash"; import { debounce, includes, truncate } from "lodash";
import {events} from './bus' import { events } from "./bus";
import axios from 'axios' import axios from "axios";
import router from '@/router' import router from "@/router";
const Helpers = { const Helpers = {
install(Vue) { install(Vue) {
Vue.prototype.$updateText = debounce(function(route, name, value) {
if (value === "") return;
Vue.prototype.$updateText = debounce(function (route, name, value) { axios
.patch(this.$store.getters.api + route, { name, value })
.catch((error) => {
events.$emit("alert:open", {
title: this.$t("popup_error.title"),
message: this.$t("popup_error.message"),
});
});
}, 150);
if (value === '') return Vue.prototype.$updateImage = function(route, name, image) {
// Create form
let formData = new FormData();
axios.patch(this.$store.getters.api + route, {name, value}) // Add image to form
.catch(error => { formData.append("name", name);
events.$emit('alert:open', { formData.append(name, image);
title: this.$t('popup_error.title'), formData.append("_method", "PATCH");
message: this.$t('popup_error.message'),
})
})
}, 150)
Vue.prototype.$updateImage = function (route, name, image) { axios
.post(this.$store.getters.api + route, formData, {
headers: {
"Content-Type": "multipart/form-data",
},
})
.catch((error) => {
events.$emit("alert:open", {
title: this.$t("popup_error.title"),
message: this.$t("popup_error.message"),
});
});
};
// Create form Vue.prototype.$scrollTop = function() {
let formData = new FormData() var container = document.getElementById("vue-file-manager");
// Add image to form if (container) {
formData.append('name', name) container.scrollTop = 0;
formData.append(name, image) }
formData.append('_method', 'PATCH') };
axios.post(this.$store.getters.api + route, formData, { Vue.prototype.$getImage = function(source) {
headers: { return source ? "/" + source : "";
'Content-Type': 'multipart/form-data', };
}
}) Vue.prototype.$getCreditCardBrand = function(brand) {
.catch(error => { return `/assets/icons/${brand}.svg`;
events.$emit('alert:open', { };
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'), Vue.prototype.$getInvoiceLink = function(customer, id) {
}) return "/invoice/" + customer + "/" + id;
}) };
Vue.prototype.$openImageOnNewTab = function(source) {
let win = window.open(source, "_blank");
win.focus();
};
Vue.prototype.$createFolder = function(folderName) {
this.$store.dispatch("createFolder", folderName);
};
Vue.prototype.$handleUploading = async function(files, parent_id) {
let fileBuffer = [];
// Append the file list to fileBuffer array
Array.prototype.push.apply(fileBuffer, files);
let fileSucceed = 0;
// Update files count in progressbar
store.commit("UPDATE_FILE_COUNT_PROGRESS", {
current: fileSucceed,
total: files.length,
});
// Reset upload progress to 0
store.commit("UPLOADING_FILE_PROGRESS", 0);
// Get parent id
let parentFolder = this.$store.getters.currentFolder
? this.$store.getters.currentFolder.unique_id
: 0;
let rootFolder = parent_id ? parent_id : parentFolder;
// Upload files
do {
let file = fileBuffer.shift(),
chunks = [];
// Calculate ceils
let size = this.$store.getters.config.chunkSize,
chunksCeil = Math.ceil(file.size / size);
// Create chunks
for (let i = 0; i < chunksCeil; i++) {
chunks.push(
file.slice(
i * size,
Math.min(i * size + size, file.size),
file.type
)
);
} }
Vue.prototype.$scrollTop = function () { // Set Data
var container = document.getElementById('vue-file-manager') let formData = new FormData(),
uploadedSize = 0,
isNotGeneralError = true,
filename =
Array(16)
.fill(0)
.map((x) =>
Math.random()
.toString(36)
.charAt(2)
)
.join("") +
"-" +
file.name +
".part";
if (container) { do {
container.scrollTop = 0 let isLast = chunks.length === 1,
} chunk = chunks.shift(),
} attempts = 0;
Vue.prototype.$getImage = function (source) { // Set form data
return source ? '/' + source : '' formData.set("file", chunk, filename);
} formData.set("parent_id", rootFolder);
formData.set("is_last", isLast);
Vue.prototype.$getCreditCardBrand = function (brand) { // Upload chunks
return `/assets/icons/${brand}.svg` do {
} await store
.dispatch("uploadFiles", {
form: formData,
fileSize: file.size,
totalUploadedSize: uploadedSize,
})
.then(() => {
uploadedSize = uploadedSize + chunk.size;
})
.catch((error) => {
// Count attempts
attempts++;
Vue.prototype.$getInvoiceLink = function (customer, id) { // Break uploading proccess
return '/invoice/' + customer + '/' + id if (error.response.status === 500) isNotGeneralError = false;
}
Vue.prototype.$openImageOnNewTab = function (source) { // Show Error
let win = window.open(source, '_blank') if (attempts === 3) this.$isSomethingWrong();
});
} while (isNotGeneralError && attempts !== 0 && attempts !== 3);
} while (isNotGeneralError && chunks.length !== 0);
win.focus() fileSucceed++;
}
Vue.prototype.$createFolder = function (folderName) { // Progress file log
this.$store.dispatch('createFolder', folderName) store.commit("UPDATE_FILE_COUNT_PROGRESS", {
} current: fileSucceed,
total: files.length,
});
} while (fileBuffer.length !== 0);
Vue.prototype.$handleUploading = async function (files, parent_id) { store.commit("UPDATE_FILE_COUNT_PROGRESS", undefined);
};
let fileBuffer = [] Vue.prototype.$uploadFiles = async function(files) {
this.$handleUploading(files, undefined);
};
// Append the file list to fileBuffer array Vue.prototype.$uploadExternalFiles = async function(event, parent_id) {
Array.prototype.push.apply(fileBuffer, files); // Prevent submit empty files
if (event.dataTransfer.items.length == 0) return;
let fileSucceed = 0 // Get files
let files = [...event.dataTransfer.items].map((item) => item.getAsFile());
// Update files count in progressbar this.$handleUploading(files, parent_id);
store.commit('UPDATE_FILE_COUNT_PROGRESS', { };
current: fileSucceed,
total: files.length
})
// Reset upload progress to 0 Vue.prototype.$downloadFile = function(url, filename) {
store.commit('UPLOADING_FILE_PROGRESS', 0) var anchor = document.createElement("a");
// Get parent id anchor.href = url;
let parentFolder = this.$store.getters.currentFolder ? this.$store.getters.currentFolder.unique_id : 0
let rootFolder = parent_id ? parent_id : parentFolder
// Upload files anchor.download = filename;
do {
let file = fileBuffer.shift(),
chunks = []
// Calculate ceils document.body.appendChild(anchor);
let size = this.$store.getters.config.chunkSize,
chunksCeil = Math.ceil(file.size / size);
// Create chunks anchor.click();
for (let i = 0; i < chunksCeil; i++) { };
chunks.push(file.slice(
i * size, Math.min(i * size + size, file.size), file.type
));
}
// Set Data Vue.prototype.$closePopup = function() {
let formData = new FormData(), events.$emit("popup:close");
uploadedSize = 0, };
isNotGeneralError = true,
filename = Array(16).fill(0).map(x => Math.random().toString(36).charAt(2)).join('') + '-' + file.name + '.part'
do { Vue.prototype.$isThisRoute = function(route, locations) {
let isLast = chunks.length === 1, return includes(locations, route.name);
chunk = chunks.shift(), };
attempts = 0
// Set form data Vue.prototype.$isThisLocation = function(location) {
formData.set('file', chunk, filename); // Get current location
formData.set('parent_id', rootFolder) let currentLocation =
formData.set('is_last', isLast); store.getters.currentFolder && store.getters.currentFolder.location
? store.getters.currentFolder.location
: undefined;
// Upload chunks // Check if type is object
do { if (typeof location === "Object" || location instanceof Object) {
await store.dispatch('uploadFiles', { return includes(location, currentLocation);
form: formData, } else {
fileSize: file.size, return currentLocation === location;
totalUploadedSize: uploadedSize }
}).then(() => { };
uploadedSize = uploadedSize + chunk.size
}).catch((error) => {
// Count attempts Vue.prototype.$checkPermission = function(type) {
attempts++ let currentPermission = store.getters.permission;
// Break uploading proccess // Check if type is object
if (error.response.status === 500) if (typeof type === "Object" || type instanceof Object) {
isNotGeneralError = false return includes(type, currentPermission);
} else {
return currentPermission === type;
}
};
// Show Error Vue.prototype.$isMobile = function() {
if (attempts === 3) const toMatch = [
this.$isSomethingWrong() /Android/i,
}) /webOS/i,
} while (isNotGeneralError && attempts !== 0 && attempts !== 3) /iPhone/i,
/iPad/i,
/iPod/i,
/BlackBerry/i,
/Windows Phone/i,
];
} while (isNotGeneralError && chunks.length !== 0) return toMatch.some((toMatchItem) => {
return navigator.userAgent.match(toMatchItem);
});
};
fileSucceed++ Vue.prototype.$isMinimalScale = function() {
let sizeType = store.getters.filesViewWidth;
// Progress file log return sizeType === "minimal-scale";
store.commit('UPDATE_FILE_COUNT_PROGRESS', { };
current: fileSucceed,
total: files.length
})
} while (fileBuffer.length !== 0) Vue.prototype.$isCompactScale = function() {
let sizeType = store.getters.filesViewWidth;
store.commit('UPDATE_FILE_COUNT_PROGRESS', undefined) return sizeType === "compact-scale";
} };
Vue.prototype.$uploadFiles = async function (files) { Vue.prototype.$isFullScale = function() {
let sizeType = store.getters.filesViewWidth;
this.$handleUploading(files, undefined) return sizeType === "full-scale";
} };
Vue.prototype.$uploadExternalFiles = async function (event, parent_id) { Vue.prototype.$isSomethingWrong = function() {
events.$emit("alert:open", {
title: this.$t("popup_error.title"),
message: this.$t("popup_error.message"),
});
};
},
};
// Prevent submit empty files export default Helpers;
if (event.dataTransfer.items.length == 0) return
// Get files
let files = [...event.dataTransfer.items].map(item => item.getAsFile());
this.$handleUploading(files, parent_id)
}
Vue.prototype.$downloadFile = function (url, filename) {
var anchor = document.createElement('a')
anchor.href = url
anchor.download = filename
document.body.appendChild(anchor)
anchor.click()
}
Vue.prototype.$closePopup = function () {
events.$emit('popup:close')
}
Vue.prototype.$isThisRoute = function (route, locations) {
return includes(locations, route.name)
}
Vue.prototype.$isThisLocation = function (location) {
// Get current location
let currentLocation = store.getters.currentFolder && store.getters.currentFolder.location ? store.getters.currentFolder.location : undefined
// Check if type is object
if (typeof location === 'Object' || location instanceof Object) {
return includes(location, currentLocation)
} else {
return currentLocation === location
}
}
Vue.prototype.$checkPermission = function (type) {
let currentPermission = store.getters.permission
// Check if type is object
if (typeof type === 'Object' || type instanceof Object) {
return includes(type, currentPermission)
} else {
return currentPermission === type
}
}
Vue.prototype.$isMobile = function () {
const toMatch = [
/Android/i,
/webOS/i,
/iPhone/i,
/iPad/i,
/iPod/i,
/BlackBerry/i,
/Windows Phone/i
]
return toMatch.some(toMatchItem => {
return navigator.userAgent.match(toMatchItem)
})
}
Vue.prototype.$isMinimalScale = function () {
let sizeType = store.getters.filesViewWidth
return sizeType === 'minimal-scale'
}
Vue.prototype.$isCompactScale = function () {
let sizeType = store.getters.filesViewWidth
return sizeType === 'compact-scale'
}
Vue.prototype.$isFullScale = function () {
let sizeType = store.getters.filesViewWidth
return sizeType === 'full-scale'
}
Vue.prototype.$isSomethingWrong = function () {
events.$emit('alert:open', {
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'),
})
}
}
}
export default Helpers

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

185
resources/js/main.js vendored
View File

@@ -1,100 +1,99 @@
require('./bootstrap'); require("./bootstrap");
import Vue from 'vue' import Vue from "vue";
import VueRouter from 'vue-router' import VueRouter from "vue-router";
import router from './router' import router from "./router";
import i18n from './i18n/index.js' import i18n from "./i18n/index.js";
import App from './App.vue' import App from "./App.vue";
import store from './store' import store from "./store";
import Helpers from './helpers' import Helpers from "./helpers";
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from "@fortawesome/fontawesome-svg-core";
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
import { import {
faLock, faLock,
faLockOpen, faLockOpen,
faDownload, faDownload,
faUserFriends, faUserFriends,
faCheck, faCheck,
faLink, faLink,
faUserEdit, faUserEdit,
faUser, faUser,
faFileAudio, faFileAudio,
faFileVideo, faFileVideo,
faSyncAlt, faSyncAlt,
faShare, faShare,
faHome, faHome,
faEyeSlash, faEyeSlash,
faBars, faBars,
faSearch, faSearch,
faEllipsisV, faEllipsisV,
faChevronLeft, faChevronLeft,
faChevronRight, faChevronRight,
faChevronDown, faChevronDown,
faUpload, faUpload,
faFolderPlus, faFolderPlus,
faTh, faTh,
faThList, faThList,
faInfo, faInfo,
faFolder, faFolder,
faFile, faFile,
faFileImage, faFileImage,
faTimes, faTimes,
faSort, faSort,
faTrashAlt, faTrashAlt,
faHdd, faHdd,
faEllipsisH, faEllipsisH,
faPencilAlt, faPencilAlt,
} from '@fortawesome/free-solid-svg-icons' } from "@fortawesome/free-solid-svg-icons";
library.add( library.add(
faLock, faLock,
faLockOpen, faLockOpen,
faDownload, faDownload,
faUserFriends, faUserFriends,
faCheck, faCheck,
faLink, faLink,
faUserEdit, faUserEdit,
faUser, faUser,
faFileAudio, faFileAudio,
faFileVideo, faFileVideo,
faHdd, faHdd,
faSyncAlt, faSyncAlt,
faShare, faShare,
faHome, faHome,
faEyeSlash, faEyeSlash,
faBars, faBars,
faSearch, faSearch,
faEllipsisV, faEllipsisV,
faChevronLeft, faChevronLeft,
faChevronRight, faChevronRight,
faChevronDown, faChevronDown,
faUpload, faUpload,
faTrashAlt, faTrashAlt,
faFolderPlus, faFolderPlus,
faTh, faTh,
faThList, faThList,
faInfo, faInfo,
faFolder, faFolder,
faFile, faFile,
faFileImage, faFileImage,
faTimes, faTimes,
faSort, faSort,
faEllipsisH, faEllipsisH,
faPencilAlt, faPencilAlt
) );
Vue.component('FontAwesomeIcon', FontAwesomeIcon) Vue.component("FontAwesomeIcon", FontAwesomeIcon);
Vue.use(VueRouter) Vue.use(VueRouter);
Vue.use(Helpers) Vue.use(Helpers);
Vue.config.productionTip = false Vue.config.productionTip = false;
var vueFileManager = new Vue({ var vueFileManager = new Vue({
i18n, i18n,
store, store,
router, router,
data: { data: {
config, config,
}, },
render: h => h(App) render: (h) => h(App),
}).$mount('#app') }).$mount("#app");