fix files page

This commit is contained in:
Diyar Akhgar 2025-06-03 03:00:46 +03:30
parent 0b8b868a08
commit f851bd5794
5 changed files with 926 additions and 465 deletions

View File

@ -12,15 +12,18 @@
"@heroicons/vue": "^2.2.0",
"@videojs-player/vue": "^1.0.0",
"@videojs/themes": "^1.0.1",
"aframe": "^1.7.1",
"axios": "^1.8.4",
"core-js": "^3.8.3",
"date-fns": "^4.1.0",
"moment-jalaali": "^0.10.4",
"plyr": "^3.7.8",
"swiper": "^11.2.8",
"video.js": "^7.21.7",
"vue": "^3.2.13",
"vue-pdf-embed": "^2.1.2",
"vue-persian-datetime-picker": "^2.10.4",
"vue-plyr": "^7.0.0",
"vue-router": "^4.5.0",
"vue-video-player": "^6.0.0",
"vue3-persian-datetime-picker": "^1.2.2",
@ -3732,6 +3735,15 @@
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@sindresorhus/is": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/@soda/friendly-errors-webpack-plugin": {
"version": "1.8.1",
"resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz",
@ -3758,6 +3770,18 @@
"dev": true,
"license": "MIT"
},
"node_modules/@szmarczak/http-timer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
"license": "MIT",
"dependencies": {
"defer-to-connect": "^1.0.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/@trysound/sax": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz",
@ -5129,6 +5153,56 @@
"pkcs7": "^1.0.4"
}
},
"node_modules/aframe": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/aframe/-/aframe-1.7.1.tgz",
"integrity": "sha512-dcc7PWI5z8pyJ0s2W0mUd8d83339frgMXhUvWr1yxkdgg6zSExkuQwsSJjiNn7XWKMUUqKYDvV/WzQQRA+OBXA==",
"license": "MIT",
"dependencies": {
"buffer": "^6.0.3",
"debug": "^4.3.4",
"deep-assign": "^2.0.0",
"load-bmfont": "^1.2.3",
"super-animejs": "^3.1.0",
"three": "npm:super-three@0.173.5",
"three-bmfont-text": "github:dmarcos/three-bmfont-text#eed4878795be9b3e38cf6aec6b903f56acd1f695"
},
"engines": {
"node": ">= 4.6.0",
"npm": ">= 2.15.9"
}
},
"node_modules/aframe/node_modules/buffer": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
}
},
"node_modules/aframe/node_modules/three": {
"name": "super-three",
"version": "0.173.5",
"resolved": "https://registry.npmjs.org/super-three/-/super-three-0.173.5.tgz",
"integrity": "sha512-ecjojbhUg/5QrixwqF4s6gvtJap9XQz7TcnFUX/J8Yosgb2eE2ZUqsyqr/JczFG//6hwIaZPeAa9M5DNaM1dmQ==",
"license": "MIT"
},
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
@ -5198,6 +5272,12 @@
"ajv": "^6.9.1"
}
},
"node_modules/an-array": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/an-array/-/an-array-1.0.0.tgz",
"integrity": "sha512-M175GYI7RmsYu24Ok383yZQa3eveDfNnmhTe3OQ3bm70bEovz2gWenH+ST/n32M8lrwLWk74hcPds5CDRPe2wg==",
"license": "MIT"
},
"node_modules/ansi-colors": {
"version": "4.1.3",
"resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz",
@ -5316,6 +5396,15 @@
"dev": true,
"license": "MIT"
},
"node_modules/array-shuffle": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-shuffle/-/array-shuffle-1.0.1.tgz",
"integrity": "sha512-PBqgo1Y2XWSksBzq3GFPEb798ZrW2snAcmr4drbVeF/6MT/5aBlkGJEvu5A/CzXHf4EjbHOj/ZowatjlIiVidA==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz",
@ -5326,6 +5415,12 @@
"node": ">=8"
}
},
"node_modules/as-number": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/as-number/-/as-number-1.0.0.tgz",
"integrity": "sha512-HkI/zLo2AbSRO4fqVkmyf3hms0bJDs3iboHqTrNuwTiCRvdYXM7HFhfhB6Dk51anV2LM/IMB83mtK9mHw4FlAg==",
"license": "MIT"
},
"node_modules/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz",
@ -5505,7 +5600,6 @@
"version": "1.5.1",
"resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"funding": [
{
"type": "github",
@ -5711,6 +5805,15 @@
"ieee754": "^1.1.13"
}
},
"node_modules/buffer-equal": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
"integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
@ -5728,6 +5831,72 @@
"node": ">= 0.8"
}
},
"node_modules/cacheable-request": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
"license": "MIT",
"dependencies": {
"clone-response": "^1.0.2",
"get-stream": "^5.1.0",
"http-cache-semantics": "^4.0.0",
"keyv": "^3.0.0",
"lowercase-keys": "^2.0.0",
"normalize-url": "^4.1.0",
"responselike": "^1.0.2"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cacheable-request/node_modules/get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cacheable-request/node_modules/json-buffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
"integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==",
"license": "MIT"
},
"node_modules/cacheable-request/node_modules/keyv": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
"license": "MIT",
"dependencies": {
"json-buffer": "3.0.0"
}
},
"node_modules/cacheable-request/node_modules/lowercase-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/cacheable-request/node_modules/normalize-url": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
"integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/call-bind": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz",
@ -5852,6 +6021,15 @@
"node": ">=4"
}
},
"node_modules/centra": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz",
"integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6"
}
},
"node_modules/chalk": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz",
@ -6051,6 +6229,18 @@
"node": ">=6"
}
},
"node_modules/clone-response": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
"integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
"license": "MIT",
"dependencies": {
"mimic-response": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@ -6848,6 +7038,12 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT"
},
"node_modules/custom-event-polyfill": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz",
"integrity": "sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==",
"license": "MIT"
},
"node_modules/date-fns": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
@ -6869,7 +7065,6 @@
"version": "4.4.0",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
@ -6883,6 +7078,30 @@
}
}
},
"node_modules/decompress-response": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
"integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
"license": "MIT",
"dependencies": {
"mimic-response": "^1.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/deep-assign": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-2.0.0.tgz",
"integrity": "sha512-2QhG3Kxulu4XIF3WL5C5x0sc/S17JLgm1SfvDfIRsR/5m7ZGmcejII7fZ2RyWhN0UWIJm0TNM/eKow6LAn3evQ==",
"license": "MIT",
"dependencies": {
"is-obj": "^1.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
@ -7053,6 +7272,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/defer-to-connect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
"license": "MIT"
},
"node_modules/define-data-property": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
@ -7301,6 +7526,15 @@
"dev": true,
"license": "BSD-2-Clause"
},
"node_modules/dtype": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz",
"integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==",
"license": "MIT",
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
@ -7322,6 +7556,12 @@
"dev": true,
"license": "MIT"
},
"node_modules/duplexer3": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
"integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==",
"license": "BSD-3-Clause"
},
"node_modules/easy-stack": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz",
@ -7377,7 +7617,6 @@
"version": "1.4.4",
"resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"once": "^1.4.0"
@ -8640,7 +8879,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"license": "MIT",
"dependencies": {
"pump": "^3.0.0"
@ -8743,6 +8981,28 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/got": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
"license": "MIT",
"dependencies": {
"@sindresorhus/is": "^0.14.0",
"@szmarczak/http-timer": "^1.1.2",
"cacheable-request": "^6.0.0",
"decompress-response": "^3.3.0",
"duplexer3": "^0.1.4",
"get-stream": "^4.1.0",
"lowercase-keys": "^1.0.1",
"mimic-response": "^1.0.1",
"p-cancelable": "^1.0.0",
"to-readable-stream": "^1.0.0",
"url-parse-lax": "^3.0.0"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
@ -9034,6 +9294,12 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/http-cache-semantics": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
"license": "BSD-2-Clause"
},
"node_modules/http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz",
@ -9145,7 +9411,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true,
"funding": [
{
"type": "github",
@ -9264,6 +9529,12 @@
"node": ">=8"
}
},
"node_modules/is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"license": "MIT"
},
"node_modules/is-ci": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/is-ci/-/is-ci-1.2.1.tgz",
@ -9378,6 +9649,15 @@
"node": ">=0.12.0"
}
},
"node_modules/is-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-plain-obj": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
@ -9700,6 +9980,17 @@
"launch-editor": "^2.10.0"
}
},
"node_modules/layout-bmfont-text": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/layout-bmfont-text/-/layout-bmfont-text-1.3.4.tgz",
"integrity": "sha512-mceomHZ8W7pSKQhTdLvOe1Im4n37u8xa5Gr0J3KPCHRMO/9o7+goWIOzZcUUd+Xgzy3+22bvoIQ0OaN3LRtgaw==",
"license": "MIT",
"dependencies": {
"as-number": "^1.0.0",
"word-wrapper": "^1.0.7",
"xtend": "^4.0.0"
}
},
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
@ -9771,6 +10062,22 @@
"@types/trusted-types": "^2.0.2"
}
},
"node_modules/load-bmfont": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.2.tgz",
"integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==",
"license": "MIT",
"dependencies": {
"buffer-equal": "0.0.1",
"mime": "^1.3.4",
"parse-bmfont-ascii": "^1.0.3",
"parse-bmfont-binary": "^1.0.5",
"parse-bmfont-xml": "^1.1.4",
"phin": "^3.7.1",
"xhr": "^2.0.1",
"xtend": "^4.0.0"
}
},
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz",
@ -9809,6 +10116,12 @@
"json5": "lib/cli.js"
}
},
"node_modules/loadjs": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loadjs/-/loadjs-4.3.0.tgz",
"integrity": "sha512-vNX4ZZLJBeDEOBvdr2v/F+0aN5oMuPu7JTqrMwp+DtgK+AryOlpy6Xtm2/HpNr+azEa828oQjOtWsB6iDtSfSQ==",
"license": "MIT"
},
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
@ -10055,6 +10368,15 @@
"tslib": "^2.0.3"
}
},
"node_modules/lowercase-keys": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
@ -10101,6 +10423,24 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/map-limit": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz",
"integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==",
"license": "MIT",
"dependencies": {
"once": "~1.3.0"
}
},
"node_modules/map-limit/node_modules/once": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
"integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==",
"license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@ -10205,7 +10545,6 @@
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true,
"license": "MIT",
"bin": {
"mime": "cli.js"
@ -10245,6 +10584,15 @@
"node": ">=6"
}
},
"node_modules/mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/min-document": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
@ -10354,7 +10702,6 @@
"version": "1.2.8",
"resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@ -10448,7 +10795,6 @@
"version": "2.1.3",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true,
"license": "MIT"
},
"node_modules/multicast-dns": {
@ -10536,6 +10882,27 @@
"dev": true,
"license": "MIT"
},
"node_modules/new-array": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/new-array/-/new-array-1.0.0.tgz",
"integrity": "sha512-K5AyFYbuHZ4e/ti52y7k18q8UHsS78FlRd85w2Fmsd6AkuLipDihPflKC0p3PN5i8II7+uHxo+CtkLiJDfmS5A==",
"license": "MIT"
},
"node_modules/nice-color-palettes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/nice-color-palettes/-/nice-color-palettes-3.0.0.tgz",
"integrity": "sha512-lL4AjabAAFi313tjrtmgm/bxCRzp4l3vCshojfV/ij3IPdtnRqv6Chcw+SqJUhbe7g3o3BecaqCJYUNLswGBhQ==",
"license": "MIT",
"dependencies": {
"got": "^9.2.2",
"map-limit": "0.0.1",
"minimist": "^1.2.0",
"new-array": "^1.0.0"
},
"bin": {
"nice-color-palettes": "bin/index.js"
}
},
"node_modules/nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz",
@ -10878,6 +11245,15 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/p-cancelable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz",
@ -10965,6 +11341,34 @@
"node": ">=6"
}
},
"node_modules/parse-bmfont-ascii": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
"integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==",
"license": "MIT"
},
"node_modules/parse-bmfont-binary": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
"integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==",
"license": "MIT"
},
"node_modules/parse-bmfont-xml": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz",
"integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==",
"license": "MIT",
"dependencies": {
"xml-parse-from-string": "^1.0.0",
"xml2js": "^0.5.0"
}
},
"node_modules/parse-headers": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz",
"integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==",
"license": "MIT"
},
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
@ -11094,6 +11498,18 @@
"@napi-rs/canvas": "^0.1.65"
}
},
"node_modules/phin": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz",
"integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==",
"license": "MIT",
"dependencies": {
"centra": "^2.7.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
@ -11138,6 +11554,19 @@
"node": ">=8"
}
},
"node_modules/plyr": {
"version": "3.7.8",
"resolved": "https://registry.npmjs.org/plyr/-/plyr-3.7.8.tgz",
"integrity": "sha512-yG/EHDobwbB/uP+4Bm6eUpJ93f8xxHjjk2dYcD1Oqpe1EcuQl5tzzw9Oq+uVAzd2lkM11qZfydSiyIpiB8pgdA==",
"license": "MIT",
"dependencies": {
"core-js": "^3.26.1",
"custom-event-polyfill": "^1.0.7",
"loadjs": "^4.2.0",
"rangetouch": "^2.0.1",
"url-polyfill": "^1.1.12"
}
},
"node_modules/portfinder": {
"version": "1.0.35",
"resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.35.tgz",
@ -12759,11 +13188,19 @@
"node": ">= 0.8.0"
}
},
"node_modules/prepend-http": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
"integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/prettier": {
"version": "2.8.8",
"resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz",
"integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
"dev": true,
"license": "MIT",
"optional": true,
"bin": {
@ -12950,7 +13387,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz",
"integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
"dev": true,
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
@ -12983,6 +13419,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/quad-indices": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/quad-indices/-/quad-indices-2.0.1.tgz",
"integrity": "sha512-6jtmCsEbGAh5npThXrBaubbTjPcF0rMbn57XCJVI7LkW8PUT56V+uIrRCCWCn85PSgJC9v8Pm5tnJDwmOBewvA==",
"license": "MIT",
"dependencies": {
"an-array": "^1.0.0",
"dtype": "^2.0.0",
"is-buffer": "^1.0.2"
}
},
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
@ -13024,6 +13471,12 @@
"node": ">= 0.6"
}
},
"node_modules/rangetouch": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/rangetouch/-/rangetouch-2.0.1.tgz",
"integrity": "sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==",
"license": "MIT"
},
"node_modules/raw-body": {
"version": "2.5.2",
"resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz",
@ -13293,6 +13746,15 @@
"node": ">=4"
}
},
"node_modules/responselike": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
"integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==",
"license": "MIT",
"dependencies": {
"lowercase-keys": "^1.0.0"
}
},
"node_modules/restore-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz",
@ -13504,6 +13966,12 @@
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/sax": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
"integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
"license": "ISC"
},
"node_modules/schema-utils": {
"version": "2.7.1",
"resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz",
@ -14169,6 +14637,12 @@
"postcss": "^8.2.15"
}
},
"node_modules/super-animejs": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/super-animejs/-/super-animejs-3.1.0.tgz",
"integrity": "sha512-6MFAFJDRuvwkovxQZPruuyHinTa4rgj4hNLOndjcYYhZLckoXtVRY9rJPuq8p6c/tgZJrFYEAYAfJ2/hhNtUCA==",
"license": "MIT"
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
@ -14523,6 +14997,18 @@
"license": "MIT",
"peer": true
},
"node_modules/three-bmfont-text": {
"version": "3.0.0",
"resolved": "git+ssh://git@github.com/dmarcos/three-bmfont-text.git#eed4878795be9b3e38cf6aec6b903f56acd1f695",
"integrity": "sha512-1tv41kf1bo31dFvQeWyiAcurNg926wslmUQztsjbpIwEIJ7WqAQUOownrbHcAQVYlIdtcP4M+tXYaHzbUEF2GA==",
"license": "MIT",
"dependencies": {
"array-shuffle": "^1.0.1",
"layout-bmfont-text": "^1.2.0",
"nice-color-palettes": "^3.0.0",
"quad-indices": "^2.0.1"
}
},
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz",
@ -14530,6 +15016,15 @@
"dev": true,
"license": "MIT"
},
"node_modules/to-readable-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
"integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
@ -14726,6 +15221,24 @@
"punycode": "^2.1.0"
}
},
"node_modules/url-parse-lax": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
"integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==",
"license": "MIT",
"dependencies": {
"prepend-http": "^2.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/url-polyfill": {
"version": "1.1.13",
"resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.13.tgz",
"integrity": "sha512-tXzkojrv2SujumYthZ/WjF7jaSfNhSXlYMpE5AYdL2I3D7DCeo+mch8KtW2rUuKjDg+3VXODXHVgipt8yGY/eQ==",
"license": "MIT"
},
"node_modules/url-toolkit": {
"version": "2.2.5",
"resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz",
@ -15026,6 +15539,52 @@
"rimraf": "^3.0.2"
}
},
"node_modules/vue-plyr": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/vue-plyr/-/vue-plyr-7.0.0.tgz",
"integrity": "sha512-NvbO/ZzV1IxlBQQbQlon5Sk8hKuGAj3k4k0XVdi7gM4oSqu8mZMhJ3WM3FfAtNfV790jbLnb8P3dHYqaBqIv6g==",
"license": "MIT",
"dependencies": {
"plyr": "github:sampotts/plyr#develop",
"vue": "^2.6.12"
}
},
"node_modules/vue-plyr/node_modules/@vue/compiler-sfc": {
"version": "2.7.16",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
"integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
"dependencies": {
"@babel/parser": "^7.23.5",
"postcss": "^8.4.14",
"source-map": "^0.6.1"
},
"optionalDependencies": {
"prettier": "^1.18.2 || ^2.0.0"
}
},
"node_modules/vue-plyr/node_modules/plyr": {
"version": "3.7.0",
"resolved": "git+ssh://git@github.com/sampotts/plyr.git#d434c9af16e641400aaee93188594208d88f2658",
"license": "MIT",
"dependencies": {
"core-js": "^3.22.0",
"custom-event-polyfill": "^1.0.7",
"loadjs": "^4.2.0",
"rangetouch": "^2.0.1",
"url-polyfill": "^1.1.12"
}
},
"node_modules/vue-plyr/node_modules/vue": {
"version": "2.7.16",
"resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz",
"integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
"deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.",
"license": "MIT",
"dependencies": {
"@vue/compiler-sfc": "2.7.16",
"csstype": "^3.1.0"
}
},
"node_modules/vue-router": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz",
@ -15642,6 +16201,12 @@
"node": ">=0.10.0"
}
},
"node_modules/word-wrapper": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/word-wrapper/-/word-wrapper-1.0.7.tgz",
"integrity": "sha512-VOPBFCm9b6FyYKQYfn9AVn2dQvdR/YOVFV6IBRA1TBMJWKffvhEX1af6FMGrttILs2Q9ikCRhLqkbY2weW6dOQ==",
"license": "MIT"
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@ -15688,6 +16253,55 @@
}
}
},
"node_modules/xhr": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
"integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
"license": "MIT",
"dependencies": {
"global": "~4.4.0",
"is-function": "^1.0.1",
"parse-headers": "^2.0.0",
"xtend": "^4.0.0"
}
},
"node_modules/xml-parse-from-string": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
"integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==",
"license": "MIT"
},
"node_modules/xml2js": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
"integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
"license": "MIT",
"dependencies": {
"sax": ">=0.6.0",
"xmlbuilder": "~11.0.0"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/xmlbuilder": {
"version": "11.0.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"license": "MIT",
"engines": {
"node": ">=4.0"
}
},
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"license": "MIT",
"engines": {
"node": ">=0.4"
}
},
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",

