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", "@heroicons/vue": "^2.2.0",
"@videojs-player/vue": "^1.0.0", "@videojs-player/vue": "^1.0.0",
"@videojs/themes": "^1.0.1", "@videojs/themes": "^1.0.1",
"aframe": "^1.7.1",
"axios": "^1.8.4", "axios": "^1.8.4",
"core-js": "^3.8.3", "core-js": "^3.8.3",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"moment-jalaali": "^0.10.4", "moment-jalaali": "^0.10.4",
"plyr": "^3.7.8",
"swiper": "^11.2.8", "swiper": "^11.2.8",
"video.js": "^7.21.7", "video.js": "^7.21.7",
"vue": "^3.2.13", "vue": "^3.2.13",
"vue-pdf-embed": "^2.1.2", "vue-pdf-embed": "^2.1.2",
"vue-persian-datetime-picker": "^2.10.4", "vue-persian-datetime-picker": "^2.10.4",
"vue-plyr": "^7.0.0",
"vue-router": "^4.5.0", "vue-router": "^4.5.0",
"vue-video-player": "^6.0.0", "vue-video-player": "^6.0.0",
"vue3-persian-datetime-picker": "^1.2.2", "vue3-persian-datetime-picker": "^1.2.2",
@ -3732,6 +3735,15 @@
"dev": true, "dev": true,
"license": "BSD-3-Clause" "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": { "node_modules/@soda/friendly-errors-webpack-plugin": {
"version": "1.8.1", "version": "1.8.1",
"resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", "resolved": "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz",
@ -3758,6 +3770,18 @@
"dev": true, "dev": true,
"license": "MIT" "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": { "node_modules/@trysound/sax": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz",
@ -5129,6 +5153,56 @@
"pkcs7": "^1.0.4" "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": { "node_modules/ajv": {
"version": "6.12.6", "version": "6.12.6",
"resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
@ -5198,6 +5272,12 @@
"ajv": "^6.9.1" "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": { "node_modules/ansi-colors": {
"version": "4.1.3", "version": "4.1.3",
"resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz", "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz",
@ -5316,6 +5396,15 @@
"dev": true, "dev": true,
"license": "MIT" "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": { "node_modules/array-union": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz",
@ -5326,6 +5415,12 @@
"node": ">=8" "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": { "node_modules/astral-regex": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz",
@ -5505,7 +5600,6 @@
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@ -5711,6 +5805,15 @@
"ieee754": "^1.1.13" "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": { "node_modules/buffer-from": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
@ -5728,6 +5831,72 @@
"node": ">= 0.8" "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": { "node_modules/call-bind": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz", "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz",
@ -5852,6 +6021,15 @@
"node": ">=4" "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": { "node_modules/chalk": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz", "resolved": "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz",
@ -6051,6 +6229,18 @@
"node": ">=6" "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": { "node_modules/color-convert": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
@ -6848,6 +7038,12 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT" "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": { "node_modules/date-fns": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz",
@ -6869,7 +7065,6 @@
"version": "4.4.0", "version": "4.4.0",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz",
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"ms": "^2.1.3" "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": { "node_modules/deep-is": {
"version": "0.1.4", "version": "0.1.4",
"resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
@ -7053,6 +7272,12 @@
"url": "https://github.com/sponsors/sindresorhus" "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": { "node_modules/define-data-property": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
@ -7301,6 +7526,15 @@
"dev": true, "dev": true,
"license": "BSD-2-Clause" "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": { "node_modules/dunder-proto": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
@ -7322,6 +7556,12 @@
"dev": true, "dev": true,
"license": "MIT" "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": { "node_modules/easy-stack": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz",
@ -7377,7 +7617,6 @@
"version": "1.4.4", "version": "1.4.4",
"resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"once": "^1.4.0" "once": "^1.4.0"
@ -8640,7 +8879,6 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz", "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"pump": "^3.0.0" "pump": "^3.0.0"
@ -8743,6 +8981,28 @@
"url": "https://github.com/sponsors/ljharb" "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": { "node_modules/graceful-fs": {
"version": "4.2.11", "version": "4.2.11",
"resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", "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" "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": { "node_modules/http-deceiver": {
"version": "1.2.7", "version": "1.2.7",
"resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz", "resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz",
@ -9145,7 +9411,6 @@
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true,
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@ -9264,6 +9529,12 @@
"node": ">=8" "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": { "node_modules/is-ci": {
"version": "1.2.1", "version": "1.2.1",
"resolved": "https://registry.npmmirror.com/is-ci/-/is-ci-1.2.1.tgz", "resolved": "https://registry.npmmirror.com/is-ci/-/is-ci-1.2.1.tgz",
@ -9378,6 +9649,15 @@
"node": ">=0.12.0" "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": { "node_modules/is-plain-obj": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
@ -9700,6 +9980,17 @@
"launch-editor": "^2.10.0" "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": { "node_modules/levn": {
"version": "0.4.1", "version": "0.4.1",
"resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
@ -9771,6 +10062,22 @@
"@types/trusted-types": "^2.0.2" "@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": { "node_modules/loader-runner": {
"version": "4.3.0", "version": "4.3.0",
"resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz", "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz",
@ -9809,6 +10116,12 @@
"json5": "lib/cli.js" "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": { "node_modules/locate-path": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
@ -10055,6 +10368,15 @@
"tslib": "^2.0.3" "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": { "node_modules/lru-cache": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
@ -10101,6 +10423,24 @@
"url": "https://github.com/sponsors/sindresorhus" "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": { "node_modules/math-intrinsics": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@ -10205,7 +10545,6 @@
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true,
"license": "MIT", "license": "MIT",
"bin": { "bin": {
"mime": "cli.js" "mime": "cli.js"
@ -10245,6 +10584,15 @@
"node": ">=6" "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": { "node_modules/min-document": {
"version": "2.19.0", "version": "2.19.0",
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
@ -10354,7 +10702,6 @@
"version": "1.2.8", "version": "1.2.8",
"resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
@ -10448,7 +10795,6 @@
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/multicast-dns": { "node_modules/multicast-dns": {
@ -10536,6 +10882,27 @@
"dev": true, "dev": true,
"license": "MIT" "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": { "node_modules/nice-try": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", "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" "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": { "node_modules/p-finally": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz",
@ -10965,6 +11341,34 @@
"node": ">=6" "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": { "node_modules/parse-json": {
"version": "5.2.0", "version": "5.2.0",
"resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
@ -11094,6 +11498,18 @@
"@napi-rs/canvas": "^0.1.65" "@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": { "node_modules/picocolors": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
@ -11138,6 +11554,19 @@
"node": ">=8" "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": { "node_modules/portfinder": {
"version": "1.0.35", "version": "1.0.35",
"resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.35.tgz", "resolved": "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.35.tgz",
@ -12759,11 +13188,19 @@
"node": ">= 0.8.0" "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": { "node_modules/prettier": {
"version": "2.8.8", "version": "2.8.8",
"resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz",
"integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
"dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"bin": { "bin": {
@ -12950,7 +13387,6 @@
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz", "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz",
"integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"end-of-stream": "^1.1.0", "end-of-stream": "^1.1.0",
@ -12983,6 +13419,17 @@
"url": "https://github.com/sponsors/ljharb" "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": { "node_modules/queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
@ -13024,6 +13471,12 @@
"node": ">= 0.6" "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": { "node_modules/raw-body": {
"version": "2.5.2", "version": "2.5.2",
"resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz", "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz",
@ -13293,6 +13746,15 @@
"node": ">=4" "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": { "node_modules/restore-cursor": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz",
@ -13504,6 +13966,12 @@
"url": "https://paulmillr.com/funding/" "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": { "node_modules/schema-utils": {
"version": "2.7.1", "version": "2.7.1",
"resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz", "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz",
@ -14169,6 +14637,12 @@
"postcss": "^8.2.15" "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": { "node_modules/supports-color": {
"version": "7.2.0", "version": "7.2.0",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
@ -14523,6 +14997,18 @@
"license": "MIT", "license": "MIT",
"peer": true "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": { "node_modules/thunky": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz",
@ -14530,6 +15016,15 @@
"dev": true, "dev": true,
"license": "MIT" "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": { "node_modules/to-regex-range": {
"version": "5.0.1", "version": "5.0.1",
"resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
@ -14726,6 +15221,24 @@
"punycode": "^2.1.0" "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": { "node_modules/url-toolkit": {
"version": "2.2.5", "version": "2.2.5",
"resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz", "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz",
@ -15026,6 +15539,52 @@
"rimraf": "^3.0.2" "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": { "node_modules/vue-router": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz",
@ -15642,6 +16201,12 @@
"node": ">=0.10.0" "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": { "node_modules/wrap-ansi": {
"version": "7.0.0", "version": "7.0.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "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": { "node_modules/y18n": {
"version": "5.0.8", "version": "5.0.8",
"resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",

View File

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

View File

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

View File

@ -36,19 +36,6 @@
</div> </div>
<div class="form-content"> <div class="form-content">
<form @submit.prevent="uploadFile" autocomplete="off"> <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"> <div class="input-group">
<label for="fileName">نام فایل</label> <label for="fileName">نام فایل</label>
<input <input
@ -70,7 +57,6 @@
ref="fileInput" ref="fileInput"
type="file" type="file"
@change="handleFileChange" @change="handleFileChange"
:accept="fileAccept"
required required
class="file-input" class="file-input"
/> />
@ -113,65 +99,32 @@ export default {
selectedFile: null, selectedFile: null,
uploading: false, uploading: false,
currentUploadType: this.initialUploadType, currentUploadType: this.initialUploadType,
dialogTitle: 'آپلود تصویر جدید', dialogTitle: 'آپلود فایل جدید',
fileAccept: 'image/*',
fileTypes: [
{ value: 'image', label: 'تصویر' },
{ value: 'pdf', label: 'PDF' },
{ value: 'video', label: 'ویدیو' },
{ value: 'glb', label: 'مدل 3D' },
],
}; };
}, },
watch: { watch: {
isOpen(newVal) { isOpen(newVal) {
if (newVal) { if (newVal) {
this.resetForm(); this.resetForm();
// غیرفعال کردن اسکرول صفحه پسزمینه
document.body.style.overflow = 'hidden'; document.body.style.overflow = 'hidden';
} else { } else {
// فعال کردن مجدد اسکرول هنگام بسته شدن
document.body.style.overflow = ''; document.body.style.overflow = '';
this.resetForm(); this.resetForm();
} }
}, },
initialUploadType(newType) { initialUploadType(newType) {
this.currentUploadType = newType; this.currentUploadType = newType;
this.updateFileAccept();
this.resetForm(); this.resetForm();
}, },
}, },
methods: { methods: {
beforeDestroy() { beforeDestroy() {
// اطمینان از فعال شدن اسکرول هنگام حذف کامپوننت
document.body.style.overflow = ''; 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() { resetForm() {
this.newFileName = ''; this.newFileName = '';
this.selectedFile = null; this.selectedFile = null;
this.currentUploadType = this.initialUploadType; this.currentUploadType = this.initialUploadType;
this.updateFileAccept();
if (this.$refs.fileInput) { if (this.$refs.fileInput) {
this.$refs.fileInput.value = ''; this.$refs.fileInput.value = '';
} }
@ -182,6 +135,25 @@ export default {
}, },
handleFileChange(event) { handleFileChange(event) {
this.selectedFile = event.target.files[0]; 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() { async uploadFile() {
if (!this.selectedFile) { if (!this.selectedFile) {
@ -192,11 +164,21 @@ export default {
this.uploading = true; this.uploading = true;
const formData = new FormData(); const formData = new FormData();
formData.append('name', this.newFileName || this.selectedFile.name); 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 { try {
const token = localStorage.getItem('token'); 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, { await axios.post(uploadUrl, formData, {
headers: { headers: {
@ -210,7 +192,6 @@ export default {
this.$emit('close'); this.$emit('close');
alert('فایل با موفقیت آپلود شد'); alert('فایل با موفقیت آپلود شد');
// بررسی مسیر فعلی و هدایت به /dashboard/files در صورت نیاز
if (this.$route.path !== '/dashboard/files') { if (this.$route.path !== '/dashboard/files') {
this.$router.push('/dashboard/files'); this.$router.push('/dashboard/files');
} }

View File

@ -1,8 +1,9 @@
<template> <template>
<div class="file-manager"> <div>
<!-- Top Header -->
<!-- Description --> <!-- Description -->
<div class="section-description"> <div class="section-description">
<h2 class="section-title">مدیریت فایلها</h2> <div class="section-title">مدیریت فایلها</div>
<p> <p>
فایلهای خود مانند مدلهای سهبعدی، تصاویر و اسناد PDF را برای استفاده در VR آماده کنید. یا یادداشتها و تصاویر ایجاد شده در برنامه XRoom را دانلود کنید. فایلهای خود مانند مدلهای سهبعدی، تصاویر و اسناد PDF را برای استفاده در VR آماده کنید. یا یادداشتها و تصاویر ایجاد شده در برنامه XRoom را دانلود کنید.
</p> </p>
@ -10,198 +11,105 @@
<!-- File Manager Layout --> <!-- File Manager Layout -->
<div class="file-manager-layout"> <div class="file-manager-layout">
<aside class="file-sidebar"> <div class="file-sidebar">
<div class="filter-buttons"> <div class="filter-buttons">
<button <button class="new-file" @click="openDialog('image')">
class="new-file"
@click="openDialog('image')"
role="button"
aria-label="آپلود فایل جدید"
>
فایل جدید فایل جدید
<svg <span>
xmlns="http://www.w3.org/2000/svg" <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 16 16" fill="none">
width="22"
height="22"
viewBox="0 0 16 16"
fill="none"
>
<g clip-path="url(#clip0_312_7133)"> <g clip-path="url(#clip0_312_7133)">
<path <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="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" <path d="M4.66602 6.00008L7.99935 2.66675L11.3327 6.00008" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
stroke="white" <path d="M8 2.66675V10.6667" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
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> </g>
<defs> <defs>
<clipPath id="clip0_312_7133"> <clipPath id="clip0_312_7133">
<rect width="16" height="16" fill="white" /> <rect width="16" height="16" fill="white"></rect>
</clipPath> </clipPath>
</defs> </defs>
</svg> </svg>
</span>
</button> </button>
<!-- Filters -->
<button <button
v-for="filter in filters" v-for="(filter, index) in filters"
:key="filter.id" :key="'filter-' + index"
:class="[ :class="[
'filter-btn', 'filter-btn',
{ 'active-btn': activeFilter === filter.id }, { 'active-btn': activeFilter === filter.id },
{ 'disable-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)" @click="setActiveFilter(filter.id)"
role="button"
:aria-label="`فیلتر ${filter.label}`"
> >
<span :class="['filter-icon', { 'active-icon': activeFilter === filter.id, 'disable-icon': activeFilter !== filter.id }]"> <span v-html="filter.icon" :class="['filter-icon', { 'active-icon': activeFilter === filter.id, 'disable-icon': activeFilter !== filter.id }]">
<component :is="filter.iconComponent" />
</span> </span>
{{ filter.label }} {{ filter.label }}
</button> </button>
</div> </div>
</aside> </div>
<!-- File Grid --> <!-- Cards Grid -->
<div class="file-grid"> <div class="file-grid">
<section v-for="section in filteredFileSections" :key="section.type" class="file-section"> <div v-for="section in filteredFileSections" :key="section.type" class="file-section">
<h3 class="section-title">{{ section.title }}</h3> <div class="section-title">{{ section.title }}</div>
<div <div v-if="filteredFiles(section.type).length > 0" style="display: flex; align-items: center; gap: 1.5rem 0.9rem; flex-wrap: wrap;">
v-if="filteredFiles(section.type).length > 0"
class="file-grid-content"
>
<div <div
class="file-card" class="file-card"
v-for="file in filteredFiles(section.type)" v-for="(file, index) in filteredFiles(section.type)"
:key="file.id" :key="`${section.type}-${index}`"
@click="openPreviewDialog(section.type, file.id, getFullFileUrl(file.file_path))" @click="openPreviewDialog(section.type, index, getFullFileUrl(file[section.type]), file.id)"
role="button"
:aria-label="`نمایش پیش‌نمایش فایل ${file.name}`"
> >
<img <img
:src="getFilePreviewImage(section.type, file)" :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' }]" :class="[
:alt="file.name" {
'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"> <div class="file-card-info">
<h4 class="file-title">{{ file.name }}</h4> <div class="file-title">{{ file.name }}</div>
<div class="file-meta"> <div class="file-meta">
<svg <span>
xmlns="http://www.w3.org/2000/svg" <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 20 20" fill="none">
width="22" <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"/>
height="22" <path d="M2.5 2.5V6.66667H6.66667" stroke="#101010" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
viewBox="0 0 20 20" <path d="M10 5.83325V9.99992L13.3333 11.6666" stroke="#101010" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
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> </svg>
</span>
<span class="file-date">{{ formatDate(file.created_at) }}</span> <span class="file-date">{{ formatDate(file.created_at) }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div v-else class="no-files-message"> <div v-else class="no-files-message">
فایلی وجود ندارد <button class="new-file" @click="openDialog(section.type)">
<button فایلی وجود ندارد , برای آپلود فایل جدید کلیک کنید
class="upload-btn" <span>
v-if="activeFilter !== 'recent-files' && activeFilter !== 'others'" <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 16 16" fill="none">
@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)"> <g clip-path="url(#clip0_312_7133)">
<path <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="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" <path d="M4.66602 6.00008L7.99935 2.66675L11.3327 6.00008" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
stroke="white" <path d="M8 2.66675V10.6667" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
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> </g>
<defs> <defs>
<clipPath id="clip0_312_7133"> <clipPath id="clip0_312_7133">
<rect width="16" height="16" fill="white" /> <rect width="16" height="16" fill="white"></rect>
</clipPath> </clipPath>
</defs> </defs>
</svg> </svg>
</span>
</button> </button>
</div> </div>
</section> </div>
<div <div v-if="filteredFileSections.length === 0" class="no-files-message">
v-if="filteredFileSections.length === 0 || (activeFilter === 'recent-files' && !hasRecentFiles)"
class="no-files-message"
>
فایلی وجود ندارد فایلی وجود ندارد
<button </div>
v-if="activeFilter !== 'recent-files' && getFilterType(activeFilter) !== 'other'"
class="upload-btn"
@click="openDialog(getFilterType(activeFilter))"
role="button"
aria-label="آپلود فایل"
>
آپلود فایل
</button>
</div> </div>
</div> </div>
</div> </div>
@ -226,7 +134,6 @@
@close="closePreviewDialog" @close="closePreviewDialog"
@delete-success="fetchUserData" @delete-success="fetchUserData"
/> />
</div>
</template> </template>
<script> <script>
@ -235,93 +142,27 @@ import axios from 'axios';
import NewFileDialog from '@/components/NewFileDialog.vue'; import NewFileDialog from '@/components/NewFileDialog.vue';
import FilePreviewDialog from '@/components/FilePreviewDialog.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 { export default {
name: 'DashboardPage', name: 'DashboardPage',
components: { components: {
NewFileDialog, NewFileDialog,
FilePreviewDialog, FilePreviewDialog,
RecentFilesIcon,
AllFilesIcon,
ImagesIcon,
PDFsIcon,
VideosIcon,
Models3DIcon,
OthersIcon,
}, },
data() { data() {
return { return {
userData: { userData: {
files: [], customer: {},
user: {
first_name: '',
last_name: '',
}, },
baseUrl: 'http://194.62.43.230:8000', images: [],
pdfs: [],
videos: [],
glbs: [],
others: [],
},
baseUrl: 'http://194.62.43.230:8000/',
isNewFileDialogOpen: false, isNewFileDialogOpen: false,
currentUploadType: 'image', currentUploadType: 'image',
isPreviewDialogOpen: false, isPreviewDialogOpen: false,
@ -335,25 +176,87 @@ export default {
}, },
activeFilter: 'all-files', activeFilter: 'all-files',
filters: [ filters: [
{ id: 'recent-files', label: 'فایل‌های اخیر', iconComponent: 'RecentFilesIcon' }, {
{ id: 'all-files', label: 'همه فایل‌ها', iconComponent: 'AllFilesIcon' }, id: 'recent-files',
{ id: 'images', label: 'تصاویر', iconComponent: 'ImagesIcon' }, label: 'فایل‌های اخیر',
{ id: 'pdfs', label: 'PDFها', iconComponent: 'PDFsIcon' }, icon: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none">
{ id: 'videos', label: 'ویدیوها', iconComponent: 'VideosIcon' }, <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"/>
{ id: 'glbs', label: 'مدل‌های 3D', iconComponent: 'Models3DIcon' }, <path d="M2.5 2.5V6.66667H6.66667" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
{ id: 'others', label: 'سایر', iconComponent: 'OthersIcon' }, <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: [ fileSections: [
{ type: 'image', title: 'مدیریت تصاویر', extensions: ['.jpg', '.jpeg', '.png', '.gif'] }, { type: 'image', title: 'مدیریت تصاویر' },
{ type: 'pdf', title: 'مدیریت PDFها', extensions: ['.pdf'] }, { type: 'pdf', title: 'مدیریت PDFها' },
{ type: 'video', title: 'مدیریت ویدیوها', extensions: ['.mp4', '.mov', '.avi'] }, { type: 'video', title: 'مدیریت ویدیوها' },
{ type: 'glb', title: 'مدیریت مدل‌های 3D', extensions: ['.glb'] }, { type: 'glb', title: 'مدیریت مدل‌های 3D' },
{ type: 'other', title: 'سایر فایل‌ها', extensions: [] }, { type: 'other', title: 'مدیریت سایر فایل‌ها' },
], ],
}; };
}, },
computed: { computed: {
filteredFileSections() { filteredFileSections() {
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 = { const filterTypeMap = {
images: 'image', images: 'image',
pdfs: 'pdf', pdfs: 'pdf',
@ -362,40 +265,28 @@ export default {
others: 'other', others: 'other',
}; };
const filterType = filterTypeMap[this.activeFilter]; const filterType = filterTypeMap[this.activeFilter];
return this.fileSections.filter(section => { sections = filterType
if (this.activeFilter === 'all-files' || this.activeFilter === 'recent-files') { ? this.fileSections.filter(section => {
return this.filteredFiles(section.type).length > 0; const files = this.filteredFiles(section.type);
return section.type === filterType && files.length > 0;
})
: [];
} }
return filterType === section.type;
}); return sections;
}, },
hasRecentFiles() { hasRecentFiles() {
const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000); const sevenDaysAgo = new Date();
return this.userData.files.some(file => { sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
const fileDate = this.parseDate(file.created_at); return ['images', 'pdfs', 'videos', 'glbs', 'others'].some(type =>
return fileDate && fileDate >= twentyFourHoursAgo; this.userData[type].some(file => new Date(file.created_at) >= sevenDaysAgo)
}); );
}, },
}, },
created() { created() {
this.fetchUserData(); this.fetchUserData();
}, },
methods: { 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) { setActiveFilter(filterId) {
this.activeFilter = filterId; this.activeFilter = filterId;
}, },
@ -409,32 +300,14 @@ export default {
}; };
return filterTypeMap[filterId] || 'image'; 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) { filteredFiles(type) {
let files = this.userData.files.filter(file => { const files = this.userData[`${type}s`];
const fileType = this.getFileType(file); if (!files) return [];
return file.file_path && file.file_path.trim() !== '' && fileType === type;
});
if (this.activeFilter === 'recent-files') { if (this.activeFilter === 'recent-files') {
const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000); const sevenDaysAgo = new Date();
files = files.filter(file => { sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
const fileDate = this.parseDate(file.created_at); return files.filter(file => new Date(file.created_at) >= sevenDaysAgo);
return fileDate && fileDate >= twentyFourHoursAgo;
});
} }
const filterTypeMap = { const filterTypeMap = {
@ -444,9 +317,8 @@ export default {
glbs: 'glb', glbs: 'glb',
others: 'other', others: 'other',
}; };
if (this.activeFilter !== 'all-files' && filterTypeMap[this.activeFilter] !== type) {
if (this.activeFilter !== 'all-files' && this.activeFilter !== 'recent-files' && filterTypeMap[this.activeFilter] !== type) { return [];
files = [];
} }
return files; return files;
@ -454,7 +326,7 @@ export default {
getFilePreviewImage(type, file) { getFilePreviewImage(type, file) {
switch (type) { switch (type) {
case 'image': case 'image':
return this.getFullFileUrl(file.file_path); return this.getFullFileUrl(file.image);
case 'pdf': case 'pdf':
return 'https://cdn-icons-png.flaticon.com/512/337/337946.png'; return 'https://cdn-icons-png.flaticon.com/512/337/337946.png';
case 'video': case 'video':
@ -462,18 +334,19 @@ export default {
case 'glb': case 'glb':
return require('@/assets/img/3d icon.jpg'); return require('@/assets/img/3d icon.jpg');
case 'other': 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: default:
return ''; return '';
} }
}, },
getFullFileUrl(relativePath) { getFullFileUrl(relativePath) {
return relativePath ? `${this.baseUrl}${relativePath}` : ''; if (!relativePath) return '';
return `${this.baseUrl}${relativePath}`;
}, },
formatDate(dateString) { formatDate(dateString) {
if (!dateString) return 'نامعتبر'; if (!dateString) return '';
const date = this.parseDate(dateString); const date = new Date(dateString);
return date ? date.toLocaleDateString('fa-IR', { year: 'numeric', month: 'long', day: 'numeric' }) : 'نامعتبر'; return date.toLocaleDateString('fa-IR');
}, },
openDialog(type = 'image') { openDialog(type = 'image') {
this.currentUploadType = type; this.currentUploadType = type;
@ -482,13 +355,15 @@ export default {
closeDialog() { closeDialog() {
this.isNewFileDialogOpen = false; this.isNewFileDialogOpen = false;
}, },
openPreviewDialog(type, id, url) { openPreviewDialog(type, index, url, id) {
this.currentPreviewType = type; this.currentPreviewType = type;
this.currentPreviewIndex = id; this.currentPreviewIndex = id;
this.previewUrl = url; this.previewUrl = url;
if (type === 'video') { if (type === 'video') {
this.videoOptions.sources[0].src = url; this.videoOptions.sources[0].src = url;
} }
this.isPreviewDialogOpen = true; this.isPreviewDialogOpen = true;
}, },
closePreviewDialog() { closePreviewDialog() {
@ -500,50 +375,20 @@ export default {
async fetchUserData() { async fetchUserData() {
try { try {
const token = localStorage.getItem('token'); const token = localStorage.getItem('token');
if (!token) {
this.$router.push('/login');
return;
}
const response = await axios.get(`${this.baseUrl}/getInfo`, { const response = await axios.get(`${this.baseUrl}/getInfo`, {
headers: { headers: {
Authorization: `Token ${token}`, 'Authorization': `Token ${token}`,
}, },
}); });
const data = response.data.data || {}; this.userData = {
this.userData.files = [ ...response.data.data,
...(data.images || []).map(file => ({ others: response.data.data.others || [],
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,
})),
];
} catch (error) { } catch (error) {
if (error.response?.status === 401) { console.error('Error fetching user data:', error);
this.$router.push('/login'); this.userData.others = [
} else { ];
alert('خطا در بارگذاری فایل‌ها: ' + (error.response?.data?.message || error.message));
}
} }
}, },
}, },