diff --git a/public/css/app.css b/public/css/app.css index 8161d2c..268b5f9 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -81,7 +81,6 @@ --color-emerald-800: oklch(43.2% 0.095 166.913); --color-emerald-900: oklch(37.8% 0.077 168.94); --color-teal-50: oklch(98.4% 0.014 180.72); - --color-teal-100: oklch(95.3% 0.051 180.801); --color-teal-200: oklch(91% 0.096 180.426); --color-teal-300: oklch(85.5% 0.138 181.071); --color-teal-400: oklch(77.7% 0.152 181.912); @@ -165,7 +164,6 @@ --color-pink-800: oklch(45.9% 0.187 3.815); --color-pink-900: oklch(40.8% 0.153 2.432); --color-rose-50: oklch(96.9% 0.015 12.422); - --color-rose-100: oklch(94.1% 0.03 12.58); --color-rose-200: oklch(89.2% 0.058 10.001); --color-rose-300: oklch(81% 0.117 11.638); --color-rose-400: oklch(71.2% 0.194 13.428); @@ -1506,12 +1504,21 @@ .w-3 { width: calc(var(--spacing) * 3); } + .w-3\/4 { + width: calc(3/4 * 100%); + } .w-4 { width: calc(var(--spacing) * 4); } + .w-4\/6 { + width: calc(4/6 * 100%); + } .w-5 { width: calc(var(--spacing) * 5); } + .w-5\/6 { + width: calc(5/6 * 100%); + } .w-6 { width: calc(var(--spacing) * 6); } @@ -2553,9 +2560,6 @@ border-color: color-mix(in oklab, var(--color-gray-500) 40%, transparent); } } - .border-green-100 { - border-color: var(--color-green-100); - } .border-green-200 { border-color: var(--color-green-200); } @@ -2622,9 +2626,6 @@ border-color: color-mix(in oklab, var(--color-neutral-500) 40%, transparent); } } - .border-orange-100 { - border-color: var(--color-orange-100); - } .border-orange-200 { border-color: var(--color-orange-200); } @@ -2670,9 +2671,6 @@ border-color: color-mix(in oklab, var(--color-primary) 40%, transparent); } } - .border-purple-100 { - border-color: var(--color-purple-100); - } .border-purple-200 { border-color: var(--color-purple-200); } @@ -2703,9 +2701,6 @@ border-color: color-mix(in oklab, var(--color-red-500) 40%, transparent); } } - .border-rose-100 { - border-color: var(--color-rose-100); - } .border-rose-200 { border-color: var(--color-rose-200); } @@ -2766,9 +2761,6 @@ border-color: color-mix(in oklab, var(--color-stone-500) 40%, transparent); } } - .border-teal-100 { - border-color: var(--color-teal-100); - } .border-teal-200 { border-color: var(--color-teal-200); } @@ -3606,10 +3598,6 @@ --tw-gradient-from: var(--color-primary); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .from-blue-50 { - --tw-gradient-from: var(--color-blue-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } .from-blue-600 { --tw-gradient-from: var(--color-blue-600); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); @@ -3618,50 +3606,18 @@ --tw-gradient-from: var(--color-gray-100); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .from-green-50 { - --tw-gradient-from: var(--color-green-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } .from-orange-50 { --tw-gradient-from: var(--color-orange-50); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .from-purple-50 { - --tw-gradient-from: var(--color-purple-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .from-rose-50 { - --tw-gradient-from: var(--color-rose-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .from-teal-50 { - --tw-gradient-from: var(--color-teal-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } .to-\[var\(--color-secondary\)\] { --tw-gradient-to: var(--color-secondary); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .to-amber-50 { - --tw-gradient-to: var(--color-amber-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .to-cyan-50 { - --tw-gradient-to: var(--color-cyan-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } - .to-emerald-50 { - --tw-gradient-to: var(--color-emerald-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } .to-indigo-50 { --tw-gradient-to: var(--color-indigo-50); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .to-pink-50 { - --tw-gradient-to: var(--color-pink-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } .to-purple-600 { --tw-gradient-to: var(--color-purple-600); --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); @@ -3670,10 +3626,6 @@ --tw-gradient-to: transparent; --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); } - .to-violet-50 { - --tw-gradient-to: var(--color-violet-50); - --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position)); - } .bg-cover { background-size: cover; } diff --git a/public/css/service/cart.css b/public/css/service/cart.css new file mode 100644 index 0000000..16502b4 --- /dev/null +++ b/public/css/service/cart.css @@ -0,0 +1,307 @@ +/* Cart Page Styles */ +.custom-dropdown { + position: relative; + width: 100%; + z-index: 1000; +} + +.dropdown-selected { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; + border: 2px solid #e5e7eb; + border-radius: 12px; + background: white; + cursor: pointer !important; + transition: all 0.2s ease; + font-weight: 500; + user-select: none; + position: relative; + z-index: 1001; +} + +.dropdown-selected:hover, +.dropdown-selected.active { + border-color: #f66d2f; + box-shadow: 0 0 0 3px rgba(246, 109, 47, 0.1); +} + +.dropdown-options { + position: absolute; + top: 100%; + left: 0; + right: 0; + background: white; + border: 2px solid #f66d2f; + border-radius: 12px; + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); + z-index: 1002; + max-height: 200px; + overflow-y: auto; + margin-top: 4px; + display: none; +} + +.dropdown-options.show { + display: block !important; +} + +.dropdown-option { + padding: 12px 16px; + cursor: pointer !important; + transition: all 0.2s ease; + border-bottom: 1px solid #f3f4f6; + user-select: none; +} + +.dropdown-option:hover { + background: #fff5f0; + color: #f66d2f; +} + +.dropdown-option.selected { + background: #f66d2f; + color: white; +} + +.dropdown-option:last-child { + border-bottom: none; +} + +.dropdown-arrow { + transition: transform 0.2s ease; + color: #6b7280; + font-size: 12px; +} + +.dropdown-selected.active .dropdown-arrow, +.dropdown-arrow.rotate-180 { + transform: rotate(180deg); + color: #f66d2f; +} + +/* Product Feature Icons */ +.product-feature { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 8px; +} + +.product-feature-icon { + width: 20px; + height: 20px; + flex-shrink: 0; +} + +.product-feature-content { + display: flex; + align-items: center; + gap: 8px; +} + +.product-feature-label { + font-weight: 600; + color: #374151; +} + +.product-feature-value { + font-weight: 600; + color: #1e40af; +} + +.product-feature-unit { + font-size: 12px; + color: #2563eb; +} + +/* OS Selection */ +.os-group { + margin-bottom: 16px; +} + +.os-group-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 8px; +} + +.os-group-thumbnail { + width: 24px; + height: 24px; + border-radius: 4px; +} + +.os-group-name { + font-weight: 500; + color: #374151; +} + +.os-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 12px; +} + +.os-option { + position: relative; + border: 2px solid #e5e7eb; + border-radius: 12px; + padding: 12px; + font-size: 14px; + font-weight: 500; + transition: all 0.2s ease; + text-align: left; + display: flex; + align-items: center; + gap: 12px; + width: 100%; + background: white; + color: #374151; +} + +.os-option:hover { + background: #f9fafb; +} + +.os-option.selected { + border-color: #f66d2f; + background: #fff7ed; + color: #ea580c; + box-shadow: 0 0 0 3px rgba(246, 109, 47, 0.1); +} + +.os-option-thumbnail { + width: 32px; + height: 32px; + border-radius: 4px; + object-fit: cover; +} + +.os-option-content { + flex: 1; +} + +.os-option-name { + font-weight: 600; +} + +.os-option-version { + font-size: 12px; + color: #6b7280; +} + +.os-option-check { + position: absolute; + top: 4px; + right: 4px; + background: #f66d2f; + color: white; + border-radius: 50%; + padding: 2px; + width: 16px; + height: 16px; +} + +/* Empty Cart */ +.empty-cart { + text-align: center; + padding: 64px 16px; +} + +.empty-cart-icon { + width: 96px; + height: 96px; + background: #f3f4f6; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto 24px; +} + +.empty-cart-icon svg { + width: 48px; + height: 48px; + color: #9ca3af; +} + +.empty-cart-title { + font-size: 20px; + font-weight: 600; + color: #1f2937; + margin-bottom: 8px; +} + +.empty-cart-description { + color: #6b7280; + margin-bottom: 24px; +} + +.empty-cart-button { + display: inline-flex; + align-items: center; + padding: 12px 24px; + background: #2563eb; + color: white; + font-weight: 500; + border-radius: 8px; + transition: background-color 0.2s ease; +} + +.empty-cart-button:hover { + background: #1d4ed8; +} + +.empty-cart-button svg { + width: 20px; + height: 20px; + margin-right: 8px; +} + +/* Skeleton Loading Animation */ +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: .5; + } +} + +.animate-pulse { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .os-grid { + grid-template-columns: 1fr; + } + + .dropdown-options { + max-height: 150px; + } + + .product-feature { + flex-direction: column; + align-items: flex-start; + gap: 8px; + } +} + +/* Hide content until Alpine.js is ready */ +[x-cloak] { + display: none !important; +} + +/* Skeleton loading states */ +.skeleton-active { + pointer-events: none; +} + +.skeleton-active * { + pointer-events: none; +} \ No newline at end of file diff --git a/public/js/bootstrap.min.js b/public/js/bootstrap.min.js index bd3ab0a..c096b13 100644 --- a/public/js/bootstrap.min.js +++ b/public/js/bootstrap.min.js @@ -1 +1 @@ -var _0x3660d0=_0x185e;(function(_0x5d76f2,_0x5e30a3){var _0x5499e7=_0x185e,_0x1533c9=_0x5d76f2();while(!![]){try{var _0x4a869d=-parseInt(_0x5499e7(0x17e))/0x1+parseInt(_0x5499e7(0x183))/0x2+parseInt(_0x5499e7(0x17c))/0x3+parseInt(_0x5499e7(0x180))/0x4+-parseInt(_0x5499e7(0x17a))/0x5+-parseInt(_0x5499e7(0x17d))/0x6+-parseInt(_0x5499e7(0x187))/0x7*(-parseInt(_0x5499e7(0x17f))/0x8);if(_0x4a869d===_0x5e30a3)break;else _0x1533c9['push'](_0x1533c9['shift']());}catch(_0x52dc2a){_0x1533c9['push'](_0x1533c9['shift']());}}}(_0x5ca3,0x470e8),window['_']=require('lodash'),window['axios']=require('axios'),window[_0x3660d0(0x182)][_0x3660d0(0x17b)][_0x3660d0(0x185)][_0x3660d0(0x186)][_0x3660d0(0x181)]=_0x3660d0(0x184));function _0x185e(_0x2d9f1a,_0x1cdb7e){var _0x5ca3e0=_0x5ca3();return _0x185e=function(_0x185e60,_0x5d35a3){_0x185e60=_0x185e60-0x17a;var _0x599b68=_0x5ca3e0[_0x185e60];return _0x599b68;},_0x185e(_0x2d9f1a,_0x1cdb7e);}function _0x5ca3(){var _0x747f3f=['220964FVSOGu','72KsiiRy','2192688jfXCmT','X-Requested-With','axios','629452ZORcuQ','XMLHttpRequest','headers','common','213479HlxVVb','1213635LgWcnh','defaults','238671nuYnCQ','2773134ouoPQK'];_0x5ca3=function(){return _0x747f3f;};return _0x5ca3();} \ No newline at end of file +var _0x3a4a2a=_0x5239;(function(_0xa04da8,_0x337dc2){var _0x113f1b=_0x5239,_0x3b2d4b=_0xa04da8();while(!![]){try{var _0x3f5860=parseInt(_0x113f1b(0x185))/0x1*(-parseInt(_0x113f1b(0x181))/0x2)+-parseInt(_0x113f1b(0x17b))/0x3*(-parseInt(_0x113f1b(0x189))/0x4)+-parseInt(_0x113f1b(0x188))/0x5*(parseInt(_0x113f1b(0x186))/0x6)+parseInt(_0x113f1b(0x182))/0x7*(parseInt(_0x113f1b(0x183))/0x8)+parseInt(_0x113f1b(0x17f))/0x9*(-parseInt(_0x113f1b(0x17d))/0xa)+-parseInt(_0x113f1b(0x184))/0xb+parseInt(_0x113f1b(0x179))/0xc;if(_0x3f5860===_0x337dc2)break;else _0x3b2d4b['push'](_0x3b2d4b['shift']());}catch(_0x30908f){_0x3b2d4b['push'](_0x3b2d4b['shift']());}}}(_0x5b67,0x45b72),window['_']=require(_0x3a4a2a(0x17e)),window[_0x3a4a2a(0x18a)]=require(_0x3a4a2a(0x18a)),window['axios'][_0x3a4a2a(0x17c)][_0x3a4a2a(0x17a)][_0x3a4a2a(0x187)][_0x3a4a2a(0x180)]='XMLHttpRequest');function _0x5239(_0x5a866e,_0x13eede){var _0x5b67eb=_0x5b67();return _0x5239=function(_0x52397b,_0x171c15){_0x52397b=_0x52397b-0x179;var _0x3a3b5f=_0x5b67eb[_0x52397b];return _0x3a3b5f;},_0x5239(_0x5a866e,_0x13eede);}function _0x5b67(){var _0x32445e=['lodash','690786kGILbI','X-Requested-With','13532cIZrfY','1890KtrMWS','2984geXXUG','4867918JEyRIg','5PEHzrQ','33186gDMqiO','common','120iNLXsd','4HweXxB','axios','8710980oQTXiY','headers','664647ExfpZF','defaults','20fqXJnL'];_0x5b67=function(){return _0x32445e;};return _0x5b67();} \ No newline at end of file diff --git a/public/js/cart-skeleton.min.js b/public/js/cart-skeleton.min.js new file mode 100644 index 0000000..7fcdb2b --- /dev/null +++ b/public/js/cart-skeleton.min.js @@ -0,0 +1 @@ +const _0x28ab78=_0x3610;(function(_0xc6d945,_0x26b57c){const _0x50079e=_0x3610,_0x338e88=_0xc6d945();while(!![]){try{const _0x478eab=-parseInt(_0x50079e(0x144))/0x1*(parseInt(_0x50079e(0x155))/0x2)+parseInt(_0x50079e(0x13e))/0x3*(parseInt(_0x50079e(0x142))/0x4)+-parseInt(_0x50079e(0x140))/0x5+parseInt(_0x50079e(0x150))/0x6+-parseInt(_0x50079e(0x159))/0x7+parseInt(_0x50079e(0x15c))/0x8*(parseInt(_0x50079e(0x148))/0x9)+-parseInt(_0x50079e(0x146))/0xa*(-parseInt(_0x50079e(0x153))/0xb);if(_0x478eab===_0x26b57c)break;else _0x338e88['push'](_0x338e88['shift']());}catch(_0x2aa3a2){_0x338e88['push'](_0x338e88['shift']());}}}(_0x15a1,0x88c9d));function _0x15a1(){const _0x72825a=['os-selection','3915306ASCeYr','simulateAddonsLoading','querySelector','[data-skeleton-id=\x22','set','DOMContentLoaded','showMultipleSkeletons','loading','2228304XKWxwE','showSkeleton','skeleton','11hSzEBs','defaultLoadingTime','1382MIkyTX','exports','updateComponentState','undefined','6757786RbuaxP','domain-input','simulateCartLoading','8KPyKnH','product-details','addons-summary','forEach','alpine:init','_x_dataStack','cartSkeleton','plugin','isLoading','hideMultipleSkeletons','addEventListener','1297617PHiwXQ','magic','4811020xMbGvj','get','4YQRIQJ','loadingStates','283ETGvkB','hideSkeleton','14444830iVoUmt'];_0x15a1=function(){return _0x72825a;};return _0x15a1();}class CartSkeletonManager{constructor(){const _0x5be434=_0x3610;this[_0x5be434(0x143)]=new Map(),this[_0x5be434(0x154)]=0x3e8;}[_0x28ab78(0x151)](_0x52005a,_0x55c8ce=this['defaultLoadingTime']){const _0x39431c=_0x28ab78;this[_0x39431c(0x143)][_0x39431c(0x14c)](_0x52005a,!![]),this[_0x39431c(0x157)](_0x52005a,!![]),setTimeout(()=>{const _0x5aa2a7=_0x39431c;this[_0x5aa2a7(0x145)](_0x52005a);},_0x55c8ce);}['hideSkeleton'](_0x49f658){const _0x43ee4e=_0x28ab78;this['loadingStates'][_0x43ee4e(0x14c)](_0x49f658,![]),this[_0x43ee4e(0x157)](_0x49f658,![]);}['updateComponentState'](_0x194cb8,_0x492cb7){const _0x51c42f=_0x28ab78,_0x5b58e3=document['querySelector'](_0x51c42f(0x14b)+_0x194cb8+'\x22]');if(_0x5b58e3&&_0x5b58e3[_0x51c42f(0x161)]){const _0xb88ead=_0x5b58e3[_0x51c42f(0x161)][0x0];_0xb88ead&&typeof _0xb88ead[_0x51c42f(0x14f)]!==_0x51c42f(0x158)&&(_0xb88ead[_0x51c42f(0x14f)]=_0x492cb7);}}[_0x28ab78(0x14e)](_0x377227,_0x5e08d5=this['defaultLoadingTime']){const _0xc04339=_0x28ab78;_0x377227[_0xc04339(0x15f)](_0x5a7f86=>this['showSkeleton'](_0x5a7f86,_0x5e08d5));}[_0x28ab78(0x13c)](_0x48663c){const _0x845110=_0x28ab78;_0x48663c[_0x845110(0x15f)](_0x23da23=>this[_0x845110(0x145)](_0x23da23));}[_0x28ab78(0x164)](_0x393398){const _0x21d928=_0x28ab78;return this['loadingStates'][_0x21d928(0x141)](_0x393398)||![];}[_0x28ab78(0x15b)](){const _0x4bab8a=_0x28ab78,_0x4e8e0b=[_0x4bab8a(0x15a),_0x4bab8a(0x15d),_0x4bab8a(0x147),_0x4bab8a(0x15e)];this[_0x4bab8a(0x14e)](_0x4e8e0b,0x320);}['simulateOsLoading'](){const _0x47f504=_0x28ab78;this[_0x47f504(0x151)](_0x47f504(0x147),0x258);}[_0x28ab78(0x149)](){const _0x84f69a=_0x28ab78;this[_0x84f69a(0x151)]('addons-summary',0x1f4);}}window[_0x28ab78(0x162)]=new CartSkeletonManager(),document[_0x28ab78(0x13d)](_0x28ab78(0x160),()=>{const _0x240781=_0x28ab78;Alpine[_0x240781(0x163)](_0x240781(0x152),_0x13c9d7=>{const _0x48cb9d=_0x240781;_0x13c9d7[_0x48cb9d(0x13f)](_0x48cb9d(0x152),()=>({'show':(_0x1d5316,_0x40bbdb)=>window['cartSkeleton'][_0x48cb9d(0x151)](_0x1d5316,_0x40bbdb),'hide':_0x1aeb8e=>window['cartSkeleton'][_0x48cb9d(0x145)](_0x1aeb8e),'isLoading':_0x1d58c3=>window[_0x48cb9d(0x162)]['isLoading'](_0x1d58c3)}));});}),document[_0x28ab78(0x13d)](_0x28ab78(0x14d),()=>{const _0x46f35c=_0x28ab78;document[_0x46f35c(0x14a)]('[data-cart-page]')&&setTimeout(()=>{const _0x5ccaab=_0x46f35c;window['cartSkeleton'][_0x5ccaab(0x15b)]();},0x64);});function _0x3610(_0x5dd64f,_0x12b1f5){const _0x15a19b=_0x15a1();return _0x3610=function(_0x36106d,_0x31eef4){_0x36106d=_0x36106d-0x13c;let _0x57d2ee=_0x15a19b[_0x36106d];return _0x57d2ee;},_0x3610(_0x5dd64f,_0x12b1f5);}typeof module!=='undefined'&&module[_0x28ab78(0x156)]&&(module[_0x28ab78(0x156)]=CartSkeletonManager); \ No newline at end of file diff --git a/public/js/core.min.js b/public/js/core.min.js index 9a4fce0..88e18df 100644 --- a/public/js/core.min.js +++ b/public/js/core.min.js @@ -15,7 +15,7 @@ \******************************/ /***/ (() => { -eval("var sweet_loader = '
';\nfunction PaymentInvoice() {\n var invoice = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n $.ajax({\n url: ApiUserPaymentInvoice,\n data: {\n invoice: invoice\n },\n type: \"post\",\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"

Đang xử lý dữ liệu ...

\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n if (response.error === false) {\n Swal.fire({\n title: \"Payment Successfully\",\n text: \"Thanh toán hoá đơn thành công!\",\n icon: \"success\",\n confirmButtonColor: \"#3085d6\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n if (result.isConfirmed) {\n location.reload();\n }\n });\n } else {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: response.message,\n icon: \"warning\",\n showCancelButton: false,\n confirmButtonColor: \"var(--color-brand)\",\n confirmButtonText: \"Xác nhận\"\n });\n }\n }\n });\n}\n\n/* Action for VirtualMachine */\nfunction VirtualMachineAction() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var userid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n $.ajax({\n url: APIServiceAction,\n data: {\n action: action,\n product: id,\n userid: userid\n },\n type: \"post\",\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"

Đang xử lý dữ liệu ...

\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n if (response.status === false) {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: data.message,\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"var(--color-brand)\",\n cancelButtonColor: \"#818181\",\n confirmButtonText: \"Ok\"\n });\n } else {\n $('.system-status').empty().append('Đang load panel
Loading...
');\n Swal.fire({\n title: \"Thành công\",\n text: response.message,\n icon: \"success\",\n showCancelButton: false,\n confirmButtonColor: \"var(--color-brand)\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (results) {\n if (results.isConfirmed) {\n $('.append-action').empty();\n }\n });\n }\n }\n });\n}\n\n/* Append all input from Form Order to form Coupon */\nfunction loadForm(e) {\n var form = $(e).parent().parent().parent();\n var Inputs = document.querySelectorAll('[name^=\"vps[\"],[name^=\"hosting[\"]');\n Inputs.forEach(function (element) {\n var key = element.getAttribute('name');\n form.append(\"\"));\n });\n form.submit();\n}\n\n/* Change Cart when change Month */\nfunction appendChangeCart() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n /* Create new variable element */\n var ElementSubTotal = $('.cart_total_novat');\n var ElementVat = $('.cart_vat');\n var ElementTotal = $('.cart_total_amount');\n var PriceTarget = $(\"[data-focus=\\\"\".concat(target, \"_\").concat(key, \"\\\"]\"));\n\n /* Create new variable price for element SubTotal */\n var PriceSubTotal = Number(ElementSubTotal.attr('data-price'));\n\n /* Create Old variable element Product for target */\n var CartTarget = $(\"[data-product=\\\"\".concat(key, \"\\\"][data-target=\\\"\").concat(target, \"\\\"]\"));\n var OldPrice = Number(PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_price-amount\")).attr('data-price'));\n\n /* Get all Old addon total */\n var OldAddOnTotal = 0;\n var AllElementAddon = document.querySelectorAll('.name-price');\n if (AllElementAddon.length) {\n AllElementAddon.forEach(function (element) {\n OldAddOnTotal += Number($(element).attr('data-price__addon'));\n });\n }\n\n /* Config new Month */\n var ElementMonth = CartTarget.find('.time-buy__change');\n var Price = Number(ElementMonth.attr('data-price'));\n var Month = Number(ElementMonth.find('option:selected').val());\n\n /* Set new Config Month */\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_month\")).text(Month);\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_month\")).attr('data-month', Month);\n\n /* Create new variable Price */\n var TotalAddon = SumTotalAddon();\n var SubTotalPrice = PriceSubTotal - OldPrice - OldAddOnTotal + (Price * Month + TotalAddon);\n var VAT = SubTotalPrice * 0.1;\n var Total = SubTotalPrice + VAT;\n\n /* Config new price to all element */\n\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_price-amount\")).attr('data-price', Price * Month);\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_price-amount\")).text((Price * Month).toLocaleString());\n ElementSubTotal.attr('data-price', SubTotalPrice);\n ElementSubTotal.text(SubTotalPrice.toLocaleString());\n ElementVat.attr('data-price', VAT);\n ElementVat.text(VAT.toLocaleString());\n ElementTotal.attr('data-price', Total);\n ElementTotal.text(Total.toLocaleString());\n}\n\n/* Change Cart when change Addon */\nfunction appendAddonCart() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var price = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var quantity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"-\";\n var parent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n var parent_target = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : '';\n var parentTarget = $(\"[data-focus=\\\"\".concat(parent_target, \"_\").concat(parent, \"\\\"]\")).find('.box-add__on');\n if (quantity === 0) {\n var service_element = $(\"div[data-target=\\\"\".concat(parent_target, \"\\\"][data-product=\\\"\").concat(parent, \"\\\"]\"));\n if (parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target))) {\n parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target)).remove();\n }\n if (Number(service_element.find('.input-qty[data-name=\"cpu\"]').val()) === 0 && Number(service_element.find('.input-qty[data-name=\"ssd\"]').val()) === 0 && Number(service_element.find('.input-qty[data-name=\"ram\"]').val()) === 0) {\n parentTarget.addClass('d-none');\n }\n appendChangeCart(parent_target, parent);\n return false;\n }\n parentTarget.removeClass('d-none');\n if (parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target))) {\n parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target)).remove();\n }\n var html = \"
\");\n html += \"
\".concat(target.toLocaleUpperCase(), \"
\");\n html += \"
\";\n html += \"
\";\n html += \"\";\n html += \"\");\n html += (price * quantity).toLocaleString();\n html += \"đ\";\n html += \"
\";\n html += \"
X \";\n html += quantity;\n html += \"
\";\n html += \"
\";\n html += \"
\";\n parentTarget.append(html);\n appendChangeCart(parent_target, parent);\n}\n\n/* Sum total addon */\nfunction SumTotalAddon() {\n /* Get all Element Producht */\n var total = 0;\n var allProduct = document.querySelectorAll('.name-price');\n if (allProduct.length) {\n allProduct.forEach(function (element) {\n var price = 0;\n var variable = $(element);\n var target = variable.attr('data-focus');\n var boxHasElementAddon = variable.find('.addon-price .price-amount');\n var Month = Number(variable.find(\".\".concat(target, \"_month\")).attr('data-month'));\n if (boxHasElementAddon.length) {\n boxHasElementAddon.each(function (index, element) {\n var AddonPrice = $(element).find('span').attr('data-price');\n price += Number(AddonPrice) * Month;\n });\n }\n variable.attr('data-price__addon', price);\n total += price;\n });\n }\n return Number(total);\n}\n\n/* Append Os Group to Element*/\nfunction appendOsGroup() {\n $(\"#os_group_id\").empty().append('');\n $.get(APIGetOsGroup, {\n host: $('input[name=\"host_id\"]').val()\n }, function (response) {\n if (response.error === false) {\n var html = '';\n response.data.forEach(function (element) {\n html += \"\");\n });\n $(\"#os_group_id\").empty().append(html);\n } else {\n $(\"#os_group_id\").empty().append('');\n }\n });\n}\n\n/* Append Element */\nfunction appendChild() {\n var apiUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n $(\"#\".concat(id)).empty().append('');\n $.get(apiUrl, data, function (response) {\n if (response.error === false) {\n var html = '';\n response.data.forEach(function (element) {\n html += \"\");\n });\n $(\"#\".concat(id)).empty().append(html);\n } else {\n $(\"#\".concat(id)).empty().append('');\n }\n }).fail(function (error) {\n toastr.error(error.statusText);\n });\n}\n\n/* Append Snapshot */\nfunction appendSnapshot() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var userid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n Swal.fire({\n html: sweet_loader + \"

Đang xử lý dữ liệu ...

\",\n showConfirmButton: false\n });\n $.get(APIGetSnapshot, {\n product: product,\n user: userid\n }).done(function (response) {\n Swal.close();\n if ($('body').find('#staticBackdrop').length) {\n $('body').find('#staticBackdrop').remove();\n }\n $('.append-action').after(response.data);\n $('#staticBackdrop').addClass('show');\n })[\"catch\"]();\n}\n\n/* Action Snap */\nfunction SnapshotAction() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var userid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var action = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var snap = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n $('body').find('#staticBackdrop').remove();\n Swal.fire({\n html: sweet_loader + \"

Đang xử lý dữ liệu ...

\",\n showConfirmButton: false\n });\n $.post(APIServiceSnapShot, {\n product: product,\n userid: userid,\n action: action,\n snap: snap\n }).done(function (response) {\n if (response.status === false) {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: data.message,\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"var(--color-brand)\",\n cancelButtonColor: \"#818181\",\n confirmButtonText: \"Ok\"\n });\n } else {\n window.Echo.channel('Notification').listen('.Notification-Event', function (response) {\n Swal.close();\n if (response.status) {\n Swal.fire({\n title: \"Thành công\",\n text: response.message,\n icon: \"success\",\n showCancelButton: false,\n confirmButtonColor: \"var(--color-brand)\",\n confirmButtonText: \"Xác nhận\"\n });\n } else {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: response.message,\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"var(--color-brand)\",\n cancelButtonColor: \"#818181\",\n confirmButtonText: \"Ok\"\n });\n }\n });\n }\n })[\"catch\"](function (response) {});\n}\n\n/* Append Upgrade System */\nfunction appendUpgradeForm() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n Swal.fire({\n html: sweet_loader + \"

Đang xử lý dữ liệu ...

\",\n showConfirmButton: false\n });\n $.get(APIGetProductAddon, {\n product: product\n }).done(function (response) {\n Swal.close();\n var body = $('body');\n body.find('#upgrade').length ? body.find('#upgrade').remove() : \"\";\n $('.append-action').after(response.data);\n $('#upgrade').addClass('show');\n })[\"catch\"](function (response) {\n console.log(response);\n });\n}\n\n/* Addon Change Form Upgrade */\n\nfunction appendAddon(parent) {\n var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var price = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '-';\n var quantity = Number(parent.find('.input-qty').val());\n var OldPrice = price * quantity;\n if (type === '-') {\n quantity -= step;\n } else {\n quantity += step;\n }\n parent.find('.input-qty').val(quantity <= 0 ? 0 : quantity);\n var html = \"\\n
\\n \\n \").concat(item.toLocaleUpperCase(), \"\\n \\n \\n \\n \").concat((quantity * price).toLocaleString(), \"\\u0111\\n \\n \\n
\");\n var body = $('body');\n body.find(\"#upgrade .col-md-5 .box-add__on #\".concat(item)).remove();\n if (quantity <= 0) {\n actionChangePriceUpgrade(price, quantity, step, type, OldPrice);\n return false;\n }\n actionChangePriceUpgrade(price, quantity, step, type, OldPrice);\n body.find('#upgrade .col-md-5 .box-add__on hr').before(html);\n}\nfunction actionChangePriceUpgrade() {\n var price = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var quantity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var oldPrice = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n if (quantity < 0) {\n return false;\n }\n var body = $('body');\n var TotalNoVal = body.find('#upgrade .cart_total_novat');\n var VAT = body.find('#upgrade .cart_vat');\n var Total = body.find('#upgrade .cart_total_amount');\n var Billing = Number(body.find('#upgrade input[name=\"billing\"]').val());\n\n /* ============================================== */\n var TotalNoValPrice = Number(TotalNoVal.attr('data-price'));\n var VATPrice = Number(VAT.attr('data-price'));\n var TotalPrice = Number(Total.attr('data-price'));\n /* ============================================== */\n\n if (type === '-') {\n TotalNoValPrice = TotalNoValPrice - oldPrice * Billing + price * quantity * Billing;\n if (TotalNoValPrice <= 0) {\n TotalNoValPrice = 0;\n }\n VATPrice = TotalNoValPrice * 0.1;\n TotalPrice = TotalNoValPrice + VATPrice;\n } else {\n TotalNoValPrice = TotalNoValPrice - oldPrice * Billing + price * quantity * Billing;\n VATPrice = TotalNoValPrice * 0.1;\n TotalPrice = TotalNoValPrice + VATPrice;\n }\n TotalNoVal.attr('data-price', TotalNoValPrice);\n TotalNoVal.text(TotalNoValPrice.toLocaleString());\n VAT.attr('data-price', VATPrice);\n VAT.text(VATPrice.toLocaleString());\n Total.attr('data-price', TotalPrice);\n Total.text(TotalPrice.toLocaleString());\n}\nfunction OrderAddon() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var billing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var body = $('body');\n var allItem = body.find('#upgrade .input-qty');\n var error = [];\n var addon = {};\n if (allItem.length) {\n allItem.each(function (index, object) {\n if (Number(object.value) === 0) {\n error.push(object.name);\n }\n addon[\"\".concat(object.name)] = {\n price: object.getAttribute('data-price'),\n quantity: object.value\n };\n });\n }\n if (error.length === 3) {\n error.forEach(function (element) {\n body.find(\"#upgrade .input-qty[name=\\\"\".concat(element, \"\\\"]\")).addClass('error');\n });\n return false;\n }\n Swal.fire({\n title: \"Chú ý?\",\n text: \"Trong quá trình nâng cấp, Chúng tôi sẽ tắt máy chủ của bạn!\",\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n if (result.isConfirmed) {\n $.ajax({\n url: APICartAddon,\n data: {\n addon: addon,\n product: product,\n billing: billing\n },\n type: 'post',\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"

Đang xử lý dữ liệu ...

\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n Swal.close();\n if (response.error === false) {\n Swal.fire({\n title: \"Đặt hàng thành công\",\n text: response.message,\n icon: \"success\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n $('body').find('#upgrade').remove();\n });\n } else {\n Swal.fire({\n icon: \"error\",\n title: \"Oops...\",\n text: response.message\n });\n }\n }\n });\n }\n });\n}\nfunction RenewService() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var billing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n Swal.fire({\n title: \"Chú ý?\",\n text: \"Bạn đang yêu cầu gia hạn dịch vụ!\",\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n if (result.isConfirmed) {\n $.ajax({\n url: APIRenewService,\n data: {\n type: type,\n product: product,\n billing: billing\n },\n type: 'post',\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"

Đang xử lý dữ liệu ...

\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n Swal.close();\n if (response.error === false) {\n Swal.fire({\n title: \"Success\",\n text: response.message,\n icon: \"success\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n $('#renew').modal('hide');\n });\n } else {\n Swal.fire({\n icon: \"error\",\n title: \"Oops...\",\n text: response.message\n });\n }\n }\n });\n }\n });\n}\nfunction CopyDiscount() {\n var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tempTextarea = $('