View File

@ -12,15 +12,18 @@
"@heroicons/vue": "^2.2.0",
"@videojs-player/vue": "^1.0.0",
"@videojs/themes": "^1.0.1",
"aframe": "^1.7.1",
"axios": "^1.8.4",
"core-js": "^3.8.3",
"date-fns": "^4.1.0",
"moment-jalaali": "^0.10.4",
"plyr": "^3.7.8",
"swiper": "^11.2.8",
"video.js": "^7.21.7",
"vue": "^3.2.13",
"vue-pdf-embed": "^2.1.2",
"vue-persian-datetime-picker": "^2.10.4",
"vue-plyr": "^7.0.0",
"vue-router": "^4.5.0",
"vue-video-player": "^6.0.0",
"vue3-persian-datetime-picker": "^1.2.2",

View File

@ -45,7 +45,11 @@
<!-- Video Player -->
<div v-if="previewType === 'video'" class="video-preview-container">
<VideoPlayer :options="videoOptions" class="video-player" />
<vue-plyr :options="plyrOptions">
<video controls>
<source :src="previewUrl" type="video/mp4" />
</video>
</vue-plyr>
</div>
<!-- 3D Model Preview -->
@ -66,17 +70,15 @@
<button class="close-btn" @click="closePreviewDialog">بستن</button>
<button class="delete-btn" @click="deleteFile" v-if="previewIndex !== null">حذف</button>
<button class="download-btn" @click="downloadFile">دانلود</button>
</div>
</div>
</div>
</div>
</template>
<script>
import VuePdfEmbed from 'vue-pdf-embed';
import { VideoPlayer } from '@videojs-player/vue';
import 'video.js/dist/video-js.css';
import '@videojs/themes/dist/sea/index.css';
import VuePlyr from 'vue-plyr';
import 'vue-plyr/dist/vue-plyr.css';
import '@google/model-viewer';
import axios from 'axios';
@ -84,7 +86,7 @@ export default {
name: 'FilePreviewDialog',
components: {
VuePdfEmbed,
VideoPlayer,
VuePlyr,
},
props: {
isOpen: {
@ -107,12 +109,12 @@ export default {
type: String,
required: true,
},
videoOptions: {
plyrOptions: {
type: Object,
default: () => ({
controls: ['play-large', 'play', 'progress', 'current-time', 'mute', 'volume', 'settings', 'fullscreen'],
settings: ['quality', 'speed', 'loop'],
autoplay: false,
controls: true,
sources: [{ type: 'video/mp4', src: '' }],
}),
},
},
@ -176,7 +178,20 @@ export default {
};
</script>
<style scoped>
:deep(.plyr) {
width: 100%;
height: 100%;
--plyr-color-main: #3a57e8; /* رنگ اصلی کنترل‌ها */
--plyr-video-background: #000; /* پس‌زمینه ویدیو */
}
.video-preview-container {
border-radius: 12px;
}
.modal-overlay {
position: fixed;
inset: 0;
@ -278,10 +293,13 @@ export default {
}
.pdf-preview,
.video-player,
.model-preview {
width: 580px;
height: 300px;
}
.video-player {
width: 100%;
height: 100%;
}
.modal-actions {

View File

@ -36,19 +36,6 @@
</div>
<div class="form-content">
<form @submit.prevent="uploadFile" autocomplete="off">
<div class="file-type-selector" style="text-align: start; margin: 1rem 0 3rem 0; display: flex; align-items: center; justify-content: space-between;">
<label for="fileType" style="margin-left: 10px;">نوع فایل :</label>
<select
id="fileType"
:value="currentUploadType"
@change="updateFileAccept($event)"
required
>
<option v-for="type in fileTypes" :key="type.value" :value="type.value">
{{ type.label }}
</option>
</select>
</div>
<div class="input-group">
<label for="fileName">نام فایل</label>
<input
@ -58,24 +45,23 @@
placeholder="نام فایل را وارد کنید"
/>
</div>
<div class="input-group">
<p>انتخاب فایل</p>
<div style="width: 67%;">
<label for="fileUpload" class="file-input-label">
<span v-if="selectedFile" class="file-name">{{ selectedFile.name }}</span>
<span v-else>برای انتخاب فایل کلیک کنید</span>
</label>
<input
id="fileUpload"
ref="fileInput"
type="file"
@change="handleFileChange"
:accept="fileAccept"
required
class="file-input"
/>
</div>
</div>
<div class="input-group">
<p>انتخاب فایل</p>
<div style="width: 67%;">
<label for="fileUpload" class="file-input-label">
<span v-if="selectedFile" class="file-name">{{ selectedFile.name }}</span>
<span v-else>برای انتخاب فایل کلیک کنید</span>
</label>
<input
id="fileUpload"
ref="fileInput"
type="file"
@change="handleFileChange"
required
class="file-input"
/>
</div>
</div>
</form>
</div>
<div class="modal-actions">
@ -113,65 +99,32 @@ export default {
selectedFile: null,
uploading: false,
currentUploadType: this.initialUploadType,
dialogTitle: 'آپلود تصویر جدید',
fileAccept: 'image/*',
fileTypes: [
{ value: 'image', label: 'تصویر' },
{ value: 'pdf', label: 'PDF' },
{ value: 'video', label: 'ویدیو' },
{ value: 'glb', label: 'مدل 3D' },
],
dialogTitle: 'آپلود فایل جدید',
};
},
watch: {
isOpen(newVal) {
if (newVal) {
this.resetForm();
// غیرفعال کردن اسکرول صفحه پسزمینه
document.body.style.overflow = 'hidden';
} else {
// فعال کردن مجدد اسکرول هنگام بسته شدن
document.body.style.overflow = '';
this.resetForm();
}
},
initialUploadType(newType) {
this.currentUploadType = newType;
this.updateFileAccept();
this.resetForm();
},
},
methods: {
beforeDestroy() {
// اطمینان از فعال شدن اسکرول هنگام حذف کامپوننت
document.body.style.overflow = '';
},
updateFileAccept(event) {
this.currentUploadType = event ? event.target.value : this.currentUploadType;
switch (this.currentUploadType) {
case 'image':
this.fileAccept = 'image/*';
this.dialogTitle = 'آپلود تصویر جدید';
break;
case 'pdf':
this.fileAccept = '.pdf';
this.dialogTitle = 'آپلود فایل PDF';
break;
case 'video':
this.fileAccept = 'video/*';
this.dialogTitle = 'آپلود ویدیو';
break;
case 'glb':
this.fileAccept = '.glb';
this.dialogTitle = 'آپلود مدل 3D';
break;
}
},
resetForm() {
this.newFileName = '';
this.selectedFile = null;
this.currentUploadType = this.initialUploadType;
this.updateFileAccept();
if (this.$refs.fileInput) {
this.$refs.fileInput.value = '';
}
@ -182,6 +135,25 @@ export default {
},
handleFileChange(event) {
this.selectedFile = event.target.files[0];
if (this.selectedFile) {
const fileName = this.selectedFile.name.toLowerCase();
if (/\.(jpg|jpeg|png|gif|webp|psd|raw|heic|heif|ico)$/i.test(fileName)) {
this.currentUploadType = 'image';
this.dialogTitle = 'آپلود تصویر جدید';
} else if (/\.(pdf|fdf)$/i.test(fileName)) {
this.currentUploadType = 'pdf';
this.dialogTitle = 'آپلود فایل PDF';
} else if (/\.(mp4|mov|mkv|wmv|m4v|mpg|webm|ogg)$/i.test(fileName)) {
this.currentUploadType = 'video';
this.dialogTitle = 'آپلود ویدیو';
} else if (/\.(glb|obj|fbx|stl|ply|gltf)|$/i.test(fileName)) {
this.currentUploadType = 'glb';
this.dialogTitle = 'آپلود مدل 3D';
} else {
this.currentUploadType = 'other';
this.dialogTitle = 'آپلود فایل سایر';
}
}
},
async uploadFile() {
if (!this.selectedFile) {
@ -192,11 +164,21 @@ export default {
this.uploading = true;
const formData = new FormData();
formData.append('name', this.newFileName || this.selectedFile.name);
formData.append(this.currentUploadType, this.selectedFile);
formData.append(this.currentUploadType === 'other' ? 'file' : this.currentUploadType, this.selectedFile);
try {
const token = localStorage.getItem('token');
const uploadUrl = `${this.baseUrl}/upload${this.currentUploadType.charAt(0).toUpperCase() + this.currentUploadType.slice(1)}/`;
let uploadUrl = `${this.baseUrl}/upload${this.currentUploadType.charAt(0).toUpperCase() + this.currentUploadType.slice(1)}/`;
if (this.currentUploadType === 'other') {
console.log('فایل به دسته "سایر" ارسال می‌شود:', this.selectedFile.name);
alert('فایل به دسته "سایر" ارسال شد (تستی).');
this.resetForm();
this.$emit('upload-success');
this.$emit('close');
return;
}
await axios.post(uploadUrl, formData, {
headers: {
@ -210,7 +192,6 @@ export default {
this.$emit('close');
alert('فایل با موفقیت آپلود شد');
// بررسی مسیر فعلی و هدایت به /dashboard/files در صورت نیاز
if (this.$route.path !== '/dashboard/files') {
this.$router.push('/dashboard/files');
}

View File

@ -1,8 +1,9 @@
<template>
<div class="file-manager">
<div>
<!-- Top Header -->
<!-- Description -->
<div class="section-description">
<h2 class="section-title">مدیریت فایلها</h2>
<div class="section-title">مدیریت فایلها</div>
<p>
فایلهای خود مانند مدلهای سهبعدی، تصاویر و اسناد PDF را برای استفاده در VR آماده کنید. یا یادداشتها و تصاویر ایجاد شده در برنامه XRoom را دانلود کنید.
</p>
@ -10,223 +11,129 @@
<!-- File Manager Layout -->
<div class="file-manager-layout">
<aside class="file-sidebar">
<div class="file-sidebar">
<div class="filter-buttons">
<button
class="new-file"
@click="openDialog('image')"
role="button"
aria-label="آپلود فایل جدید"
>
<button class="new-file" @click="openDialog('image')">
فایل جدید
<svg
xmlns="http://www.w3.org/2000/svg"
width="22"
height="22"
viewBox="0 0 16 16"
fill="none"
>
<g clip-path="url(#clip0_312_7133)">
<path
d="M2.66602 11.3333V12.6666C2.66602 13.0202 2.80649 13.3593 3.05654 13.6094C3.30659 13.8594 3.64573 13.9999 3.99935 13.9999H11.9993C12.353 13.9999 12.6921 13.8594 12.9422 13.6094C13.1922 13.3593 13.3327 13.0202 13.3327 12.6666V11.3333"
stroke="white"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M4.66602 6.00008L7.99935 2.66675L11.3327 6.00008"
stroke="white"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M8 2.66675V10.6667"
stroke="white"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</g>
<defs>
<clipPath id="clip0_312_7133">
<rect width="16" height="16" fill="white" />
</clipPath>
</defs>
</svg>
<span>
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_312_7133)">
<path d="M2.66602 11.3333V12.6666C2.66602 13.0202 2.80649 13.3593 3.05654 13.6094C3.30659 13.8594 3.64573 13.9999 3.99935 13.9999H11.9993C12.353 13.9999 12.6921 13.8594 12.9422 13.6094C13.1922 13.3593 13.3327 13.0202 13.3327 12.6666V11.3333" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M4.66602 6.00008L7.99935 2.66675L11.3327 6.00008" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M8 2.66675V10.6667" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
</g>
<defs>
<clipPath id="clip0_312_7133">
<rect width="16" height="16" fill="white"></rect>
</clipPath>
</defs>
</svg>
</span>
</button>
<!-- Filters -->
<button
v-for="filter in filters"
:key="filter.id"
v-for="(filter, index) in filters"
:key="'filter-' + index"
:class="[
'filter-btn',
{ 'active-btn': activeFilter === filter.id },
{ 'disable-btn': activeFilter !== filter.id },
{ 'recent-filter-border': filter.id === 'recent-files' },
{ 'recent-filter-border': filter.id === 'recent-files' }
]"
@click="setActiveFilter(filter.id)"
role="button"
:aria-label="`فیلتر ${filter.label}`"
>
<span :class="['filter-icon', { 'active-icon': activeFilter === filter.id, 'disable-icon': activeFilter !== filter.id }]">
<component :is="filter.iconComponent" />
<span v-html="filter.icon" :class="['filter-icon', { 'active-icon': activeFilter === filter.id, 'disable-icon': activeFilter !== filter.id }]">
</span>
{{ filter.label }}
</button>
</div>
</aside>
</div>
<!-- File Grid -->
<!-- Cards Grid -->
<div class="file-grid">
<section v-for="section in filteredFileSections" :key="section.type" class="file-section">
<h3 class="section-title">{{ section.title }}</h3>
<div
v-if="filteredFiles(section.type).length > 0"
class="file-grid-content"
>
<div v-for="section in filteredFileSections" :key="section.type" class="file-section">
<div class="section-title">{{ section.title }}</div>
<div v-if="filteredFiles(section.type).length > 0" style="display: flex; align-items: center; gap: 1.5rem 0.9rem; flex-wrap: wrap;">
<div
class="file-card"
v-for="file in filteredFiles(section.type)"
:key="file.id"
@click="openPreviewDialog(section.type, file.id, getFullFileUrl(file.file_path))"
role="button"
:aria-label="`نمایش پیش‌نمایش فایل ${file.name}`"
v-for="(file, index) in filteredFiles(section.type)"
:key="`${section.type}-${index}`"
@click="openPreviewDialog(section.type, index, getFullFileUrl(file[section.type]), file.id)"
>
<img
:src="getFilePreviewImage(section.type, file)"
:class="['file-image', { 'file-pdf': section.type === 'pdf', 'file-video': section.type === 'video', 'file-glb': section.type === 'glb' ,'file-other': section.type === 'other' }]"
:alt="file.name"
:class="[
{
'file-image': section.type === 'image',
'file-image file-pdf': section.type === 'pdf',
'file-image file-video': section.type === 'video',
'file-image file-glb': section.type === 'glb',
'file-image file-other': section.type === 'other'
}
]"
/>
<div class="file-card-info">
<h4 class="file-title">{{ file.name }}</h4>
<div class="file-title">{{ file.name }}</div>
<div class="file-meta">
<svg
xmlns="http://www.w3.org/2000/svg"
width="22"
height="22"
viewBox="0 0 20 20"
fill="none"
>
<path
d="M2.5 10C2.5 11.4834 2.93987 12.9334 3.76398 14.1668C4.58809 15.4001 5.75943 16.3614 7.12987 16.9291C8.50032 17.4968 10.0083 17.6453 11.4632 17.3559C12.918 17.0665 14.2544 16.3522 15.3033 15.3033C16.3522 14.2544 17.0665 12.918 17.3559 11.4632C17.6453 10.0083 17.4968 8.50032 16.9291 7.12987C16.3614 5.75943 15.4001 4.58809 14.1668 3.76398C12.9334 2.93987 11.4834 2.5 10 2.5C7.90329 2.50789 5.89081 3.32602 4.38333 4.78333L2.5 6.66667"
stroke="#101010"
stroke-width="1.25"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M2.5 2.5V6.66667H6.66667"
stroke="#101010"
stroke-width="1.25"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M10 5.83325V9.99992L13.3333 11.6666"
stroke="#101010"
stroke-width="1.25"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
<span>
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 20 20" fill="none">
<path d="M2.5 10C2.5 11.4834 2.93987 12.9334 3.76398 14.1668C4.58809 15.4001 5.75943 16.3614 7.12987 16.9291C8.50032 17.4968 10.0083 17.6453 11.4632 17.3559C12.918 17.0665 14.2544 16.3522 15.3033 15.3033C16.3522 14.2544 17.0665 12.918 17.3559 11.4632C17.6453 10.0083 17.4968 8.50032 16.9291 7.12987C16.3614 5.75943 15.4001 4.58809 14.1668 3.76398C12.9334 2.93987 11.4834 2.5 10 2.5C7.90329 2.50789 5.89081 3.32602 4.38333 4.78333L2.5 6.66667" stroke="#101010" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2.5 2.5V6.66667H6.66667" stroke="#101010" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10 5.83325V9.99992L13.3333 11.6666" stroke="#101010" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="file-date">{{ formatDate(file.created_at) }}</span>
</div>
</div>
</div>
</div>
<div v-else class="no-files-message">
فایلی وجود ندارد
<button
class="upload-btn"
v-if="activeFilter !== 'recent-files' && activeFilter !== 'others'"
@click="openDialog(section.type)"
role="button"
:aria-label="`آپلود فایل`"
>
آپلود فایل
<svg
xmlns="http://www.w3.org/2000/svg"
width="22"
height="22"
viewBox="0 0 16 16"
fill="none"
>
<g clip-path="url(#clip0_312_7133)">
<path
d="M2.66602 11.3333V12.6666C2.66602 13.0202 2.80649 13.3593 3.05654 13.6094C3.30659 13.8594 3.64573 13.9999 3.99935 13.9999H11.9993C12.353 13.9999 12.6921 13.8594 12.9422 13.6094C13.1922 13.3593 13.3327 13.0202 13.3327 12.6666V11.3333"
stroke="white"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M4.66602 6.00008L7.99935 2.66675L11.3327 6.00008"
stroke="white"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M8 2.66675V10.6667"
stroke="white"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</g>
<defs>
<clipPath id="clip0_312_7133">
<rect width="16" height="16" fill="white" />
</clipPath>
</defs>
</svg>
<button class="new-file" @click="openDialog(section.type)">
فایلی وجود ندارد , برای آپلود فایل جدید کلیک کنید
<span>
<svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 16 16" fill="none">
<g clip-path="url(#clip0_312_7133)">
<path d="M2.66602 11.3333V12.6666C2.66602 13.0202 2.80649 13.3593 3.05654 13.6094C3.30659 13.8594 3.64573 13.9999 3.99935 13.9999H11.9993C12.353 13.9999 12.6921 13.8594 12.9422 13.6094C13.1922 13.3593 13.3327 13.0202 13.3327 12.6666V11.3333" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M4.66602 6.00008L7.99935 2.66675L11.3327 6.00008" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M8 2.66675V10.6667" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
</g>
<defs>
<clipPath id="clip0_312_7133">
<rect width="16" height="16" fill="white"></rect>
</clipPath>
</defs>
</svg>
</span>
</button>
</div>
</section>
<div
v-if="filteredFileSections.length === 0 || (activeFilter === 'recent-files' && !hasRecentFiles)"
class="no-files-message"
>
</div>
<div v-if="filteredFileSections.length === 0" class="no-files-message">
فایلی وجود ندارد
<button
v-if="activeFilter !== 'recent-files' && getFilterType(activeFilter) !== 'other'"
class="upload-btn"
@click="openDialog(getFilterType(activeFilter))"
role="button"
aria-label="آپلود فایل"
>
آپلود فایل
</button>
</div>
</div>
</div>
<!-- New File Dialog Component -->
<NewFileDialog
:is-open="isNewFileDialogOpen"
:initial-upload-type="currentUploadType"
:base-url="baseUrl"
@close="closeDialog"
@upload-success="fetchUserData"
/>
<!-- File Preview Dialog Component -->
<FilePreviewDialog
:is-open="isPreviewDialogOpen"
:preview-url="previewUrl"
:preview-type="currentPreviewType"
:preview-index="currentPreviewIndex"
:base-url="baseUrl"
:video-options="videoOptions"
@close="closePreviewDialog"
@delete-success="fetchUserData"
/>
</div>
<!-- New File Dialog Component -->
<NewFileDialog
:is-open="isNewFileDialogOpen"
:initial-upload-type="currentUploadType"
:base-url="baseUrl"
@close="closeDialog"
@upload-success="fetchUserData"
/>
<!-- File Preview Dialog Component -->
<FilePreviewDialog
:is-open="isPreviewDialogOpen"
:preview-url="previewUrl"
:preview-type="currentPreviewType"
:preview-index="currentPreviewIndex"
:base-url="baseUrl"
:video-options="videoOptions"
@close="closePreviewDialog"
@delete-success="fetchUserData"
/>
</template>
<script>
@ -235,93 +142,27 @@ import axios from 'axios';
import NewFileDialog from '@/components/NewFileDialog.vue';
import FilePreviewDialog from '@/components/FilePreviewDialog.vue';
// تعریف آیکونها بهصورت کامپوننتهای SVG
const RecentFilesIcon = {
template: `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M2.5 10C2.5 11.4834 2.93987 12.9334 3.76398 14.1668C4.58809 15.4001 5.75943 16.3614 7.12987 16.9291C8.50032 17.4968 10.0083 17.6453 11.4632 17.3559C12.918 17.0665 14.2544 16.3522 15.3033 15.3033C16.3522 14.2544 17.0665 12.918 17.3559 11.4632C17.6453 10.0083 17.4968 8.50032 16.9291 7.12987C16.3614 5.75943 15.4001 4.58809 14.1668 3.76398C12.9334 2.93987 11.4834 2.5 10 2.5C7.90329 2.50789 5.89081 3.32602 4.38333 4.78333L2.5 6.66667" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2.5 2.5V6.66667H6.66667" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10 5.83325V9.99992L13.3333 11.6666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
`,
};
const AllFilesIcon = {
template: `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M2.5 3.33333V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 16.6667V3.33333C17.5 2.8913 17.3244 2.46738 17.0118 2.15482C16.6993 1.84226 16.2754 1.66667 15.8333 1.66667H4.16667C3.72464 1.66667 3.30072 1.84226 2.98816 2.15482C2.67559 2.46738 2.5 2.8913 2.5 3.33333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.5 2.5V6.66667C12.5 7.1087 12.6756 7.53262 12.9882 7.84518C13.3007 8.15774 13.7246 8.33333 14.1667 8.33333H17.5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
`,
};
const ImagesIcon = {
template: `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M2.5 3.33333V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 16.6667V3.33333C17.5 2.8913 17.3244 2.46738 17.0118 2.15482C16.6993 1.84226 16.2754 1.66667 15.8333 1.66667H4.16667C3.72464 1.66667 3.30072 1.84226 2.98816 2.15482C2.67559 2.46738 2.5 2.8913 2.5 3.33333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.66667 8.33333C7.58714 8.33333 8.33333 7.58714 8.33333 6.66667C8.33333 5.74619 7.58714 5 6.66667 5C5.74619 5 5 5.74619 5 6.66667C5 7.58714 5.74619 8.33333 6.66667 8.33333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.5 12.5L13.3333 8.33333L5 16.6667" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
`,
};
const PDFsIcon = {
template: `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M12.5 2.5H4.16667C3.72464 2.5 3.30072 2.67559 2.98816 2.98816C2.67559 3.30072 2.5 3.72464 2.5 4.16667V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 17.1087 17.5 16.6667V6.66667L12.5 2.5Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.5 2.5V6.66667C12.5 7.1087 12.6756 7.53262 12.9882 7.84518C13.3007 8.15774 13.7246 8.33333 14.1667 8.33333H17.5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
`,
};
const VideosIcon = {
template: `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M2.5 3.33333V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 17.1087 17.5 16.6667V3.33333C17.5 2.8913 17.3244 2.46738 17.0118 2.15482C16.6993 1.84226 16.2754 1.66667 15.8333 1.66667H4.16667C3.72464 1.66667 3.30072 1.84226 2.98816 2.15482C2.67559 2.46738 2.5 2.8913 2.5 3.33333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7.5 5.83333L13.3333 10L7.5 14.1667V5.83333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
`,
};
const Models3DIcon = {
template: `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M10 2.5C7.23858 2.5 4.58333 3.31667 2.5 4.78333V16.6667C4.58333 15.3167 7.23858 14.5 10 14.5C12.7614 14.5 15.4167 15.3167 17.5 16.6667V4.78333C15.4167 3.31667 12.7614 2.5 10 2.5Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10 2.5V14.5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
`,
};
const OthersIcon = {
template: `
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M2.5 3.33333V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 17.1087 17.5 16.6667V3.33333C17.5 2.8913 17.3244 2.46738 17.0118 2.15482C16.6993 1.84226 16.2754 1.66667 15.8333 1.66667H4.16667C3.72464 1.66667 3.30072 1.84226 2.98816 2.15482C2.67559 2.46738 2.5 2.8913 2.5 3.33333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7.5 5.83333H12.5" stroke-width="2" stroke-linecap="round"/>
<path d="M7.5 8.33333H12.5" stroke-width="2" stroke-linecap="round"/>
<path d="M7.5 10.8333H10" stroke-width="2" stroke-linecap="round"/>
</svg>
`,
};
export default {
name: 'DashboardPage',
components: {
NewFileDialog,
FilePreviewDialog,
RecentFilesIcon,
AllFilesIcon,
ImagesIcon,
PDFsIcon,
VideosIcon,
Models3DIcon,
OthersIcon,
},
data() {
return {
userData: {
files: [],
customer: {},
user: {
first_name: '',
last_name: '',
},
images: [],
pdfs: [],
videos: [],
glbs: [],
others: [],
},
baseUrl: 'http://194.62.43.230:8000',
baseUrl: 'http://194.62.43.230:8000/',
isNewFileDialogOpen: false,
currentUploadType: 'image',
isPreviewDialogOpen: false,
@ -335,67 +176,117 @@ export default {
},
activeFilter: 'all-files',
filters: [
{ id: 'recent-files', label: 'فایل‌های اخیر', iconComponent: 'RecentFilesIcon' },
{ id: 'all-files', label: 'همه فایل‌ها', iconComponent: 'AllFilesIcon' },
{ id: 'images', label: 'تصاویر', iconComponent: 'ImagesIcon' },
{ id: 'pdfs', label: 'PDFها', iconComponent: 'PDFsIcon' },
{ id: 'videos', label: 'ویدیوها', iconComponent: 'VideosIcon' },
{ id: 'glbs', label: 'مدل‌های 3D', iconComponent: 'Models3DIcon' },
{ id: 'others', label: 'سایر', iconComponent: 'OthersIcon' },
{
id: 'recent-files',
label: 'فایل‌های اخیر',
icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M2.5 10C2.5 11.4834 2.93987 12.9334 3.76398 14.1668C4.58809 15.4001 5.75943 16.3614 7.12987 16.9291C8.50032 17.4968 10.0083 17.6453 11.4632 17.3559C12.918 17.0665 14.2544 16.3522 15.3033 15.3033C16.3522 14.2544 17.0665 12.918 17.3559 11.4632C17.6453 10.0083 17.4968 8.50032 16.9291 7.12987C16.3614 5.75943 15.4001 4.58809 14.1668 3.76398C12.9334 2.93987 11.4834 2.5 10 2.5C7.90329 2.50789 5.89081 3.32602 4.38333 4.78333L2.5 6.66667" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M2.5 2.5V6.66667H6.66667" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10 5.83325V9.99992L13.3333 11.6666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>`,
},
{
id: 'all-files',
label: 'همه فایل‌ها',
icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M2.5 3.33333V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 16.6667V3.33333C17.5 2.8913 17.3244 2.46738 17.0118 2.15482C16.6993 1.84226 16.2754 1.66667 15.8333 1.66667H4.16667C3.72464 1.66667 3.30072 1.84226 2.98816 2.15482C2.67559 2.46738 2.5 2.8913 2.5 3.33333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.5 2.5V6.66667C12.5 7.1087 12.6756 7.53262 12.9882 7.84518C13.3007 8.15774 13.7246 8.33333 14.1667 8.33333H17.5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>`,
},
{
id: 'images',
label: 'تصاویر',
icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M2.5 3.33333V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 16.6667V3.33333C17.5 2.8913 17.3244 2.46738 17.0118 2.15482C16.6993 1.84226 16.2754 1.66667 15.8333 1.66667H4.16667C3.72464 1.66667 3.30072 1.84226 2.98816 2.15482C2.67559 2.46738 2.5 2.8913 2.5 3.33333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M6.66667 8.33333C7.58714 8.33333 8.33333 7.58714 8.33333 6.66667C8.33333 5.74619 7.58714 5 6.66667 5C5.74619 5 5 5.74619 5 6.66667C5 7.58714 5.74619 8.33333 6.66667 8.33333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.5 12.5L13.3333 8.33333L5 16.6667" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>`,
},
{
id: 'pdfs',
label: 'PDFها',
icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M12.5 2.5H4.16667C3.72464 2.5 3.30072 2.67559 2.98816 2.98816C2.67559 3.30072 2.5 3.72464 2.5 4.16667V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 16.6667V6.66667L12.5 2.5Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.5 2.5V6.66667C12.5 7.1087 12.6756 7.53262 12.9882 7.84518C13.3007 8.15774 13.7246 8.33333 14.1667 8.33333H17.5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>`,
},
{
id: 'videos',
label: 'ویدیوها',
icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M2.5 3.33333V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 16.6667V3.33333C17.5 2.8913 17.3244 2.46738 17.0118 2.15482C16.6993 1.84226 16.2754 1.66667 15.8333 1.66667H4.16667C3.72464 1.66667 3.30072 1.84226 2.98816 2.15482C2.67559 2.46738 2.5 2.8913 2.5 3.33333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7.5 5.83333L13.3333 10L7.5 14.1667V5.83333Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>`,
},
{
id: 'glbs',
label: 'مدل‌های 3D',
icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M10 2.5C7.23858 2.5 4.58333 3.31667 2.5 4.78333V16.6667C4.58333 15.3167 7.23858 14.5 10 14.5C12.7614 14.5 15.4167 15.3167 17.5 16.6667V4.78333C15.4167 3.31667 12.7614 2.5 10 2.5Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10 2.5V14.5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>`,
},
{
id: 'others',
label: 'سایر',
icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
<path d="M12.5 2.5H4.16667C3.72464 2.5 3.30072 2.67559 2.98816 2.98816C2.67559 3.30072 2.5 3.72464 2.5 4.16667V16.6667C2.5 17.1087 2.67559 17.5326 2.98816 17.8452C3.30072 18.1577 3.72464 18.3333 4.16667 18.3333H15.8333C16.2754 18.3333 16.6993 18.1577 17.0118 17.8452C17.3244 17.5326 17.5 16.6667V6.66667L12.5 2.5Z" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.5 2.5V6.66667C12.5 7.1087 12.6756 7.53262 12.9882 7.84518C13.3007 8.15774 13.7246 8.33333 14.1667 8.33333H17.5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10 10H10.01" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10 13H10.01" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M10 16H10.01" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>`,
},
],
fileSections: [
{ type: 'image', title: 'مدیریت تصاویر', extensions: ['.jpg', '.jpeg', '.png', '.gif'] },
{ type: 'pdf', title: 'مدیریت PDFها', extensions: ['.pdf'] },
{ type: 'video', title: 'مدیریت ویدیوها', extensions: ['.mp4', '.mov', '.avi'] },
{ type: 'glb', title: 'مدیریت مدل‌های 3D', extensions: ['.glb'] },
{ type: 'other', title: 'سایر فایل‌ها', extensions: [] },
{ type: 'image', title: 'مدیریت تصاویر' },
{ type: 'pdf', title: 'مدیریت PDFها' },
{ type: 'video', title: 'مدیریت ویدیوها' },
{ type: 'glb', title: 'مدیریت مدل‌های 3D' },
{ type: 'other', title: 'مدیریت سایر فایل‌ها' },
],
};
},
computed: {
filteredFileSections() {
const filterTypeMap = {
images: 'image',
pdfs: 'pdf',
videos: 'video',
glbs: 'glb',
others: 'other',
};
const filterType = filterTypeMap[this.activeFilter];
return this.fileSections.filter(section => {
if (this.activeFilter === 'all-files' || this.activeFilter === 'recent-files') {
return this.filteredFiles(section.type).length > 0;
}
return filterType === section.type;
});
let sections = this.fileSections;
if (this.activeFilter === 'all-files' || this.activeFilter === 'recent-files') {
sections = this.fileSections.filter(section => {
const files = this.filteredFiles(section.type);
return files.length > 0;
});
} else {
const filterTypeMap = {
images: 'image',
pdfs: 'pdf',
videos: 'video',
glbs: 'glb',
others: 'other',
};
const filterType = filterTypeMap[this.activeFilter];
sections = filterType
? this.fileSections.filter(section => {
const files = this.filteredFiles(section.type);
return section.type === filterType && files.length > 0;
})
: [];
}
return sections;
},
hasRecentFiles() {
const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
return this.userData.files.some(file => {
const fileDate = this.parseDate(file.created_at);
return fileDate && fileDate >= twentyFourHoursAgo;
});
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
return ['images', 'pdfs', 'videos', 'glbs', 'others'].some(type =>
this.userData[type].some(file => new Date(file.created_at) >= sevenDaysAgo)
);
},
},
created() {
this.fetchUserData();
},
methods: {
parseDate(dateString) {
if (!dateString) return null;
const date = new Date(dateString);
if (!isNaN(date.getTime())) return date;
const formats = [
dateString.replace(/(\d{4})\/(\d{2})\/(\d{2}) (\d{2}:\d{2}:\d{2})/, '$1-$2-$3T$4Z'),
dateString.replace(/(\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2})/, '$1-$2-$3T$4Z'),
dateString.replace(/(\d{4})\/(\d{2})\/(\d{2})/, '$1-$2-$3'),
];
for (const formatted of formats) {
const parsed = new Date(formatted);
if (!isNaN(parsed.getTime())) return parsed;
}
return null;
},
setActiveFilter(filterId) {
this.activeFilter = filterId;
},
@ -409,44 +300,25 @@ export default {
};
return filterTypeMap[filterId] || 'image';
},
getFileExtension(file) {
const filePath = file.file_path || '';
const extension = filePath.match(/\.([0-9a-z]+)$/i);
return extension ? extension[0].toLowerCase() : '.unknown';
},
getFileType(file) {
const extension = this.getFileExtension(file);
for (const section of this.fileSections) {
if (section.extensions.includes(extension)) {
return section.type;
}
}
return 'other';
},
filteredFiles(type) {
let files = this.userData.files.filter(file => {
const fileType = this.getFileType(file);
return file.file_path && file.file_path.trim() !== '' && fileType === type;
});
const files = this.userData[`${type}s`];
if (!files) return [];
if (this.activeFilter === 'recent-files') {
const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);
files = files.filter(file => {
const fileDate = this.parseDate(file.created_at);
return fileDate && fileDate >= twentyFourHoursAgo;
});
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
return files.filter(file => new Date(file.created_at) >= sevenDaysAgo);
}
const filterTypeMap = {
images: 'image',
images: 'image',
pdfs: 'pdf',
videos: 'video',
glbs: 'glb',
others: 'other',
};
if (this.activeFilter !== 'all-files' && this.activeFilter !== 'recent-files' && filterTypeMap[this.activeFilter] !== type) {
files = [];
if (this.activeFilter !== 'all-files' && filterTypeMap[this.activeFilter] !== type) {
return [];
}
return files;
@ -454,7 +326,7 @@ export default {
getFilePreviewImage(type, file) {
switch (type) {
case 'image':
return this.getFullFileUrl(file.file_path);
return this.getFullFileUrl(file.image);
case 'pdf':
return 'https://cdn-icons-png.flaticon.com/512/337/337946.png';
case 'video':
@ -462,18 +334,19 @@ export default {
case 'glb':
return require('@/assets/img/3d icon.jpg');
case 'other':
return 'https://cdn-icons-png.flaticon.com/512/148/148839.png';
return 'https://cdn-icons-png.flaticon.com/512/186/186159.png';
default:
return '';
}
},
getFullFileUrl(relativePath) {
return relativePath ? `${this.baseUrl}${relativePath}` : '';
if (!relativePath) return '';
return `${this.baseUrl}${relativePath}`;
},
formatDate(dateString) {
if (!dateString) return 'نامعتبر';
const date = this.parseDate(dateString);
return date ? date.toLocaleDateString('fa-IR', { year: 'numeric', month: 'long', day: 'numeric' }) : 'نامعتبر';
if (!dateString) return '';
const date = new Date(dateString);
return date.toLocaleDateString('fa-IR');
},
openDialog(type = 'image') {
this.currentUploadType = type;
@ -482,13 +355,15 @@ export default {
closeDialog() {
this.isNewFileDialogOpen = false;
},
openPreviewDialog(type, id, url) {
openPreviewDialog(type, index, url, id) {
this.currentPreviewType = type;
this.currentPreviewIndex = id;
this.previewUrl = url;
if (type === 'video') {
this.videoOptions.sources[0].src = url;
}
this.isPreviewDialogOpen = true;
},
closePreviewDialog() {
@ -500,50 +375,20 @@ export default {
async fetchUserData() {
try {
const token = localStorage.getItem('token');
if (!token) {
this.$router.push('/login');
return;
}
const response = await axios.get(`${this.baseUrl}/getInfo`, {
headers: {
Authorization: `Token ${token}`,
'Authorization': `Token ${token}`,
},
});
const data = response.data.data || {};
this.userData.files = [
...(data.images || []).map(file => ({
id: file.id,
name: file.name,
file_path: file.image,
created_at: file.created_at,
})),
...(data.pdfs || []).map(file => ({
id: file.id,
name: file.name,
file_path: file.pdf,
created_at: file.created_at,
})),
...(data.videos || []).map(file => ({
id: file.id,
name: file.name,
file_path: file.video,
created_at: file.created_at,
})),
...(data.glbs || []).map(file => ({
id: file.id,
name: file.name,
file_path: file.glb,
created_at: file.created_at,
})),
];
this.userData = {
...response.data.data,
others: response.data.data.others || [],
};
} catch (error) {
if (error.response?.status === 401) {
this.$router.push('/login');
} else {
alert('خطا در بارگذاری فایل‌ها: ' + (error.response?.data?.message || error.message));
}
console.error('Error fetching user data:', error);
this.userData.others = [
];
}
},
},