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
-71
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
+228 -95
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",
+1
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"
} }
+419 -1
View File
File diff suppressed because one or more lines are too long
+140191 -2
View File
File diff suppressed because one or more lines are too long
+31 -1
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"
} }
+101 -98
View File
@@ -1,10 +1,11 @@
<template> <template>
<div id="vue-file-manager" v-cloak> <div id="vue-file-manager" v-cloak>
<!--System alerts--> <!--System alerts-->
<Alert/> <Alert />
<div id="application-wrapper" v-if="layout === 'authorized'"> <div id="application-wrapper" v-if="layout === 'authorized'">
<!-- Full File Preview -->
<FileFullPreview />
<!--Mobile Navigation--> <!--Mobile Navigation-->
<MobileNavigation /> <MobileNavigation />
@@ -13,59 +14,61 @@
<Confirm /> <Confirm />
<!--Share Item setup--> <!--Share Item setup-->
<ShareCreate/> <ShareCreate />
<ShareEdit/> <ShareEdit />
<!--Move item setup--> <!--Move item setup-->
<MoveItem/> <MoveItem />
<!--Mobile Menu--> <!--Mobile Menu-->
<MobileMenu/> <MobileMenu />
<!--Navigation Sidebar--> <!--Navigation Sidebar-->
<MenuBar/> <MenuBar />
<!--Toastr--> <!--Toastr-->
<ToastrWrapper/> <ToastrWrapper />
<!--File page--> <!--File page-->
<keep-alive :include="['Admin', 'Users']"> <keep-alive :include="['Admin', 'Users']">
<router-view :class="{'is-scaled-down': isScaledDown}"/> <router-view :class="{ 'is-scaled-down': isScaledDown }" />
</keep-alive> </keep-alive>
</div> </div>
<router-view v-if="layout === 'unauthorized'"/> <router-view v-if="layout === 'unauthorized'" />
<CookieDisclaimer /> <CookieDisclaimer />
<!--Background vignette--> <!--Background vignette-->
<Vignette/> <Vignette />
</div> </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,
FileFullPreview,
MobileMenu, MobileMenu,
ShareEdit, ShareEdit,
MoveItem, MoveItem,
@@ -75,96 +78,97 @@
Alert, Alert,
}, },
computed: { computed: {
...mapGetters([ ...mapGetters(["isLogged", "isGuest", "config"]),
'isLogged', 'isGuest', 'config'
]),
layout() { layout() {
if (includes([ if (
'InstallationDisclaimer', includes(
'SubscriptionService', [
'StripeCredentials', "InstallationDisclaimer",
'SubscriptionPlans', "SubscriptionService",
'ForgottenPassword', "StripeCredentials",
'CreateNewPassword', "SubscriptionPlans",
'EnvironmentSetup', "ForgottenPassword",
'VerifyByPassword', "CreateNewPassword",
'SaaSLandingPage', "EnvironmentSetup",
'BillingsDetail', "VerifyByPassword",
'NotFoundShared', "SaaSLandingPage",
'AdminAccount', "BillingsDetail",
'PurchaseCode', "NotFoundShared",
'DynamicPage', "AdminAccount",
'SharedPage', "PurchaseCode",
'ContactUs', "DynamicPage",
'AppSetup', "SharedPage",
'Database', "ContactUs",
'Upgrade', "AppSetup",
'SignIn', "Database",
'SignUp', "Upgrade",
], this.$route.name) "SignIn",
"SignUp",
],
this.$route.name
)
) { ) {
return 'unauthorized' return "unauthorized";
} }
return 'authorized' return "authorized";
} },
}, },
data() { data() {
return { return {
isScaledDown: false, isScaledDown: false,
} };
}, },
beforeMount() { beforeMount() {
// Store config to vuex // Store config to vuex
this.$store.commit('INIT', { this.$store.commit("INIT", {
authCookie: this.$root.$data.config.hasAuthCookie, authCookie: this.$root.$data.config.hasAuthCookie,
config: this.$root.$data.config, config: this.$root.$data.config,
rootDirectory: { rootDirectory: {
name: this.$t('locations.home'), name: this.$t("locations.home"),
location: 'base', location: "base",
unique_id: 0, unique_id: 0,
} },
}) });
// Get installation state // Get installation state
let installation = this.$root.$data.config.installation let installation = this.$root.$data.config.installation;
// Redirect to database verify code // Redirect to database verify code
if ( installation === 'setup-database') { if (installation === "setup-database") {
this.$router.push({name: 'PurchaseCode'}) this.$router.push({ name: "PurchaseCode" });
} }
// Redirect to starting installation process // Redirect to starting installation process
if ( installation === 'setup-disclaimer' ) { if (installation === "setup-disclaimer") {
this.$router.push({name: 'InstallationDisclaimer'}) this.$router.push({ name: "InstallationDisclaimer" });
} }
}, },
mounted() { mounted() {
// Handle mobile navigation scale animation // Handle mobile navigation scale animation
events.$on('show:mobile-navigation', () => this.isScaledDown = true) events.$on("show:mobile-navigation", () => (this.isScaledDown = true));
events.$on('hide:mobile-navigation', () => this.isScaledDown = false) events.$on("hide:mobile-navigation", () => (this.isScaledDown = false));
events.$on('mobileMenu:show', () => this.isScaledDown = true) events.$on("mobileMenu:show", () => (this.isScaledDown = true));
events.$on('fileItem:deselect', () => this.isScaledDown = false) 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;
@@ -172,42 +176,41 @@
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
@media (prefers-color-scheme: dark) {
// Dark mode support
@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: .95; opacity: 0.95;
}
} }
} }
}
</style> </style>
+172 -116
View File
@@ -7,14 +7,24 @@
ref="contextmenu" ref="contextmenu"
> >
<!--ContextMenu for trash location--> <!--ContextMenu for trash location-->
<div v-if="$isThisLocation(['trash', 'trash-root']) && $checkPermission('master')" id="menu-list" class="menu-options"> <div
v-if="
$isThisLocation(['trash', 'trash-root']) && $checkPermission('master')
"
id="menu-list"
class="menu-options"
>
<ul class="menu-option-group"> <ul class="menu-option-group">
<li class="menu-option" @click="$store.dispatch('restoreItem', item)" v-if="item"> <li
class="menu-option"
@click="$store.dispatch('restoreItem', item)"
v-if="item"
>
<div class="icon"> <div class="icon">
<life-buoy-icon size="17"></life-buoy-icon> <life-buoy-icon size="17"></life-buoy-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.restore') }} {{ $t("context_menu.restore") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="deleteItem" v-if="item"> <li class="menu-option" @click="deleteItem" v-if="item">
@@ -22,7 +32,7 @@
<trash-2-icon size="17"></trash-2-icon> <trash-2-icon size="17"></trash-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.delete') }} {{ $t("context_menu.delete") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="$store.dispatch('emptyTrash')"> <li class="menu-option" @click="$store.dispatch('emptyTrash')">
@@ -30,7 +40,7 @@
<trash-icon size="17"></trash-icon> <trash-icon size="17"></trash-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.empty_trash') }} {{ $t("context_menu.empty_trash") }}
</div> </div>
</li> </li>
</ul> </ul>
@@ -40,29 +50,37 @@
<eye-icon size="17"></eye-icon> <eye-icon size="17"></eye-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.detail') }} {{ $t("context_menu.detail") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="downloadItem" v-if="! isFolder"> <li class="menu-option" @click="downloadItem" v-if="!isFolder">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
<!--ContextMenu for Base location with MASTER permission--> <!--ContextMenu for Base location with MASTER permission-->
<div v-if="$isThisLocation(['shared']) && $checkPermission('master')" id="menu-list" class="menu-options"> <div
v-if="$isThisLocation(['shared']) && $checkPermission('master')"
id="menu-list"
class="menu-options"
>
<ul class="menu-option-group" v-if="item && isFolder"> <ul class="menu-option-group" v-if="item && isFolder">
<li class="menu-option" @click="addToFavourites"> <li class="menu-option" @click="addToFavourites">
<div class="icon"> <div class="icon">
<star-icon size="17"></star-icon> <star-icon size="17"></star-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ isInFavourites ? $t('context_menu.remove_from_favourites') : $t('context_menu.add_to_favourites') }} {{
isInFavourites
? $t("context_menu.remove_from_favourites")
: $t("context_menu.add_to_favourites")
}}
</div> </div>
</li> </li>
</ul> </ul>
@@ -72,7 +90,11 @@
<link-icon size="17"></link-icon> <link-icon size="17"></link-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ item.shared ? $t('context_menu.share_edit') : $t('context_menu.share') }} {{
item.shared
? $t("context_menu.share_edit")
: $t("context_menu.share")
}}
</div> </div>
</li> </li>
<li class="menu-option" @click="deleteItem"> <li class="menu-option" @click="deleteItem">
@@ -80,7 +102,7 @@
<trash-2-icon size="17"></trash-2-icon> <trash-2-icon size="17"></trash-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.delete') }} {{ $t("context_menu.delete") }}
</div> </div>
</li> </li>
</ul> </ul>
@@ -90,30 +112,47 @@
<eye-icon size="17"></eye-icon> <eye-icon size="17"></eye-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.detail') }} {{ $t("context_menu.detail") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="downloadItem" v-if="! isFolder"> <li class="menu-option" @click="downloadItem" v-if="!isFolder">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
<!--ContextMenu for Base location with MASTER permission--> <!--ContextMenu for Base location with MASTER permission-->
<div v-if="$isThisLocation(['base', 'participant_uploads', 'latest']) && $checkPermission('master')" id="menu-list" class="menu-options"> <div
v-if="
<ul class="menu-option-group" v-if="! $isThisLocation(['participant_uploads', 'latest'])"> $isThisLocation(['base', 'participant_uploads', 'latest']) &&
<li class="menu-option" @click="addToFavourites" v-if="item && isFolder"> $checkPermission('master')
"
id="menu-list"
class="menu-options"
>
<ul
class="menu-option-group"
v-if="!$isThisLocation(['participant_uploads', 'latest'])"
>
<li
class="menu-option"
@click="addToFavourites"
v-if="item && isFolder"
>
<div class="icon"> <div class="icon">
<star-icon size="17"></star-icon> <star-icon size="17"></star-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ isInFavourites ? $t('context_menu.remove_from_favourites') : $t('context_menu.add_to_favourites') }} {{
isInFavourites
? $t("context_menu.remove_from_favourites")
: $t("context_menu.add_to_favourites")
}}
</div> </div>
</li> </li>
<li class="menu-option" @click="createFolder"> <li class="menu-option" @click="createFolder">
@@ -121,7 +160,7 @@
<folder-plus-icon size="17"></folder-plus-icon> <folder-plus-icon size="17"></folder-plus-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.create_folder') }} {{ $t("context_menu.create_folder") }}
</div> </div>
</li> </li>
</ul> </ul>
@@ -131,7 +170,7 @@
<corner-down-right-icon size="17"></corner-down-right-icon> <corner-down-right-icon size="17"></corner-down-right-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.move') }} {{ $t("context_menu.move") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="shareItem"> <li class="menu-option" @click="shareItem">
@@ -139,7 +178,11 @@
<link-icon size="17"></link-icon> <link-icon size="17"></link-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ item.shared ? $t('context_menu.share_edit') : $t('context_menu.share') }} {{
item.shared
? $t("context_menu.share_edit")
: $t("context_menu.share")
}}
</div> </div>
</li> </li>
<li class="menu-option" @click="deleteItem"> <li class="menu-option" @click="deleteItem">
@@ -147,7 +190,7 @@
<trash-2-icon size="17"></trash-2-icon> <trash-2-icon size="17"></trash-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.delete') }} {{ $t("context_menu.delete") }}
</div> </div>
</li> </li>
</ul> </ul>
@@ -157,29 +200,33 @@
<eye-icon size="17"></eye-icon> <eye-icon size="17"></eye-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.detail') }} {{ $t("context_menu.detail") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="downloadItem" v-if="! isFolder"> <li class="menu-option" @click="downloadItem" v-if="!isFolder">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
<!--ContextMenu for Base location with EDITOR permission--> <!--ContextMenu for Base location with EDITOR permission-->
<div v-if="$isThisLocation(['base', 'public']) && $checkPermission('editor')" id="menu-list" class="menu-options"> <div
v-if="$isThisLocation(['base', 'public']) && $checkPermission('editor')"
id="menu-list"
class="menu-options"
>
<ul class="menu-option-group"> <ul class="menu-option-group">
<li class="menu-option" @click="createFolder"> <li class="menu-option" @click="createFolder">
<div class="icon"> <div class="icon">
<folder-plus-icon size="17"></folder-plus-icon> <folder-plus-icon size="17"></folder-plus-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.create_folder') }} {{ $t("context_menu.create_folder") }}
</div> </div>
</li> </li>
</ul> </ul>
@@ -189,7 +236,7 @@
<corner-down-right-icon size="17"></corner-down-right-icon> <corner-down-right-icon size="17"></corner-down-right-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.move') }} {{ $t("context_menu.move") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="deleteItem"> <li class="menu-option" @click="deleteItem">
@@ -197,7 +244,7 @@
<trash-2-icon size="17"></trash-2-icon> <trash-2-icon size="17"></trash-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.delete') }} {{ $t("context_menu.delete") }}
</div> </div>
</li> </li>
</ul> </ul>
@@ -207,37 +254,41 @@
<eye-icon size="17"></eye-icon> <eye-icon size="17"></eye-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.detail') }} {{ $t("context_menu.detail") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="downloadItem" v-if="! isFolder"> <li class="menu-option" @click="downloadItem" v-if="!isFolder">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
<!--ContextMenu for Base location with VISITOR permission--> <!--ContextMenu for Base location with VISITOR permission-->
<div v-if="$isThisLocation(['base', 'public']) && $checkPermission('visitor')" id="menu-list" class="menu-options"> <div
v-if="$isThisLocation(['base', 'public']) && $checkPermission('visitor')"
id="menu-list"
class="menu-options"
>
<ul class="menu-option-group" v-if="item"> <ul class="menu-option-group" v-if="item">
<li class="menu-option" @click="ItemDetail"> <li class="menu-option" @click="ItemDetail">
<div class="icon"> <div class="icon">
<eye-icon size="17"></eye-icon> <eye-icon size="17"></eye-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.detail') }} {{ $t("context_menu.detail") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="downloadItem" v-if="! isFolder"> <li class="menu-option" @click="downloadItem" v-if="!isFolder">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
@@ -246,7 +297,7 @@
</template> </template>
<script> <script>
import { import {
CornerDownRightIcon, CornerDownRightIcon,
DownloadCloudIcon, DownloadCloudIcon,
FolderPlusIcon, FolderPlusIcon,
@@ -256,12 +307,12 @@
StarIcon, StarIcon,
LinkIcon, LinkIcon,
EyeIcon, EyeIcon,
} from 'vue-feather-icons' } from "vue-feather-icons";
import {mapGetters} from 'vuex' import { mapGetters } from "vuex";
import {events} from '@/bus' import { events } from "@/bus";
export default { export default {
name: 'ContextMenu', name: "ContextMenu",
components: { components: {
CornerDownRightIcon, CornerDownRightIcon,
DownloadCloudIcon, DownloadCloudIcon,
@@ -274,21 +325,26 @@
EyeIcon, EyeIcon,
}, },
computed: { computed: {
...mapGetters(['user']), ...mapGetters(["user"]),
favourites() { favourites() {
return this.user.relationships.favourites.data.attributes.folders return this.user.relationships.favourites.data.attributes.folders;
}, },
isFolder() { isFolder() {
return this.item && this.item.type === 'folder' return this.item && this.item.type === "folder";
}, },
isFile() { isFile() {
return (this.item && this.item.type !== 'folder') && (this.item && this.item.type !== 'image') return (
this.item &&
this.item.type !== "folder" &&
this.item &&
this.item.type !== "image"
);
}, },
isImage() { isImage() {
return this.item && this.item.type === 'image' return this.item && this.item.type === "image";
}, },
isInFavourites() { isInFavourites() {
return this.favourites.find(el => el.unique_id == this.item.unique_id) return this.favourites.find((el) => el.unique_id == this.item.unique_id);
}, },
}, },
data() { data() {
@@ -296,134 +352,131 @@
item: undefined, item: undefined,
isVisible: false, isVisible: false,
positionX: 0, positionX: 0,
positionY: 0 positionY: 0,
} };
}, },
methods: { methods: {
moveItem() { moveItem() {
// Open move item popup // Open move item popup
events.$emit('popup:open', {name: 'move', item: this.item}) events.$emit("popup:open", { name: "move", item: this.item });
}, },
shareItem() { shareItem() {
if (this.item.shared) { if (this.item.shared) {
// Open share item popup // Open share item popup
events.$emit('popup:open', {name: 'share-edit', item: this.item}) events.$emit("popup:open", { name: "share-edit", item: this.item });
} else { } else {
// Open share item popup // Open share item popup
events.$emit('popup:open', {name: 'share-create', item: this.item}) events.$emit("popup:open", { name: "share-create", item: this.item });
} }
}, },
addToFavourites() { addToFavourites() {
// Check if folder is in favourites and then add/remove from favourites // Check if folder is in favourites and then add/remove from favourites
if (this.favourites && !this.favourites.find(el => el.unique_id == this.item.unique_id)) { if (
this.$store.dispatch('addToFavourites', this.item) this.favourites &&
!this.favourites.find((el) => el.unique_id == this.item.unique_id)
) {
this.$store.dispatch("addToFavourites", this.item);
} else { } else {
this.$store.dispatch('removeFromFavourites', this.item) this.$store.dispatch("removeFromFavourites", this.item);
} }
}, },
downloadItem() { downloadItem() {
// Download file // Download file
this.$downloadFile( this.$downloadFile(
this.item.file_url, this.item.file_url,
this.item.name + '.' + this.item.mimetype this.item.name + "." + this.item.mimetype
) );
}, },
ItemDetail() { ItemDetail() {
// Dispatch load file info detail // Dispatch load file info detail
this.$store.commit('GET_FILEINFO_DETAIL', this.item) this.$store.commit("GET_FILEINFO_DETAIL", this.item);
// Show panel if is not open // Show panel if is not open
this.$store.dispatch('fileInfoToggle', true) this.$store.dispatch("fileInfoToggle", true);
}, },
deleteItem() { deleteItem() {
// Dispatch remove item // Dispatch remove item
this.$store.dispatch('deleteItem', this.item) this.$store.dispatch("deleteItem", this.item);
}, },
createFolder() { createFolder() {
// Create folder // Create folder
this.$createFolder(this.$t('popup_create_folder.folder_default_name')) this.$createFolder(this.$t("popup_create_folder.folder_default_name"));
}, },
closeAndResetContextMenu() { closeAndResetContextMenu() {
// Close context menu // Close context menu
this.isVisible = false this.isVisible = false;
// Reset item container // Reset item container
this.item = undefined this.item = undefined;
}, },
showFolderActionsMenu() { showFolderActionsMenu() {
let container = document.getElementById('folder-actions') let container = document.getElementById("folder-actions");
this.positionX = container.offsetLeft + 16 this.positionX = container.offsetLeft + 16;
this.positionY = container.offsetTop + 30 this.positionY = container.offsetTop + 30;
// Show context menu // Show context menu
this.isVisible = true this.isVisible = true;
}, },
showContextMenu(event) { showContextMenu(event) {
let parent = document.getElementById('menu-list') let parent = document.getElementById("menu-list");
let nodesSameClass = parent.getElementsByClassName("menu-option") let nodesSameClass = parent.getElementsByClassName("menu-option");
let VerticalOffsetArea = nodesSameClass.length * 50 let VerticalOffsetArea = nodesSameClass.length * 50;
let HorizontalOffsetArea = 190 let HorizontalOffsetArea = 190;
let container = document.getElementById('files-view') let container = document.getElementById("files-view");
var offset = container.getClientRects()[0]; var offset = container.getClientRects()[0];
let x = event.clientX - offset.left let x = event.clientX - offset.left;
let y = event.clientY - offset.top let y = event.clientY - offset.top;
// Set position Y // Set position Y
if ((container.offsetHeight - y) < VerticalOffsetArea) { if (container.offsetHeight - y < VerticalOffsetArea) {
this.positionY = y - VerticalOffsetArea this.positionY = y - VerticalOffsetArea;
} else { } else {
this.positionY = y this.positionY = y;
} }
// Set position X // Set position X
if ((container.offsetWidth - x) < HorizontalOffsetArea) { if (container.offsetWidth - x < HorizontalOffsetArea) {
this.positionX = x - HorizontalOffsetArea this.positionX = x - HorizontalOffsetArea;
} else { } else {
this.positionX = x this.positionX = x;
} }
// Show context menu // Show context menu
this.isVisible = true this.isVisible = true;
} },
}, },
created() { created() {
events.$on('contextMenu:show', (event, item) => { events.$on("contextMenu:show", (event, item) => {
// Store item // Store item
this.item = item this.item = item;
// Show context menu // Show context menu
setTimeout(() => this.showContextMenu(event, item), 10) setTimeout(() => this.showContextMenu(event, item), 10);
}) });
events.$on('contextMenu:hide', () => (this.closeAndResetContextMenu())) events.$on("contextMenu:hide", () => this.closeAndResetContextMenu());
events.$on('folder:actions', folder => {
events.$on("folder:actions", (folder) => {
// Store item // Store item
this.item = folder this.item = folder;
if (this.isVisible) if (this.isVisible) this.isVisible = false;
this.isVisible = false else this.showFolderActionsMenu();
else });
this.showFolderActionsMenu() },
};
})
}
}
</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";
.menu-option { .menu-option {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -435,9 +488,9 @@
.text-label { .text-label {
@include font-size(16); @include font-size(16);
} }
} }
.contextmenu { .contextmenu {
min-width: 250px; min-width: 250px;
position: absolute; position: absolute;
z-index: 99; z-index: 99;
@@ -449,9 +502,9 @@
&.showed { &.showed {
display: block; display: block;
} }
} }
.menu-options { .menu-options {
list-style: none; list-style: none;
width: 100%; width: 100%;
margin: 0; margin: 0;
@@ -487,20 +540,23 @@
color: $theme; color: $theme;
} }
path, line, polyline, rect, circle, polygon { path,
line,
polyline,
rect,
circle,
polygon {
stroke: $theme; stroke: $theme;
} }
} }
} }
} }
@media (prefers-color-scheme: dark) {
@media (prefers-color-scheme: dark) {
.contextmenu { .contextmenu {
background: $dark_mode_foreground; background: $dark_mode_foreground;
.menu-options { .menu-options {
.menu-option-group { .menu-option-group {
border-color: $dark_mode_border_color; border-color: $dark_mode_border_color;
} }
@@ -514,5 +570,5 @@
} }
} }
} }
} }
</style> </style>
@@ -10,8 +10,8 @@
:draggable="canDrag" :draggable="canDrag"
@dragstart="$emit('dragstart')" @dragstart="$emit('dragstart')"
@drop=" @drop="
$emit('drop') $emit('drop');
area = false area = false;
" "
@dragleave="dragLeave" @dragleave="dragLeave"
@dragover.prevent="dragEnter" @dragover.prevent="dragEnter"
@@ -26,13 +26,23 @@
</span> </span>
<!--Folder thumbnail--> <!--Folder thumbnail-->
<FontAwesomeIcon v-if="isFile" class="file-icon" icon="file"/> <FontAwesomeIcon v-if="isFile" class="file-icon" icon="file" />
<!--Image thumbnail--> <!--Image thumbnail-->
<img v-if="isImage" class="image" :src="data.thumbnail" :alt="data.name"/> <img
v-if="isImage"
class="image"
:src="data.thumbnail"
:alt="data.name"
/>
<!--Else show only folder icon--> <!--Else show only folder icon-->
<FontAwesomeIcon v-if="isFolder" :class="{'is-deleted': isDeleted}" class="folder-icon" icon="folder"/> <FontAwesomeIcon
v-if="isFolder"
:class="{ 'is-deleted': isDeleted }"
class="folder-icon"
icon="folder"
/>
</div> </div>
<!--Name--> <!--Name-->
@@ -48,31 +58,48 @@
</b> </b>
<div class="item-info"> <div class="item-info">
<!--Shared Icon--> <!--Shared Icon-->
<div v-if="$checkPermission('master') && data.shared" class="item-shared"> <div
v-if="$checkPermission('master') && data.shared"
class="item-shared"
>
<link-icon size="12" class="shared-icon"></link-icon> <link-icon size="12" class="shared-icon"></link-icon>
</div> </div>
<!--Participant owner Icon--> <!--Participant owner Icon-->
<div v-if="$checkPermission('master') && data.user_scope !== 'master'" class="item-shared"> <div
v-if="$checkPermission('master') && data.user_scope !== 'master'"
class="item-shared"
>
<user-plus-icon size="12" class="shared-icon"></user-plus-icon> <user-plus-icon size="12" class="shared-icon"></user-plus-icon>
</div> </div>
<!--Filesize and timestamp--> <!--Filesize and timestamp-->
<span v-if="! isFolder" class="item-size">{{ data.filesize }}, {{ timeStamp }}</span> <span v-if="!isFolder" class="item-size"
>{{ data.filesize }}, {{ timeStamp }}</span
>
<!--Folder item counts--> <!--Folder item counts-->
<span v-if="isFolder" class="item-length"> <span v-if="isFolder" class="item-length">
{{ folderItems == 0 ? $t('folder.empty') : $tc('folder.item_counts', folderItems) }}, {{ timeStamp }} {{
folderItems == 0
? $t("folder.empty")
: $tc("folder.item_counts", folderItems)
}}, {{ timeStamp }}
</span> </span>
</div> </div>
</div> </div>
<!--Go Next icon--> <!--Go Next icon-->
<div class="actions" v-if="$isMobile() && ! ( $checkPermission('visitor') && isFolder )"> <div
class="actions"
v-if="$isMobile() && !($checkPermission('visitor') && isFolder)"
>
<span @click.stop="showItemActions" class="show-actions"> <span @click.stop="showItemActions" class="show-actions">
<FontAwesomeIcon icon="ellipsis-v" class="icon-action"></FontAwesomeIcon> <FontAwesomeIcon
icon="ellipsis-v"
class="icon-action"
></FontAwesomeIcon>
</span> </span>
</div> </div>
</div> </div>
@@ -80,164 +107,184 @@
</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";
},
isPdf() {
return this.data.mimetype === "pdf";
},
isVideo() {
return this.data.type === "video";
}, },
canEditName() { canEditName() {
return !this.$isMobile() return (
&& !this.$isThisLocation(['trash', 'trash-root']) !this.$isMobile() &&
&& !this.$checkPermission('visitor') !this.$isThisLocation(["trash", "trash-root"]) &&
&& !(this.sharedDetail && this.sharedDetail.type === 'file') !this.$checkPermission("visitor") &&
!(this.sharedDetail && this.sharedDetail.type === "file")
);
}, },
canDrag() { canDrag() {
return !this.isDeleted && this.$checkPermission(['master', 'editor']) return !this.isDeleted && this.$checkPermission(["master", "editor"]);
}, },
timeStamp() { timeStamp() {
return this.data.deleted_at ? this.$t('item_thumbnail.deleted_at', {time: this.data.deleted_at}) : this.data.created_at return this.data.deleted_at
? this.$t("item_thumbnail.deleted_at", { time: this.data.deleted_at })
: this.data.created_at;
}, },
folderItems() { folderItems() {
return this.data.deleted_at ? this.data.trashed_items : this.data.items return this.data.deleted_at ? this.data.trashed_items : this.data.items;
}, },
isDeleted() { isDeleted() {
return this.data.deleted_at ? true : false return this.data.deleted_at ? true : false;
} },
}, },
filters: { filters: {
limitCharacters(str) { limitCharacters(str) {
if (str.length > 3) { if (str.length > 3) {
return str.substring(0, 3) + '...'; return str.substring(0, 3) + "...";
} else { } else {
return str.substring(0, 3); return str.substring(0, 3);
} }
},
}
}, },
data() { data() {
return { return {
isClicked: false, isClicked: false,
area: false, area: false,
itemName: undefined, itemName: undefined,
} };
}, },
methods: { methods: {
showItemActions() { showItemActions() {
// Load file info detail // Load file info detail
this.$store.commit('GET_FILEINFO_DETAIL', this.data) this.$store.commit("GET_FILEINFO_DETAIL", this.data);
//this.isClicked = true //this.isClicked = true
events.$emit('mobileMenu:show') events.$emit("mobileMenu:show");
}, },
dragEnter() { dragEnter() {
if (this.data.type !== 'folder') return if (this.data.type !== "folder") return;
this.area = true this.area = true;
}, },
dragLeave() { dragLeave() {
this.area = false this.area = false;
}, },
clickedItem(e) { clickedItem(e) {
events.$emit('contextMenu:hide') events.$emit("contextMenu:hide");
events.$emit('fileItem:deselect') events.$emit("fileItem:deselect");
// Set clicked item // Set clicked item
this.isClicked = true this.isClicked = true;
// Open in mobile version on first click // Open in mobile version on first click
if (this.$isMobile() && this.isFolder) { if (this.$isMobile() && this.isFolder) {
// Go to folder // Go to folder
if (this.$isThisLocation('public')) { if (this.$isThisLocation("public")) {
this.$store.dispatch('browseShared', [{folder: this.data, back: false, init: false}]) this.$store.dispatch("browseShared", [
{ folder: this.data, back: false, init: false },
]);
} else { } else {
this.$store.dispatch('getFolder', [{folder: this.data, back: false, init: false}]) this.$store.dispatch("getFolder", [
{ folder: this.data, back: false, init: false },
]);
}
}
if (this.$isMobile()) {
if (this.isImage || this.isVideo) {
events.$emit("fileFullPreview:show");
} }
} }
// Load file info detail // Load file info detail
this.$store.commit('GET_FILEINFO_DETAIL', this.data) this.$store.commit("GET_FILEINFO_DETAIL", this.data);
// Get target classname // Get target classname
let itemClass = e.target.className let itemClass = e.target.className;
if (['name', 'icon', 'file-link', 'file-icon-text'].includes(itemClass)) if (["name", "icon", "file-link", "file-icon-text"].includes(itemClass))
return return;
}, },
goToItem() { goToItem() {
if (this.isImage) { if (this.isImage || this.isVideo) {
this.$openImageOnNewTab(this.data.file_url) // this.$openImageOnNewTab(this.data.file_url)
events.$emit("fileFullPreview:show");
} }
if (this.isFile) { if (this.isFile && !this.isPdf && !this.isVideo) {
this.$downloadFile( this.$downloadFile(
this.data.file_url, this.data.file_url,
this.data.name + '.' + this.data.mimetype this.data.name + "." + this.data.mimetype
) );
} }
if (this.isFolder) { if (this.isFolder) {
if (this.$isThisLocation("public")) {
if (this.$isThisLocation('public')) { this.$store.dispatch("browseShared", [
this.$store.dispatch('browseShared', [{folder: this.data, back: false, init: false}]) { folder: this.data, back: false, init: false },
]);
} else { } else {
this.$store.dispatch('getFolder', [{folder: this.data, back: false, init: false}]) this.$store.dispatch("getFolder", [
{ folder: this.data, back: false, init: false },
]);
} }
} }
}, },
renameItem: debounce(function (e) { renameItem: debounce(function (e) {
// Prevent submit empty string // Prevent submit empty string
if (e.target.innerText.trim() === '') return if (e.target.innerText.trim() === "") return;
this.$store.dispatch('renameItem', { this.$store.dispatch("renameItem", {
unique_id: this.data.unique_id, unique_id: this.data.unique_id,
type: this.data.type, type: this.data.type,
name: e.target.innerText name: e.target.innerText,
}) });
}, 300) }, 300),
}, },
created() { created() {
this.itemName = this.data.name this.itemName = this.data.name;
events.$on('fileItem:deselect', () => { events.$on("fileItem:deselect", () => {
// Deselect file // Deselect file
this.isClicked = false this.isClicked = false;
}) });
// Change item name // Change item name
events.$on('change:name', (item) => { events.$on("change:name", (item) => {
if (this.data.unique_id == item.unique_id) this.itemName = item.name 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;
@@ -287,7 +334,9 @@
.shared-icon { .shared-icon {
vertical-align: middle; vertical-align: middle;
path, circle, line { path,
circle,
line {
stroke: $theme; stroke: $theme;
} }
} }
@@ -308,7 +357,7 @@
user-select: text; user-select: text;
} }
&[contenteditable='true']:hover { &[contenteditable="true"]:hover {
text-decoration: underline; text-decoration: underline;
} }
} }
@@ -416,23 +465,19 @@
} }
} }
} }
} }
@media (prefers-color-scheme: dark) {
@media (prefers-color-scheme: dark) {
.file-wrapper { .file-wrapper {
.icon-item { .icon-item {
.file-icon { .file-icon {
path { path {
fill: $dark_mode_foreground; fill: $dark_mode_foreground;
stroke: #2F3C54; stroke: #2f3c54;
} }
} }
.folder-icon { .folder-icon {
&.is-deleted { &.is-deleted {
path { path {
fill: lighten($dark_mode_foreground, 5%); fill: lighten($dark_mode_foreground, 5%);
@@ -441,15 +486,12 @@
} }
} }
.file-item { .file-item {
&:hover, &:hover,
&.is-clicked { &.is-clicked {
background: $dark_mode_foreground; background: $dark_mode_foreground;
.file-icon { .file-icon {
path { path {
fill: $dark_mode_background; fill: $dark_mode_background;
} }
@@ -458,7 +500,6 @@
} }
.item-name { .item-name {
.name { .name {
color: $dark_mode_text_primary; color: $dark_mode_text_primary;
} }
@@ -469,5 +510,5 @@
} }
} }
} }
} }
</style> </style>
+205 -113
View File
@@ -8,55 +8,80 @@
@click="closeAndResetContextMenu" @click="closeAndResetContextMenu"
> >
<div class="menu-wrapper"> <div class="menu-wrapper">
<!--Item Thumbnail--> <!--Item Thumbnail-->
<ThumbnailItem class="item-thumbnail" :item="fileInfoDetail" info="metadata"/> <ThumbnailItem
class="item-thumbnail"
:item="fileInfoDetail"
info="metadata"
/>
<!--Mobile for trash location--> <!--Mobile for trash location-->
<div v-if="$isThisLocation(['trash', 'trash-root']) && $checkPermission('master')" class="menu-options"> <div
v-if="
$isThisLocation(['trash', 'trash-root']) &&
$checkPermission('master')
"
class="menu-options"
>
<ul class="menu-option-group"> <ul class="menu-option-group">
<li class="menu-option" @click="$store.dispatch('restoreItem', fileInfoDetail)" v-if="fileInfoDetail"> <li
class="menu-option"
@click="$store.dispatch('restoreItem', fileInfoDetail)"
v-if="fileInfoDetail"
>
<div class="icon"> <div class="icon">
<life-buoy-icon size="17"></life-buoy-icon> <life-buoy-icon size="17"></life-buoy-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.restore') }} {{ $t("context_menu.restore") }}
</div> </div>
</li> </li>
<li class="menu-option delete" @click="deleteItem" v-if="fileInfoDetail"> <li
class="menu-option delete"
@click="deleteItem"
v-if="fileInfoDetail"
>
<div class="icon"> <div class="icon">
<trash-2-icon size="17"></trash-2-icon> <trash-2-icon size="17"></trash-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.delete') }} {{ $t("context_menu.delete") }}
</div> </div>
</li> </li>
</ul> </ul>
<ul class="menu-option-group" v-if="! isFolder"> <ul class="menu-option-group" v-if="!isFolder">
<li class="menu-option" @click="downloadItem"> <li class="menu-option" @click="downloadItem">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
<!--Mobile for Base location--> <!--Mobile for Base location-->
<div v-if="$isThisLocation(['shared']) && $checkPermission('master')" class="menu-options"> <div
v-if="$isThisLocation(['shared']) && $checkPermission('master')"
class="menu-options"
>
<ul class="menu-option-group"> <ul class="menu-option-group">
<li class="menu-option" @click="addToFavourites" v-if="fileInfoDetail && isFolder"> <li
class="menu-option"
@click="addToFavourites"
v-if="fileInfoDetail && isFolder"
>
<div class="icon"> <div class="icon">
<star-icon size="17"></star-icon> <star-icon size="17"></star-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ isInFavourites ? $t('context_menu.remove_from_favourites') : {{
$t('context_menu.add_to_favourites') }} isInFavourites
? $t("context_menu.remove_from_favourites")
: $t("context_menu.add_to_favourites")
}}
</div> </div>
</li> </li>
</ul> </ul>
@@ -67,7 +92,7 @@
<edit-2-icon size="17"></edit-2-icon> <edit-2-icon size="17"></edit-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.rename') }} {{ $t("context_menu.rename") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="shareItem" v-if="fileInfoDetail"> <li class="menu-option" @click="shareItem" v-if="fileInfoDetail">
@@ -75,41 +100,58 @@
<link-icon size="17"></link-icon> <link-icon size="17"></link-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ fileInfoDetail.shared ? $t('context_menu.share_edit') : $t('context_menu.share') }} {{
fileInfoDetail.shared
? $t("context_menu.share_edit")
: $t("context_menu.share")
}}
</div> </div>
</li> </li>
<li class="menu-option delete" @click="deleteItem" v-if="fileInfoDetail"> <li
class="menu-option delete"
@click="deleteItem"
v-if="fileInfoDetail"
>
<div class="icon"> <div class="icon">
<trash-2-icon size="17"></trash-2-icon> <trash-2-icon size="17"></trash-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.delete') }} {{ $t("context_menu.delete") }}
</div> </div>
</li> </li>
</ul> </ul>
<ul class="menu-option-group"> <ul class="menu-option-group">
<li class="menu-option" @click="downloadItem" v-if="! isFolder"> <li class="menu-option" @click="downloadItem" v-if="!isFolder">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
<!--Mobile for Base location--> <!--Mobile for Base location-->
<div v-if="$isThisLocation(['base', 'participant_uploads', 'latest']) && $checkPermission('master')" class="menu-options"> <div
v-if="
$isThisLocation(['base', 'participant_uploads', 'latest']) &&
$checkPermission('master')
"
class="menu-options"
>
<ul class="menu-option-group" v-if="fileInfoDetail && isFolder"> <ul class="menu-option-group" v-if="fileInfoDetail && isFolder">
<li class="menu-option" @click="addToFavourites"> <li class="menu-option" @click="addToFavourites">
<div class="icon"> <div class="icon">
<star-icon size="17"></star-icon> <star-icon size="17"></star-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ isInFavourites ? $t('context_menu.remove_from_favourites') : {{
$t('context_menu.add_to_favourites') }} isInFavourites
? $t("context_menu.remove_from_favourites")
: $t("context_menu.add_to_favourites")
}}
</div> </div>
</li> </li>
</ul> </ul>
@@ -120,7 +162,7 @@
<edit-2-icon size="17"></edit-2-icon> <edit-2-icon size="17"></edit-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.rename') }} {{ $t("context_menu.rename") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="moveItem" v-if="fileInfoDetail"> <li class="menu-option" @click="moveItem" v-if="fileInfoDetail">
@@ -128,7 +170,7 @@
<corner-down-right-icon size="17"></corner-down-right-icon> <corner-down-right-icon size="17"></corner-down-right-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.move') }} {{ $t("context_menu.move") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="shareItem" v-if="fileInfoDetail"> <li class="menu-option" @click="shareItem" v-if="fileInfoDetail">
@@ -136,41 +178,53 @@
<link-icon size="17"></link-icon> <link-icon size="17"></link-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ fileInfoDetail.shared ? $t('context_menu.share_edit') : $t('context_menu.share') }} {{
fileInfoDetail.shared
? $t("context_menu.share_edit")
: $t("context_menu.share")
}}
</div> </div>
</li> </li>
<li class="menu-option delete" @click="deleteItem" v-if="fileInfoDetail"> <li
class="menu-option delete"
@click="deleteItem"
v-if="fileInfoDetail"
>
<div class="icon"> <div class="icon">
<trash-2-icon size="17"></trash-2-icon> <trash-2-icon size="17"></trash-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.delete') }} {{ $t("context_menu.delete") }}
</div> </div>
</li> </li>
</ul> </ul>
<ul class="menu-option-group"> <ul class="menu-option-group">
<li class="menu-option" @click="downloadItem" v-if="! isFolder"> <li class="menu-option" @click="downloadItem" v-if="!isFolder">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
<!--Mobile for Base location with EDITOR permission--> <!--Mobile for Base location with EDITOR permission-->
<div v-if="$isThisLocation(['base', 'public']) && $checkPermission('editor')" class="menu-options"> <div
v-if="
$isThisLocation(['base', 'public']) && $checkPermission('editor')
"
class="menu-options"
>
<ul class="menu-option-group"> <ul class="menu-option-group">
<li class="menu-option" @click="renameItem" v-if="fileInfoDetail"> <li class="menu-option" @click="renameItem" v-if="fileInfoDetail">
<div class="icon"> <div class="icon">
<edit-2-icon size="17"></edit-2-icon> <edit-2-icon size="17"></edit-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.rename') }} {{ $t("context_menu.rename") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="moveItem" v-if="fileInfoDetail"> <li class="menu-option" @click="moveItem" v-if="fileInfoDetail">
@@ -178,7 +232,7 @@
<corner-down-right-icon size="17"></corner-down-right-icon> <corner-down-right-icon size="17"></corner-down-right-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.move') }} {{ $t("context_menu.move") }}
</div> </div>
</li> </li>
<li class="menu-option" @click="deleteItem"> <li class="menu-option" @click="deleteItem">
@@ -186,32 +240,37 @@
<trash-2-icon size="17"></trash-2-icon> <trash-2-icon size="17"></trash-2-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.delete') }} {{ $t("context_menu.delete") }}
</div> </div>
</li> </li>
</ul> </ul>
<ul class="menu-option-group"> <ul class="menu-option-group">
<li class="menu-option" @click="downloadItem" v-if="! isFolder"> <li class="menu-option" @click="downloadItem" v-if="!isFolder">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>
<!--Mobile for Base location with VISITOR permission--> <!--Mobile for Base location with VISITOR permission-->
<div v-if="$isThisLocation(['base', 'public']) && $checkPermission('visitor')" class="menu-options"> <div
v-if="
$isThisLocation(['base', 'public']) && $checkPermission('visitor')
"
class="menu-options"
>
<ul class="menu-option-group"> <ul class="menu-option-group">
<li class="menu-option" @click="downloadItem" v-if="! isFolder"> <li class="menu-option" @click="downloadItem" v-if="!isFolder">
<div class="icon"> <div class="icon">
<download-cloud-icon size="17"></download-cloud-icon> <download-cloud-icon size="17"></download-cloud-icon>
</div> </div>
<div class="text-label"> <div class="text-label">
{{ $t('context_menu.download') }} {{ $t("context_menu.download") }}
</div> </div>
</li> </li>
</ul> </ul>
@@ -220,14 +279,18 @@
</div> </div>
</transition> </transition>
<transition name="fade"> <transition name="fade">
<div v-show="isVisible" class="vignette" @click="closeAndResetContextMenu"></div> <div
v-show="isVisible"
class="vignette"
@click="closeAndResetContextMenu"
></div>
</transition> </transition>
</div> </div>
</template> </template>
<script> <script>
import ThumbnailItem from '@/components/Others/ThumbnailItem' import ThumbnailItem from "@/components/Others/ThumbnailItem";
import { import {
CornerDownRightIcon, CornerDownRightIcon,
DownloadCloudIcon, DownloadCloudIcon,
FolderPlusIcon, FolderPlusIcon,
@@ -238,12 +301,12 @@
StarIcon, StarIcon,
LinkIcon, LinkIcon,
EyeIcon, EyeIcon,
} from 'vue-feather-icons' } from "vue-feather-icons";
import {events} from '@/bus' import { events } from "@/bus";
import {mapGetters} from 'vuex' import { mapGetters } from "vuex";
export default { export default {
name: 'MobileMenu', name: "MobileMenu",
components: { components: {
CornerDownRightIcon, CornerDownRightIcon,
DownloadCloudIcon, DownloadCloudIcon,
@@ -258,107 +321,137 @@
EyeIcon, EyeIcon,
}, },
computed: { computed: {
...mapGetters(['fileInfoDetail', 'user']), ...mapGetters(["fileInfoDetail", "user"]),
favourites() { favourites() {
return this.user.relationships.favourites.data.attributes.folders return this.user.relationships.favourites.data.attributes.folders;
}, },
isInFavourites() { isInFavourites() {
return this.favourites.find(el => el.unique_id == this.fileInfoDetail.unique_id) return this.favourites.find(
(el) => el.unique_id == this.fileInfoDetail.unique_id
);
}, },
isFile() { isFile() {
return (this.fileInfoDetail && this.fileInfoDetail.type !== 'folder') && (this.fileInfoDetail && this.fileInfoDetail.type !== 'image') return (
this.fileInfoDetail &&
this.fileInfoDetail.type !== "folder" &&
this.fileInfoDetail &&
this.fileInfoDetail.type !== "image"
);
}, },
isImage() { isImage() {
return this.fileInfoDetail && this.fileInfoDetail.type === 'image' return this.fileInfoDetail && this.fileInfoDetail.type === "image";
}, },
isFolder() { isFolder() {
return this.fileInfoDetail && this.fileInfoDetail.type === 'folder' return this.fileInfoDetail && this.fileInfoDetail.type === "folder";
} },
}, },
data() { data() {
return { return {
isVisible: false isVisible: false,
} showFromMediaPreview: false,
};
}, },
methods: { methods: {
moveItem() { moveItem() {
// Open move item popup // Open move item popup
events.$emit('popup:open', {name: 'move', item: this.fileInfoDetail}) events.$emit("popup:open", { name: "move", item: this.fileInfoDetail });
}, },
shareItem() { shareItem() {
if (this.fileInfoDetail.shared) { if (this.fileInfoDetail.shared) {
// Open share item popup // Open share item popup
events.$emit('popup:open', {name: 'share-edit', item: this.fileInfoDetail}) events.$emit("popup:open", {
name: "share-edit",
item: this.fileInfoDetail,
});
} else { } else {
// Open share item popup // Open share item popup
events.$emit('popup:open', {name: 'share-create', item: this.fileInfoDetail}) events.$emit("popup:open", {
name: "share-create",
item: this.fileInfoDetail,
});
} }
}, },
addToFavourites() { addToFavourites() {
if (this.favourites && !this.favourites.find(el => el.unique_id == this.fileInfoDetail.unique_id)) { if (
this.$store.dispatch('addToFavourites', this.fileInfoDetail) this.favourites &&
!this.favourites.find(
(el) => el.unique_id == this.fileInfoDetail.unique_id
)
) {
this.$store.dispatch("addToFavourites", this.fileInfoDetail);
} else { } else {
this.$store.dispatch('removeFromFavourites', this.fileInfoDetail) this.$store.dispatch("removeFromFavourites", this.fileInfoDetail);
} }
}, },
downloadItem() { downloadItem() {
this.$downloadFile( this.$downloadFile(
this.fileInfoDetail.file_url, this.fileInfoDetail.file_url,
this.fileInfoDetail.name + '.' + this.fileInfoDetail.mimetype this.fileInfoDetail.name + "." + this.fileInfoDetail.mimetype
) );
}, },
deleteItem() { deleteItem() {
this.$store.dispatch('deleteItem', this.fileInfoDetail) this.$store.dispatch("deleteItem", this.fileInfoDetail);
}, },
renameItem() { renameItem() {
let itemName = prompt( let itemName = prompt(
this.$t('popup_rename.title'), this.$t("popup_rename.title"),
this.fileInfoDetail.name this.fileInfoDetail.name
) );
if (itemName && itemName !== '') {
if (itemName && itemName !== "") {
let item = { let item = {
unique_id: this.fileInfoDetail.unique_id, unique_id: this.fileInfoDetail.unique_id,
type: this.fileInfoDetail.type, type: this.fileInfoDetail.type,
name: itemName name: itemName,
} };
this.$store.dispatch('renameItem', item) this.$store.dispatch("renameItem", item);
// Change item name if is mobile device or prompted // Change item name if is mobile device or prompted
if (this.$isMobile()) { if (this.$isMobile()) {
events.$emit('change:name', item) events.$emit("change:name", item);
} }
} }
}, },
closeAndResetContextMenu() { closeAndResetContextMenu() {
events.$emit('fileItem:deselect') //If emit to show menu coming from MediaFullPreview dont reset data
if (this.showFromMediaPreview) {
this.isVisible = false;
this.showFromMediaPreview = false;
} else {
this.isVisible = false;
events.$emit("fileItem:deselect");
}
// Close context menu // Close context menu
this.isVisible = false // this.isVisible = false;
} },
}, },
created() { created() {
// Show context menu // Show context menu
events.$on('mobileMenu:show', () => { events.$on("mobileMenu:show", (showFromMedia) => {
this.isVisible = !this.isVisible //If emit come from MediaFullPreview
}) if (showFromMedia) {
this.isVisible = true;
this.showFromMediaPreview = true;
} else {
this.isVisible = !this.isVisible;
}
});
// Hide mobile menu // Hide mobile menu
events.$on('mobileMenu:hide', () => { events.$on("mobileMenu:hide", () => {
this.isVisible = false this.isVisible = false;
}) });
} },
} };
</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";
.menu-option { .menu-option {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -370,9 +463,9 @@
.text-label { .text-label {
@include font-size(16); @include font-size(16);
} }
} }
.vignette { .vignette {
background: rgba(0, 0, 0, 0.35); background: rgba(0, 0, 0, 0.35);
position: absolute; position: absolute;
top: 0; top: 0;
@@ -382,9 +475,9 @@
z-index: 9; z-index: 9;
cursor: pointer; cursor: pointer;
opacity: 1; opacity: 1;
} }
.options { .options {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 0; left: 0;
@@ -437,10 +530,9 @@
} }
} }
} }
} }
@media (prefers-color-scheme: dark) {
@media (prefers-color-scheme: dark) {
.vignette { .vignette {
background: $dark_mode_vignette; background: $dark_mode_vignette;
} }
@@ -460,31 +552,31 @@
} }
} }
} }
} }
// Transition // Transition
.context-menu-enter-active, .context-menu-enter-active,
.fade-enter-active { .fade-enter-active {
transition: all 200ms; transition: all 200ms;
} }
.context-menu-leave-active, .context-menu-leave-active,
.fade-leave-active { .fade-leave-active {
transition: all 200ms; transition: all 200ms;
} }
.fade-enter, .fade-enter,
.fade-leave-to { .fade-leave-to {
opacity: 0; opacity: 0;
} }
.context-menu-enter, .context-menu-enter,
.context-menu-leave-to { .context-menu-leave-to {
opacity: 0; opacity: 0;
transform: translateY(100%); transform: translateY(100%);
} }
.context-menu-leave-active { .context-menu-leave-active {
position: absolute; position: absolute;
} }
</style> </style>
@@ -1,7 +1,19 @@
<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'"
size="19"
></corner-down-right-icon>
<download-cloud-icon
v-if="source === 'download'"
size="19"
></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> <trash-2-icon v-if="source === 'trash'" size="19"></trash-2-icon>
<list-icon v-if="source === 'th-list'" size="19"></list-icon> <list-icon v-if="source === 'th-list'" size="19"></list-icon>
<info-icon v-if="source === 'info'" size="19"></info-icon> <info-icon v-if="source === 'info'" size="19"></info-icon>
@@ -11,28 +23,42 @@
</template> </template>
<script> <script>
import {FolderPlusIcon, Trash2Icon, GridIcon, ListIcon, InfoIcon, CornerDownRightIcon, LinkIcon} from 'vue-feather-icons' import {
export default {
name: 'ToolbarButton',
props: ['source', 'action'],
components: {
CornerDownRightIcon,
FolderPlusIcon, FolderPlusIcon,
Trash2Icon, Trash2Icon,
GridIcon,
ListIcon,
Edit2Icon,
InfoIcon,
CornerDownRightIcon,
LinkIcon,
DownloadCloudIcon,
PrinterIcon,
} from "vue-feather-icons";
export default {
name: "ToolbarButton",
props: ["source", "action"],
components: {
CornerDownRightIcon,
DownloadCloudIcon,
FolderPlusIcon,
PrinterIcon,
Trash2Icon,
Edit2Icon,
ListIcon, ListIcon,
GridIcon, GridIcon,
InfoIcon, InfoIcon,
LinkIcon, 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;
@@ -51,15 +77,18 @@
&:hover { &:hover {
background: $light_background; background: $light_background;
path, line, polyline, rect, circle { path,
line,
polyline,
rect,
circle {
@include transition(150ms); @include transition(150ms);
stroke: $theme; stroke: $theme;
} }
} }
} }
@media (prefers-color-scheme: dark) {
@media (prefers-color-scheme: dark) {
.button { .button {
background: transparent; background: transparent;
@@ -67,9 +96,13 @@
background: $dark_mode_foreground; background: $dark_mode_foreground;
} }
path, line, polyline, rect, circle { path,
line,
polyline,
rect,
circle {
stroke: $dark_mode_text_primary; stroke: $dark_mode_text_primary;
} }
} }
} }
</style> </style>
+172 -164
View File
@@ -1,104 +1,104 @@
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 })
if (value === '') return .catch((error) => {
events.$emit("alert:open", {
axios.patch(this.$store.getters.api + route, {name, value}) title: this.$t("popup_error.title"),
.catch(error => { message: this.$t("popup_error.message"),
events.$emit('alert:open', { });
title: this.$t('popup_error.title'), });
message: this.$t('popup_error.message'), }, 150);
})
})
}, 150)
Vue.prototype.$updateImage = function (route, name, image) {
Vue.prototype.$updateImage = function(route, name, image) {
// Create form // Create form
let formData = new FormData() let formData = new FormData();
// Add image to form // Add image to form
formData.append('name', name) formData.append("name", name);
formData.append(name, image) formData.append(name, image);
formData.append('_method', 'PATCH') formData.append("_method", "PATCH");
axios.post(this.$store.getters.api + route, formData, { axios
.post(this.$store.getters.api + route, formData, {
headers: { headers: {
'Content-Type': 'multipart/form-data', "Content-Type": "multipart/form-data",
} },
}) })
.catch(error => { .catch((error) => {
events.$emit('alert:open', { events.$emit("alert:open", {
title: this.$t('popup_error.title'), title: this.$t("popup_error.title"),
message: this.$t('popup_error.message'), message: this.$t("popup_error.message"),
}) });
}) });
} };
Vue.prototype.$scrollTop = function () { Vue.prototype.$scrollTop = function() {
var container = document.getElementById('vue-file-manager') var container = document.getElementById("vue-file-manager");
if (container) { if (container) {
container.scrollTop = 0 container.scrollTop = 0;
}
} }
};
Vue.prototype.$getImage = function (source) { Vue.prototype.$getImage = function(source) {
return source ? '/' + source : '' return source ? "/" + source : "";
} };
Vue.prototype.$getCreditCardBrand = function (brand) { Vue.prototype.$getCreditCardBrand = function(brand) {
return `/assets/icons/${brand}.svg` return `/assets/icons/${brand}.svg`;
} };
Vue.prototype.$getInvoiceLink = function (customer, id) { Vue.prototype.$getInvoiceLink = function(customer, id) {
return '/invoice/' + customer + '/' + id return "/invoice/" + customer + "/" + id;
} };
Vue.prototype.$openImageOnNewTab = function (source) { Vue.prototype.$openImageOnNewTab = function(source) {
let win = window.open(source, '_blank') let win = window.open(source, "_blank");
win.focus() win.focus();
} };
Vue.prototype.$createFolder = function (folderName) { Vue.prototype.$createFolder = function(folderName) {
this.$store.dispatch('createFolder', folderName) this.$store.dispatch("createFolder", folderName);
} };
Vue.prototype.$handleUploading = async function (files, parent_id) { Vue.prototype.$handleUploading = async function(files, parent_id) {
let fileBuffer = [];
let fileBuffer = []
// Append the file list to fileBuffer array // Append the file list to fileBuffer array
Array.prototype.push.apply(fileBuffer, files); Array.prototype.push.apply(fileBuffer, files);
let fileSucceed = 0 let fileSucceed = 0;
// Update files count in progressbar // Update files count in progressbar
store.commit('UPDATE_FILE_COUNT_PROGRESS', { store.commit("UPDATE_FILE_COUNT_PROGRESS", {
current: fileSucceed, current: fileSucceed,
total: files.length total: files.length,
}) });
// Reset upload progress to 0 // Reset upload progress to 0
store.commit('UPLOADING_FILE_PROGRESS', 0) store.commit("UPLOADING_FILE_PROGRESS", 0);
// Get parent id // Get parent id
let parentFolder = this.$store.getters.currentFolder ? this.$store.getters.currentFolder.unique_id : 0 let parentFolder = this.$store.getters.currentFolder
let rootFolder = parent_id ? parent_id : parentFolder ? this.$store.getters.currentFolder.unique_id
: 0;
let rootFolder = parent_id ? parent_id : parentFolder;
// Upload files // Upload files
do { do {
let file = fileBuffer.shift(), let file = fileBuffer.shift(),
chunks = [] chunks = [];
// Calculate ceils // Calculate ceils
let size = this.$store.getters.config.chunkSize, let size = this.$store.getters.config.chunkSize,
@@ -106,130 +106,139 @@ const Helpers = {
// Create chunks // Create chunks
for (let i = 0; i < chunksCeil; i++) { for (let i = 0; i < chunksCeil; i++) {
chunks.push(file.slice( chunks.push(
i * size, Math.min(i * size + size, file.size), file.type file.slice(
)); i * size,
Math.min(i * size + size, file.size),
file.type
)
);
} }
// Set Data // Set Data
let formData = new FormData(), let formData = new FormData(),
uploadedSize = 0, uploadedSize = 0,
isNotGeneralError = true, isNotGeneralError = true,
filename = Array(16).fill(0).map(x => Math.random().toString(36).charAt(2)).join('') + '-' + file.name + '.part' filename =
Array(16)
.fill(0)
.map((x) =>
Math.random()
.toString(36)
.charAt(2)
)
.join("") +
"-" +
file.name +
".part";
do { do {
let isLast = chunks.length === 1, let isLast = chunks.length === 1,
chunk = chunks.shift(), chunk = chunks.shift(),
attempts = 0 attempts = 0;
// Set form data // Set form data
formData.set('file', chunk, filename); formData.set("file", chunk, filename);
formData.set('parent_id', rootFolder) formData.set("parent_id", rootFolder);
formData.set('is_last', isLast); formData.set("is_last", isLast);
// Upload chunks // Upload chunks
do { do {
await store.dispatch('uploadFiles', { await store
.dispatch("uploadFiles", {
form: formData, form: formData,
fileSize: file.size, fileSize: file.size,
totalUploadedSize: uploadedSize totalUploadedSize: uploadedSize,
}).then(() => { })
uploadedSize = uploadedSize + chunk.size .then(() => {
}).catch((error) => { uploadedSize = uploadedSize + chunk.size;
})
.catch((error) => {
// Count attempts // Count attempts
attempts++ attempts++;
// Break uploading proccess // Break uploading proccess
if (error.response.status === 500) if (error.response.status === 500) isNotGeneralError = false;
isNotGeneralError = false
// Show Error // Show Error
if (attempts === 3) if (attempts === 3) this.$isSomethingWrong();
this.$isSomethingWrong() });
}) } while (isNotGeneralError && attempts !== 0 && attempts !== 3);
} while (isNotGeneralError && attempts !== 0 && attempts !== 3) } while (isNotGeneralError && chunks.length !== 0);
} while (isNotGeneralError && chunks.length !== 0) fileSucceed++;
fileSucceed++
// Progress file log // Progress file log
store.commit('UPDATE_FILE_COUNT_PROGRESS', { store.commit("UPDATE_FILE_COUNT_PROGRESS", {
current: fileSucceed, current: fileSucceed,
total: files.length total: files.length,
}) });
} while (fileBuffer.length !== 0);
} while (fileBuffer.length !== 0) store.commit("UPDATE_FILE_COUNT_PROGRESS", undefined);
};
store.commit('UPDATE_FILE_COUNT_PROGRESS', undefined) Vue.prototype.$uploadFiles = async function(files) {
} this.$handleUploading(files, undefined);
};
Vue.prototype.$uploadFiles = async function (files) {
this.$handleUploading(files, undefined)
}
Vue.prototype.$uploadExternalFiles = async function (event, parent_id) {
Vue.prototype.$uploadExternalFiles = async function(event, parent_id) {
// Prevent submit empty files // Prevent submit empty files
if (event.dataTransfer.items.length == 0) return if (event.dataTransfer.items.length == 0) return;
// Get files // Get files
let files = [...event.dataTransfer.items].map(item => item.getAsFile()); let files = [...event.dataTransfer.items].map((item) => item.getAsFile());
this.$handleUploading(files, parent_id) this.$handleUploading(files, parent_id);
} };
Vue.prototype.$downloadFile = function (url, filename) { Vue.prototype.$downloadFile = function(url, filename) {
var anchor = document.createElement('a') var anchor = document.createElement("a");
anchor.href = url anchor.href = url;
anchor.download = filename anchor.download = filename;
document.body.appendChild(anchor) document.body.appendChild(anchor);
anchor.click() anchor.click();
} };
Vue.prototype.$closePopup = function () { Vue.prototype.$closePopup = function() {
events.$emit('popup:close') events.$emit("popup:close");
} };
Vue.prototype.$isThisRoute = function (route, locations) { Vue.prototype.$isThisRoute = function(route, locations) {
return includes(locations, route.name);
return includes(locations, route.name) };
}
Vue.prototype.$isThisLocation = function (location) {
Vue.prototype.$isThisLocation = function(location) {
// Get current location // Get current location
let currentLocation = store.getters.currentFolder && store.getters.currentFolder.location ? store.getters.currentFolder.location : undefined let currentLocation =
store.getters.currentFolder && store.getters.currentFolder.location
? store.getters.currentFolder.location
: undefined;
// Check if type is object // Check if type is object
if (typeof location === 'Object' || location instanceof Object) { if (typeof location === "Object" || location instanceof Object) {
return includes(location, currentLocation) return includes(location, currentLocation);
} else { } else {
return currentLocation === location return currentLocation === location;
}
} }
};
Vue.prototype.$checkPermission = function (type) { Vue.prototype.$checkPermission = function(type) {
let currentPermission = store.getters.permission;
let currentPermission = store.getters.permission
// Check if type is object // Check if type is object
if (typeof type === 'Object' || type instanceof Object) { if (typeof type === "Object" || type instanceof Object) {
return includes(type, currentPermission) return includes(type, currentPermission);
} else { } else {
return currentPermission === type return currentPermission === type;
}
} }
};
Vue.prototype.$isMobile = function () { Vue.prototype.$isMobile = function() {
const toMatch = [ const toMatch = [
/Android/i, /Android/i,
/webOS/i, /webOS/i,
@@ -237,40 +246,39 @@ const Helpers = {
/iPad/i, /iPad/i,
/iPod/i, /iPod/i,
/BlackBerry/i, /BlackBerry/i,
/Windows Phone/i /Windows Phone/i,
] ];
return toMatch.some(toMatchItem => { return toMatch.some((toMatchItem) => {
return navigator.userAgent.match(toMatchItem) return navigator.userAgent.match(toMatchItem);
}) });
} };
Vue.prototype.$isMinimalScale = function () { Vue.prototype.$isMinimalScale = function() {
let sizeType = store.getters.filesViewWidth let sizeType = store.getters.filesViewWidth;
return sizeType === 'minimal-scale' return sizeType === "minimal-scale";
} };
Vue.prototype.$isCompactScale = function () { Vue.prototype.$isCompactScale = function() {
let sizeType = store.getters.filesViewWidth let sizeType = store.getters.filesViewWidth;
return sizeType === 'compact-scale' return sizeType === "compact-scale";
} };
Vue.prototype.$isFullScale = function () { Vue.prototype.$isFullScale = function() {
let sizeType = store.getters.filesViewWidth let sizeType = store.getters.filesViewWidth;
return sizeType === 'full-scale' return sizeType === "full-scale";
} };
Vue.prototype.$isSomethingWrong = function () { Vue.prototype.$isSomethingWrong = function() {
events.$emit("alert:open", {
title: this.$t("popup_error.title"),
message: this.$t("popup_error.message"),
});
};
},
};
events.$emit('alert:open', { export default Helpers;
title: this.$t('popup_error.title'),
message: this.$t('popup_error.message'),
})
}
}
}
export default Helpers
+3 -1
View File
@@ -5,7 +5,9 @@
"move": "Move item", "move": "Move item",
"preview": "Change preview", "preview": "Change preview",
"share": "Share item", "share": "Share item",
"upload": "Upload file" "upload": "Upload file",
"download": "Download item",
"print": "Print item"
}, },
"activation": { "activation": {
"stripe": { "stripe": {
+3 -1
View File
@@ -5,7 +5,9 @@
"move": "Presunúť položku", "move": "Presunúť položku",
"preview": "Zmeniť náhľad", "preview": "Zmeniť náhľad",
"share": "Zdieľať položku", "share": "Zdieľať položku",
"upload": "Nahrať súbory" "upload": "Nahrať súbory",
"download": "Stiahnuť položku",
"print": "Vytlačiť položku"
}, },
"activation": { "activation": {
"stripe": { "stripe": {
+19 -20
View File
@@ -1,13 +1,13 @@
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,
@@ -43,7 +43,7 @@ import {
faHdd, faHdd,
faEllipsisH, faEllipsisH,
faPencilAlt, faPencilAlt,
} from '@fortawesome/free-solid-svg-icons' } from "@fortawesome/free-solid-svg-icons";
library.add( library.add(
faLock, faLock,
@@ -79,14 +79,14 @@ library.add(
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,
@@ -95,6 +95,5 @@ var vueFileManager = new Vue({
data: { data: {
config, config,
}, },
render: h => h(App) render: (h) => h(App),
}).$mount('#app') }).$mount("#app");