Compare commits

..

3 Commits

Author SHA1 Message Date
liqianjin fa79136adc 【增加】产品状态名称修改 2023-08-11 15:16:23 +08:00
liqianjin 1713d0712c 【增加】视频播放装修
【增加】复制商品
【增加】商品长宽高参数
【增加】合并到第三方主版本分支,更新到最新版本
2023-08-11 13:56:05 +08:00
liqianjin 4f1beb97d9 【增加】视频播放装修
【增加】复制商品
【增加】商品长宽高参数
【增加】合并到第三方主版本分支,更新到最新版本
2023-08-11 13:55:00 +08:00
32 changed files with 647 additions and 877 deletions

View File

@ -20,7 +20,7 @@ class DesignController extends Controller
$data = [ $data = [
'editors' => [ 'editors' => [
'editor-slide_show', 'editor-image401', 'editor-tab_product', 'editor-product', 'editor-image100', 'editor-slide_show', 'editor-image401', 'editor-tab_product', 'editor-product', 'editor-image100',
'editor-brand', 'editor-icons', 'editor-rich_text', 'editor-image200', 'editor-image300', 'editor-brand', 'editor-icons', 'editor-rich_text', 'editor-image200', 'editor-image300','editor-slide_show_video',
], ],
'design_settings' => system_setting('base.design_setting'), 'design_settings' => system_setting('base.design_setting'),
]; ];

View File

@ -118,6 +118,22 @@ class ProductController extends Controller
} }
} }
public function copy(ProductRequest $request, Product $product)
{
try {
$product = (new ProductService)->copy($product);
$data = [
'product' => $product,
];
hook_action('admin.product.copy.after', $data);
return json_success(trans('common.copy_success'), []);
} catch (\Exception $e) {
return json_encode($e->getMessage());
}
}
public function destroy(Request $request, Product $product) public function destroy(Request $request, Product $product)
{ {
$product->delete(); $product->delete();

View File

@ -19,6 +19,7 @@ use Beike\Admin\View\Components\Form\InputLocale;
use Beike\Admin\View\Components\Form\RichText; use Beike\Admin\View\Components\Form\RichText;
use Beike\Admin\View\Components\Form\Select; use Beike\Admin\View\Components\Form\Select;
use Beike\Admin\View\Components\Form\SwitchRadio; use Beike\Admin\View\Components\Form\SwitchRadio;
use Beike\Admin\View\Components\Form\SwitchRadioStatus;
use Beike\Admin\View\Components\Form\Textarea; use Beike\Admin\View\Components\Form\Textarea;
use Beike\Admin\View\Components\Header; use Beike\Admin\View\Components\Header;
use Beike\Admin\View\Components\NoData; use Beike\Admin\View\Components\NoData;
@ -139,6 +140,7 @@ class AdminServiceProvider extends ServiceProvider
'alert' => Alert::class, 'alert' => Alert::class,
'form-input-locale' => InputLocale::class, 'form-input-locale' => InputLocale::class,
'form-switch' => SwitchRadio::class, 'form-switch' => SwitchRadio::class,
'form-switch-status' => SwitchRadioStatus::class,
'form-input' => Input::class, 'form-input' => Input::class,
'form-select' => Select::class, 'form-select' => Select::class,
'form-image' => Image::class, 'form-image' => Image::class,

View File

@ -214,6 +214,7 @@ Route::prefix($adminName)
Route::middleware('can:products_index')->get('products', [Controllers\ProductController::class, 'index'])->name('products.index'); Route::middleware('can:products_index')->get('products', [Controllers\ProductController::class, 'index'])->name('products.index');
Route::middleware('can:products_create')->get('products/create', [Controllers\ProductController::class, 'create'])->name('products.create'); Route::middleware('can:products_create')->get('products/create', [Controllers\ProductController::class, 'create'])->name('products.create');
Route::middleware('can:products_create')->post('products', [Controllers\ProductController::class, 'store'])->name('products.store'); Route::middleware('can:products_create')->post('products', [Controllers\ProductController::class, 'store'])->name('products.store');
Route::middleware('can:products_copy')->post('products/{product}/copy', [Controllers\ProductController::class, 'copy'])->name('products.copy');
Route::middleware('can:products_show')->get('products/{product}/edit', [Controllers\ProductController::class, 'edit'])->name('products.edit'); Route::middleware('can:products_show')->get('products/{product}/edit', [Controllers\ProductController::class, 'edit'])->name('products.edit');
Route::middleware('can:products_update')->put('products/{product}', [Controllers\ProductController::class, 'update'])->name('products.update'); Route::middleware('can:products_update')->put('products/{product}', [Controllers\ProductController::class, 'update'])->name('products.update');
Route::middleware('can:products_delete')->delete('products/{product}', [Controllers\ProductController::class, 'destroy'])->name('products.destroy'); Route::middleware('can:products_delete')->delete('products/{product}', [Controllers\ProductController::class, 'destroy'])->name('products.destroy');

View File

@ -19,6 +19,28 @@ class ProductService
return $this->createOrUpdate($product, $data); return $this->createOrUpdate($product, $data);
} }
public function copy(Product $oldProduct): Product
{
$product = new Product;
$data = $oldProduct->toArray();
$data['id'] = 0;
$data['created_at'] = now();
$data['variables'] = json_encode($data['variables'],JSON_UNESCAPED_UNICODE);
$data['descriptions'] = $oldProduct->descriptions()->get()->toArray();
foreach ($data['descriptions'] as $locale => $description) {
$data['descriptions'][$description['locale']] = $description;
unset($data['descriptions'][$locale]);
}
$data['attributes'] = $oldProduct->attributes()->get()->toArray();
$data['skus'] = $oldProduct->skus()->get()->toArray();
$data['numPrices'] = $oldProduct->numPrices()->get()->toArray();
$data['categories'] = $oldProduct->categories()->get()->toArray();
$data['relations'] = $oldProduct->relations()->get()->toArray();
$data['categories'] = array_column($data['categories'],'id');
$data['relations'] = array_column($data['relations'],'id');
return $this->createOrUpdate($product, $data);
}
protected function createOrUpdate(Product $product, array $data): Product protected function createOrUpdate(Product $product, array $data): Product
{ {
$isUpdating = $product->id > 0; $isUpdating = $product->id > 0;

View File

@ -0,0 +1,26 @@
<?php
namespace Beike\Admin\View\Components\Form;
use Illuminate\View\Component;
class SwitchRadioStatus extends Component
{
public string $name;
public string $value;
public string $title;
public function __construct(string $name, string $value, string $title)
{
$this->name = $name;
$this->title = $title;
$this->value = $value;
}
public function render()
{
return view('admin::components.form.switch-radio-status');
}
}

View File

@ -0,0 +1,45 @@
<?php
/**
* Render.php
*
* @copyright 2022 beikeshop.com - All Rights Reserved
* @link https://beikeshop.com
* @author Edward Yang <yangjin@guangda.work>
* @created 2022-07-08 17:09:15
* @modified 2022-07-08 17:09:15
*/
namespace Beike\Admin\View\DesignBuilders;
use Illuminate\Contracts\View\View;
use Illuminate\View\Component;
class SlideShowVideo extends Component
{
/**
* Create a new component instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Get the view / contents that represent the component.
*
* @return View
*/
public function render(): View
{
$data['register'] = [
'code' => 'slideshow_video',
'sort' => 0,
'name' => trans('admin/design_builder.module_slideshow_video'),
'icon' => '&#xe61b;',
'style' => 'font-size: 40px;',
];
return view('admin::pages.design.module.slideshow_video', $data);
}
}

View File

@ -11,7 +11,7 @@ class Product extends Base
use HasFactory; use HasFactory;
use SoftDeletes; use SoftDeletes;
protected $fillable = ['images', 'video', 'position', 'brand_id', 'tax_class_id', 'weight', 'weight_class', 'active', 'variables', 'price_setting']; protected $fillable = ['images', 'video', 'position', 'brand_id', 'tax_class_id', 'weight', 'weight_class', 'active', 'variables', 'price_setting', 'length', 'width', 'height'];
protected $casts = [ protected $casts = [
'active' => 'boolean', 'active' => 'boolean',

View File

@ -50,6 +50,8 @@ class DesignService
$content['module_code'] = $moduleCode; $content['module_code'] = $moduleCode;
if ($moduleCode == 'slideshow') { if ($moduleCode == 'slideshow') {
return self::handleSlideShow($content); return self::handleSlideShow($content);
} elseif ($moduleCode == 'slideshow_video') {
return self::handleSlideShow($content);
} elseif (in_array($moduleCode, ['image401', 'image100', 'image200', 'image300'])) { } elseif (in_array($moduleCode, ['image401', 'image100', 'image200', 'image300'])) {
return self::handleImage401($content); return self::handleImage401($content);
} elseif ($moduleCode == 'brand') { } elseif ($moduleCode == 'brand') {

View File

@ -61,7 +61,7 @@ class CartController extends Controller
$customer = current_customer(); $customer = current_customer();
$sku = ProductSku::query() $sku = ProductSku::query()
->whereRelation('product', 'active', '=', true) // ->whereRelation('product', 'active', '=', true)
->findOrFail($skuId); ->findOrFail($skuId);
$cart = CartService::add($sku, $quantity, $customer); $cart = CartService::add($sku, $quantity, $customer);

View File

@ -57,7 +57,14 @@ class CheckoutController extends Controller
public function confirm() public function confirm()
{ {
try { try {
$data = (new CheckoutService)->confirm(); $checkoutService = new CheckoutService;
$selectedProducts = $checkoutService->selectedProducts->toArray();
foreach($selectedProducts as $product){
if($product['product']['active'] == FALSE){
return json_fail(trans('common.product_active_false'));
}
}
$data = $checkoutService->confirm();
return hook_filter('checkout.confirm.data', $data); return hook_filter('checkout.confirm.data', $data);
} catch (\Exception $e) { } catch (\Exception $e) {

View File

@ -31,7 +31,7 @@ class ProductSimple extends JsonResource
} }
$name = $this->description->name ?? ''; $name = $this->description->name ?? '';
$images = $this->images; $images = $this->images != NULL ? $this->images : [];
$data = [ $data = [
'id' => $this->id, 'id' => $this->id,

449
composer.lock generated

File diff suppressed because it is too large Load Diff

652
package-lock.json generated
View File

@ -1402,12 +1402,6 @@
"fastq": "^1.6.0" "fastq": "^1.6.0"
} }
}, },
"@socket.io/component-emitter": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
"integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
"dev": true
},
"@trysound/sax": { "@trysound/sax": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@ -1503,21 +1497,6 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/cookie": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
"integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
"dev": true
},
"@types/cors": {
"version": "2.8.13",
"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
"integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/eslint": { "@types/eslint": {
"version": "8.40.0", "version": "8.40.0",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz",
@ -2082,21 +2061,6 @@
} }
} }
}, },
"async": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"dev": true,
"requires": {
"lodash": "^4.17.14"
}
},
"async-each-series": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz",
"integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==",
"dev": true
},
"async-validator": { "async-validator": {
"version": "1.8.5", "version": "1.8.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
@ -2211,12 +2175,6 @@
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true "dev": true
}, },
"base64id": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
"integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
"dev": true
},
"batch": { "batch": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
@ -2329,12 +2287,6 @@
"integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==",
"dev": true "dev": true
}, },
"bootstrap-5.1.3": {
"version": "npm:bootstrap@5.1.3",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
"integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==",
"dev": true
},
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@ -2360,78 +2312,6 @@
"integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
"dev": true "dev": true
}, },
"browser-sync": {
"version": "2.29.3",
"resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz",
"integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==",
"dev": true,
"requires": {
"browser-sync-client": "^2.29.3",
"browser-sync-ui": "^2.29.3",
"bs-recipes": "1.3.4",
"chalk": "4.1.2",
"chokidar": "^3.5.1",
"connect": "3.6.6",
"connect-history-api-fallback": "^1",
"dev-ip": "^1.0.1",
"easy-extender": "^2.3.4",
"eazy-logger": "^4.0.1",
"etag": "^1.8.1",
"fresh": "^0.5.2",
"fs-extra": "3.0.1",
"http-proxy": "^1.18.1",
"immutable": "^3",
"localtunnel": "^2.0.1",
"micromatch": "^4.0.2",
"opn": "5.3.0",
"portscanner": "2.2.0",
"raw-body": "^2.3.2",
"resp-modifier": "6.0.2",
"rx": "4.1.0",
"send": "0.16.2",
"serve-index": "1.9.1",
"serve-static": "1.13.2",
"server-destroy": "1.0.1",
"socket.io": "^4.4.1",
"ua-parser-js": "^1.0.33",
"yargs": "^17.3.1"
}
},
"browser-sync-client": {
"version": "2.29.3",
"resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz",
"integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==",
"dev": true,
"requires": {
"etag": "1.8.1",
"fresh": "0.5.2",
"mitt": "^1.1.3"
}
},
"browser-sync-ui": {
"version": "2.29.3",
"resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz",
"integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==",
"dev": true,
"requires": {
"async-each-series": "0.1.1",
"chalk": "4.1.2",
"connect-history-api-fallback": "^1",
"immutable": "^3",
"server-destroy": "1.0.1",
"socket.io-client": "^4.4.1",
"stream-throttle": "^0.1.3"
}
},
"browser-sync-webpack-plugin": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/browser-sync-webpack-plugin/-/browser-sync-webpack-plugin-2.3.0.tgz",
"integrity": "sha512-MDvuRrTCtoL11dTdwMymo9CNJvYxJoW67gOO61cThfzHNX40S5WcBU+0bVQ86ll7r7aNpNgyzxF7RtnXMTDbyA==",
"dev": true,
"requires": {
"lodash": "^4"
}
},
"browserify-aes": { "browserify-aes": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
@ -2530,12 +2410,6 @@
"update-browserslist-db": "^1.0.10" "update-browserslist-db": "^1.0.10"
} }
}, },
"bs-recipes": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz",
"integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==",
"dev": true
},
"buffer": { "buffer": {
"version": "4.9.2", "version": "4.9.2",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
@ -2682,17 +2556,6 @@
"string-width": "^4.2.0" "string-width": "^4.2.0"
} }
}, },
"cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"clone-deep": { "clone-deep": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@ -2817,41 +2680,6 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true "dev": true
}, },
"connect": {
"version": "3.6.6",
"resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
"integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==",
"dev": true,
"requires": {
"debug": "2.6.9",
"finalhandler": "1.1.0",
"parseurl": "~1.3.2",
"utils-merge": "1.0.1"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
}
}
},
"connect-history-api-fallback": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
"integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
"dev": true
},
"consola": { "consola": {
"version": "2.15.3", "version": "2.15.3",
"resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
@ -2891,12 +2719,6 @@
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
"dev": true "dev": true
}, },
"cookie": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
"integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
"dev": true
},
"cookie-signature": { "cookie-signature": {
"version": "1.0.6", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
@ -2923,16 +2745,6 @@
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
"dev": true "dev": true
}, },
"cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"dev": true,
"requires": {
"object-assign": "^4",
"vary": "^1"
}
},
"cosmiconfig": { "cosmiconfig": {
"version": "7.1.0", "version": "7.1.0",
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
@ -3207,24 +3019,12 @@
"minimalistic-assert": "^1.0.0" "minimalistic-assert": "^1.0.0"
} }
}, },
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==",
"dev": true
},
"detect-node": { "detect-node": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
"integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"dev": true "dev": true
}, },
"dev-ip": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz",
"integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==",
"dev": true
},
"diffie-hellman": { "diffie-hellman": {
"version": "5.0.3", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
@ -3333,24 +3133,6 @@
"integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true "dev": true
}, },
"easy-extender": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz",
"integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==",
"dev": true,
"requires": {
"lodash": "^4.17.10"
}
},
"eazy-logger": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz",
"integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==",
"dev": true,
"requires": {
"chalk": "4.1.2"
}
},
"ee-first": { "ee-first": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@ -3417,43 +3199,6 @@
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true "dev": true
}, },
"engine.io": {
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz",
"integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==",
"dev": true,
"requires": {
"@types/cookie": "^0.4.1",
"@types/cors": "^2.8.12",
"@types/node": ">=10.0.0",
"accepts": "~1.3.4",
"base64id": "2.0.0",
"cookie": "~0.4.1",
"cors": "~2.8.5",
"debug": "~4.3.1",
"engine.io-parser": "~5.0.3",
"ws": "~8.11.0"
}
},
"engine.io-client": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz",
"integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==",
"dev": true,
"requires": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1",
"engine.io-parser": "~5.0.3",
"ws": "~8.11.0",
"xmlhttprequest-ssl": "~2.0.0"
}
},
"engine.io-parser": {
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz",
"integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==",
"dev": true
},
"enhanced-resolve": { "enhanced-resolve": {
"version": "5.14.1", "version": "5.14.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz",
@ -3831,38 +3576,6 @@
"to-regex-range": "^5.0.1" "to-regex-range": "^5.0.1"
} }
}, },
"finalhandler": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
"integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==",
"dev": true,
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.1",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.2",
"statuses": "~1.3.1",
"unpipe": "~1.0.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
}
}
},
"find-cache-dir": { "find-cache-dir": {
"version": "3.3.2", "version": "3.3.2",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
@ -3908,17 +3621,6 @@
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"dev": true "dev": true
}, },
"fs-extra": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
"integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"jsonfile": "^3.0.0",
"universalify": "^0.1.0"
}
},
"fs-monkey": { "fs-monkey": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz",
@ -4386,12 +4088,6 @@
} }
} }
}, },
"immutable": {
"version": "3.8.2",
"resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
"integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==",
"dev": true
},
"import-fresh": { "import-fresh": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@ -4503,15 +4199,6 @@
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true "dev": true
}, },
"is-number-like": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz",
"integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==",
"dev": true,
"requires": {
"lodash.isfinite": "^3.3.2"
}
},
"is-plain-obj": { "is-plain-obj": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
@ -4533,12 +4220,6 @@
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true "dev": true
}, },
"is-wsl": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
"integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
"dev": true
},
"isarray": { "isarray": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@ -4609,15 +4290,6 @@
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true "dev": true
}, },
"jsonfile": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
"integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6"
}
},
"junk": { "junk": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz",
@ -4745,12 +4417,6 @@
"integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
"dev": true "dev": true
}, },
"limiter": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz",
"integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==",
"dev": true
},
"lines-and-columns": { "lines-and-columns": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
@ -4774,44 +4440,6 @@
"json5": "^2.1.2" "json5": "^2.1.2"
} }
}, },
"localtunnel": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz",
"integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==",
"dev": true,
"requires": {
"axios": "0.21.4",
"debug": "4.3.2",
"openurl": "1.1.1",
"yargs": "17.1.1"
},
"dependencies": {
"debug": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"yargs": {
"version": "17.1.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
"integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
"dev": true,
"requires": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
}
}
}
},
"locate-path": { "locate-path": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@ -4833,12 +4461,6 @@
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"dev": true "dev": true
}, },
"lodash.isfinite": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
"integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==",
"dev": true
},
"lodash.memoize": { "lodash.memoize": {
"version": "4.1.2", "version": "4.1.2",
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@ -4981,12 +4603,6 @@
} }
} }
}, },
"mime": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
"dev": true
},
"mime-db": { "mime-db": {
"version": "1.52.0", "version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@ -5059,12 +4675,6 @@
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true "dev": true
}, },
"mitt": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz",
"integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==",
"dev": true
},
"ms": { "ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@ -5244,15 +4854,6 @@
"integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
"dev": true "dev": true
}, },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
"dev": true,
"requires": {
"ee-first": "1.1.1"
}
},
"on-headers": { "on-headers": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
@ -5299,21 +4900,6 @@
} }
} }
}, },
"openurl": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz",
"integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==",
"dev": true
},
"opn": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
"integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
"dev": true,
"requires": {
"is-wsl": "^1.1.0"
}
},
"os-browserify": { "os-browserify": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
@ -5502,16 +5088,6 @@
"find-up": "^4.0.0" "find-up": "^4.0.0"
} }
}, },
"portscanner": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz",
"integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==",
"dev": true,
"requires": {
"async": "^2.6.0",
"is-number-like": "^1.0.3"
}
},
"postcss": { "postcss": {
"version": "8.4.23", "version": "8.4.23",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz",
@ -5957,18 +5533,6 @@
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true "dev": true
}, },
"raw-body": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dev": true,
"requires": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
}
},
"readable-stream": { "readable-stream": {
"version": "2.3.8", "version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
@ -6186,33 +5750,6 @@
} }
} }
}, },
"resp-modifier": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz",
"integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==",
"dev": true,
"requires": {
"debug": "^2.2.0",
"minimatch": "^3.0.2"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
}
}
},
"retry": { "retry": {
"version": "0.13.1", "version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
@ -6253,12 +5790,6 @@
"queue-microtask": "^1.2.2" "queue-microtask": "^1.2.2"
} }
}, },
"rx": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
"integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==",
"dev": true
},
"safe-buffer": { "safe-buffer": {
"version": "5.2.1", "version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@ -6352,80 +5883,6 @@
} }
} }
}, },
"send": {
"version": "0.16.2",
"resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
"integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
"dev": true,
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.6.2",
"mime": "1.4.1",
"ms": "2.0.0",
"on-finished": "~2.3.0",
"range-parser": "~1.2.0",
"statuses": "~1.4.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
"dev": true
},
"http-errors": {
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
"integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
"dev": true,
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.0",
"statuses": ">= 1.4.0 < 2"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
"dev": true
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
"setprototypeof": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
"dev": true
},
"statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
"dev": true
}
}
},
"serialize-javascript": { "serialize-javascript": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
@ -6503,24 +5960,6 @@
} }
} }
}, },
"serve-static": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
"integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
"dev": true,
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.2",
"send": "0.16.2"
}
},
"server-destroy": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
"integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==",
"dev": true
},
"setimmediate": { "setimmediate": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
@ -6602,51 +6041,6 @@
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true "dev": true
}, },
"socket.io": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz",
"integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==",
"dev": true,
"requires": {
"accepts": "~1.3.4",
"base64id": "~2.0.0",
"debug": "~4.3.2",
"engine.io": "~6.4.1",
"socket.io-adapter": "~2.5.2",
"socket.io-parser": "~4.2.1"
}
},
"socket.io-adapter": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
"integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
"dev": true,
"requires": {
"ws": "~8.11.0"
}
},
"socket.io-client": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.1.tgz",
"integrity": "sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ==",
"dev": true,
"requires": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.2",
"engine.io-client": "~6.4.0",
"socket.io-parser": "~4.2.1"
}
},
"socket.io-parser": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz",
"integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==",
"dev": true,
"requires": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1"
}
},
"sockjs": { "sockjs": {
"version": "0.3.24", "version": "0.3.24",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
@ -6732,12 +6126,6 @@
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
"dev": true "dev": true
}, },
"statuses": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
"integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==",
"dev": true
},
"std-env": { "std-env": {
"version": "3.3.3", "version": "3.3.3",
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz",
@ -6767,16 +6155,6 @@
"xtend": "^4.0.0" "xtend": "^4.0.0"
} }
}, },
"stream-throttle": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz",
"integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==",
"dev": true,
"requires": {
"commander": "^2.2.0",
"limiter": "^1.0.5"
}
},
"string-width": { "string-width": {
"version": "4.2.3", "version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@ -6996,12 +6374,6 @@
"mime-types": "~2.1.24" "mime-types": "~2.1.24"
} }
}, },
"ua-parser-js": {
"version": "1.0.35",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz",
"integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==",
"dev": true
},
"unicode-canonical-property-names-ecmascript": { "unicode-canonical-property-names-ecmascript": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@ -7030,12 +6402,6 @@
"integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
"dev": true "dev": true
}, },
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true
},
"unpipe": { "unpipe": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@ -7492,18 +6858,6 @@
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true "dev": true
}, },
"ws": {
"version": "8.11.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
"integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
"dev": true
},
"xmlhttprequest-ssl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
"integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
"dev": true
},
"xtend": { "xtend": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@ -7561,12 +6915,6 @@
"dev": true "dev": true
} }
} }
},
"yargs-parser": {
"version": "20.2.9",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true
} }
} }
} }

View File

@ -29,7 +29,7 @@ class MenusController extends Controller
{ {
$products = ProductRepo::getBuilder( $products = ProductRepo::getBuilder(
[ [
'active' => 1, // 'active' => 1,
'sort' => 'created_at', 'sort' => 'created_at',
'order' => 'desc', 'order' => 'desc',
]) ])

View File

@ -0,0 +1,13 @@
<x-admin::form.row :title="$title">
<div class="mb-1 mt-2">
<div class="form-check form-check-inline">
<input class="form-check-input" id="{{ $name }}-1" type="radio" name="{{ $name }}" id="{{ $name }}-1" value="1" {{ $value ? 'checked' : '' }}>
<label class="form-check-label" for="{{ $name }}-1">{{ __('common.enable_status') }}</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" id="{{ $name }}-0" type="radio" name="{{ $name }}" id="{{ $name }}-0" value="0" {{ !$value ? 'checked' : '' }}>
<label class="form-check-label" for="{{ $name }}-0">{{ __('common.disable_status') }}</label>
</div>
</div>
{{ $slot }}
</x-admin::form.row>

View File

@ -0,0 +1,129 @@
<template id="module-editor-slideshow-video-template">
<div>
<div class="module-editor-row">{{ __('admin/builder.text_set_up') }}</div>
<div class="module-edit-group">
<div class="module-edit-title">{{ __('admin/builder.modules_full_screen') }}</div>
<el-switch v-model="form.full"></el-switch>
</div>
<div class="module-editor-row">{{ __('admin/builder.modules_content') }}</div>
<div class="module-edit-group">
<div class="module-edit-title">{{ __('admin/builder.modules_select_video') }}</div>
<draggable
ghost-class="dragabble-ghost"
:list="form.images"
:options="{animation: 330, handle: '.icon-rank'}"
>
<div class="pb-images-selector" v-for="(item, index) in form.images" :key="index">
<div class="selector-head" @click="itemShow(index)">
<div class="left">
<el-tooltip class="icon-rank" effect="dark" content="{{ __('admin/builder.text_drag_sort') }}" placement="left">
<i class="el-icon-rank"></i>
</el-tooltip>
<img :src="thumbnail(item.image['{{ locale() }}'], 40, 40)" class="img-responsive">
</div>
<div class="right">
<el-tooltip class="" effect="dark" content="{{ __('admin/builder.text_delete') }}" placement="left">
<div class="remove-item" @click.stop="removeImage(index)"><i class="el-icon-delete"></i></div>
</el-tooltip>
<i :class="'el-icon-arrow-'+(item.show ? 'up' : 'down')"></i>
</div>
</div>
<div :class="'pb-images-list ' + (item.show ? 'active' : '')">
<div class="pb-images-top">
<pb-image-selector v-model="item.image"></pb-image-selector>
<div class="tag">{{ __('admin/builder.text_suggested_size') }} 1920 x 600</div>
</div>
<link-selector v-model="item.link"></link-selector>
</div>
</div>
</draggable>
<div class="add-item">
<el-button type="primary" size="small" @click="addImage" icon="el-icon-circle-plus-outline">{{ __('admin/builder.text_add_video') }}</el-button>
</div>
</div>
</div>
</template>
<script type="text/javascript">
Vue.component('module-editor-slideshow-video', {
template: '#module-editor-slideshow-video-template',
props: ['module'],
data: function () {
return {
form: null
}
},
watch: {
form: {
handler: function (val) {
this.$emit('on-changed', val);
},
deep: true,
}
},
created: function () {
this.form = JSON.parse(JSON.stringify(this.module));
},
methods: {
removeImage(index) {
this.form.images.splice(index, 1);
},
itemShow(index) {
this.form.images.find((e, key) => {if (index != key) return e.show = false});
this.form.images[index].show = !this.form.images[index].show;
},
addImage() {
this.form.images.find(e => e.show = false);
this.form.images.push({image: languagesFill('catalog/demo/banner/banner-4-en.jpg'), show: true, link: {type: 'product', value:''}});
}
}
});
</script>
@push('footer-script')
<script>
register = @json($register);
// 定义模块的配置项
register.make = {
style: {
background_color: ''
},
full: true,
floor: languagesFill(''),
images: [
// {
// image: languagesFill('catalog/demo/banner/banner-4-en.jpg'),
// show: true,
// link: {
// type: 'product',
// value:''
// }
// },
{
image: languagesFill('catalog/demo/banner/banner-3-en.jpg'),
show: false,
link: {
type: 'product',
value:''
}
}
]
}
app.source.modules.push(register)
</script>
@endpush

View File

@ -94,6 +94,14 @@
<x-admin-form-input name="position" :title="__('common.sort_order')" :value="old('position', $product->position ?? '0')" /> <x-admin-form-input name="position" :title="__('common.sort_order')" :value="old('position', $product->position ?? '0')" />
<x-admin::form.row :title="__('admin/product.length_width_height')">
<div class="d-flex wp-400">
<input type="text" name="length" placeholder="" value="{{ old('weight', $product->length ?? '') }}" class="form-control" style="flex: 0 0 95px" /><div style="width: 40px;line-height: 34px;text-align:center">CM X</div>
<input type="text" name="width" placeholder="" value="{{ old('weight', $product->width ?? '') }}" class="form-control" style="flex: 0 0 95px" /><div style="width: 40px;line-height: 34px;text-align:center">CM X</div>
<input type="text" name="height" placeholder="" value="{{ old('weight', $product->height ?? '') }}" class="form-control" style="flex: 0 0 95px" /><div style="width: 30px;line-height: 34px;text-align:center">CM</div>
</div>
</x-admin::form.row>
<x-admin::form.row :title="__('admin/product.weight_text')"> <x-admin::form.row :title="__('admin/product.weight_text')">
<div class="d-flex wp-400"> <div class="d-flex wp-400">
<input type="text" name="weight" placeholder="{{ __('admin/product.weight_text') }}" value="{{ old('weight', $product->weight ?? '') }}" class="form-control" style="flex: 0 0 260px" /> <input type="text" name="weight" placeholder="{{ __('admin/product.weight_text') }}" value="{{ old('weight', $product->weight ?? '') }}" class="form-control" style="flex: 0 0 260px" />
@ -128,7 +136,7 @@
</div> </div>
</x-admin::form.row> </x-admin::form.row>
<x-admin-form-switch name="active" :title="__('common.status')" :value="old('active', $product->active ?? 1)" /> <x-admin-form-switch-status name="active" :title="__('common.status')" :value="old('active', $product->active ?? 1)" />
@hook('admin.product.edit.extra') @hook('admin.product.edit.extra')

View File

@ -135,15 +135,19 @@
<td>{{ $product['position'] }}</td> <td>{{ $product['position'] }}</td>
@if ($type != 'trashed') @if ($type != 'trashed')
<td> <td>
<div class="form-check form-switch"> {{-- <div class="form-check form-switch">--}}
<input class="form-check-input cursor-pointer" type="checkbox" role="switch" data-active="{{ $product['active'] ? true : false }}" data-id="{{ $product['id'] }}" @change="turnOnOff($event)" {{ $product['active'] ? 'checked' : '' }}> {{-- <input class="form-check-input cursor-pointer" type="checkbox" role="switch" data-active="{{ $product['active'] ? true : false }}" data-id="{{ $product['id'] }}" @change="turnOnOff($event)" {{ $product['active'] ? 'checked' : '' }}>--}}
</div> {{-- </div>--}}
<span class="{{ $product['active'] ? 'text-success' : 'text-secondary' }}">
{{ $product['active'] ? __('common.enable_status') : __('common.disable_status') }}
</span>
</td> </td>
@endif @endif
@hook('admin.product.list.column_value') @hook('admin.product.list.column_value')
<td class="text-end text-nowrap"> <td class="text-end text-nowrap">
@if ($product['deleted_at'] == '') @if ($product['deleted_at'] == '')
<a href="{{ admin_route('products.edit', [$product['id']]) }}" class="btn btn-outline-secondary btn-sm">{{ __('common.edit') }}</a> <a href="{{ admin_route('products.edit', [$product['id']]) }}" class="btn btn-outline-secondary btn-sm">{{ __('common.edit') }}</a>
<a href="javascript:void(0)" class="btn btn-outline-secondary btn-sm" @click.prevent="copyProduct({{ $loop->index }})">{{ __('common.copy') }}</a>
<a href="javascript:void(0)" class="btn btn-outline-danger btn-sm" @click.prevent="deleteProduct({{ $loop->index }})">{{ __('common.delete') }}</a> <a href="javascript:void(0)" class="btn btn-outline-danger btn-sm" @click.prevent="deleteProduct({{ $loop->index }})">{{ __('common.delete') }}</a>
@hook('admin.product.list.action') @hook('admin.product.list.action')
@else @else
@ -255,6 +259,18 @@
location = bk.objectToUrlParams(this.filter, this.url) location = bk.objectToUrlParams(this.filter, this.url)
}, },
copyProduct(index) {
const id = this.productIds[index];
this.$confirm('{{ __('common.confirm_copy') }}', '{{ __('common.text_hint') }}', {
type: 'warning'
}).then(() => {
$http.post('products/' + id + '/copy').then((res) => {
this.$message.success(res.message);
location.reload();
})
}).catch(()=>{});
},
deleteProduct(index) { deleteProduct(index) {
const id = this.productIds[index]; const id = this.productIds[index];
@ -265,7 +281,7 @@
this.$message.success(res.message); this.$message.success(res.message);
location.reload(); location.reload();
}) })
}).catch(()=>{});; }).catch(()=>{});
}, },
restoreProduct(index) { restoreProduct(index) {

View File

@ -49,6 +49,7 @@ return [
'text_suggested_size' => 'Suggested size (width x height):', 'text_suggested_size' => 'Suggested size (width x height):',
'text_word' => 'Text', 'text_word' => 'Text',
'text_add_pictures' => 'Add pictures', 'text_add_pictures' => 'Add pictures',
'text_add_video' => 'Add video',
'text_refresh_cookie' => 'Refresh Cookie', 'text_refresh_cookie' => 'Refresh Cookie',
'text_popup_hint' => 'Note: When the user clicks close, it will no longer be displayed until the browser is closed and reopened. For local testing, click "Refresh Cookie", then refresh the browser, and the pop-up window can be launched again. ', 'text_popup_hint' => 'Note: When the user clicks close, it will no longer be displayed until the browser is closed and reopened. For local testing, click "Refresh Cookie", then refresh the browser, and the pop-up window can be launched again. ',
'text_cookie_refresh_success' => 'Cookie refresh successfully, refresh the browser to see the content of the pop-up window. ', 'text_cookie_refresh_success' => 'Cookie refresh successfully, refresh the browser to see the content of the pop-up window. ',
@ -197,6 +198,7 @@ return [
'modules_content' => 'Content', 'modules_content' => 'Content',
'modules_edit_content' => 'Edit content', 'modules_edit_content' => 'Edit content',
'modules_select_image' => 'Select image', 'modules_select_image' => 'Select image',
'modules_select_video' => 'Select video',
'modules_quantity_line' => 'Display several in one line', 'modules_quantity_line' => 'Display several in one line',
'modules_please_choose' => 'Please choose', 'modules_please_choose' => 'Please choose',
'modules_choose' => 'Choose', 'modules_choose' => 'Choose',

View File

@ -14,6 +14,7 @@ return [
'module_banner' => 'Banner', 'module_banner' => 'Banner',
'module_four_image_pro' => 'For Image PRO', 'module_four_image_pro' => 'For Image PRO',
'module_slideshow' => 'Slideshow', 'module_slideshow' => 'Slideshow',
'module_slideshow_video'=> 'SlideshowVideo',
'module_tab_products' => 'Tab Products', 'module_tab_products' => 'Tab Products',
'module_product' => 'Products', 'module_product' => 'Products',
'module_icons' => 'Icons', 'module_icons' => 'Icons',

View File

@ -45,6 +45,7 @@ return [
'default_main_product' => 'Default main product', 'default_main_product' => 'Default main product',
'modify_order' => 'Double-click to modify, drag to adjust the order', 'modify_order' => 'Double-click to modify, drag to adjust the order',
'weight_text' => 'weight', 'weight_text' => 'weight',
'length_width_height' => 'Length, width and height',
'weight_class' => 'weight unit', 'weight_class' => 'weight unit',
'confirm_batch_product' => 'Are you sure you want to delete the selected products in batches? ', 'confirm_batch_product' => 'Are you sure you want to delete the selected products in batches? ',

View File

@ -22,12 +22,15 @@ return [
'deleted_success' => 'Deleted Successfully!', 'deleted_success' => 'Deleted Successfully!',
'restored_success' => 'Restore Successfully!', 'restored_success' => 'Restore Successfully!',
'updated_success' => 'Updated Successfully!', 'updated_success' => 'Updated Successfully!',
'copy_success' => 'Copy Successfully!',
'edit_success' => 'Modify Success!', 'edit_success' => 'Modify Success!',
'get_success' => 'Get Successfully!', 'get_success' => 'Get Successfully!',
'all' => 'All', 'all' => 'All',
'status' => 'Status', 'status' => 'Status',
'enable' => 'Enable', 'enable' => 'Enable',
'enable_status' => 'Ordering of products',
'disable' => 'Disable', 'disable' => 'Disable',
'disable_status' => 'Indirect ordering of products',
'enabled' => 'Enabled', 'enabled' => 'Enabled',
'disabled' => 'Disabled', 'disabled' => 'Disabled',
'home' => 'Home', 'home' => 'Home',
@ -47,12 +50,14 @@ return [
'reset' => 'Reset', 'reset' => 'Reset',
'export' => 'Export', 'export' => 'Export',
'edit' => 'Edit', 'edit' => 'Edit',
'copy' => 'Copy',
'action' => 'Action', 'action' => 'Action',
'add' => 'Add', 'add' => 'Add',
'please_choose' => 'Please Choose', 'please_choose' => 'Please Choose',
'recommend_size' => 'Recommend Size', 'recommend_size' => 'Recommend Size',
'pick_datetime' => 'Pick Datetime', 'pick_datetime' => 'Pick Datetime',
'confirm_delete' => 'You sure you want to delete it?', 'confirm_delete' => 'You sure you want to delete it?',
'confirm_copy' => 'You sure you want to copy it?',
'text_hint' => 'Hint', 'text_hint' => 'Hint',
'restore' => 'Restore', 'restore' => 'Restore',
'name' => 'Name', 'name' => 'Name',
@ -90,6 +95,7 @@ return [
'error_page' => 'The data you accessed does not exist or has been deleted~', 'error_page' => 'The data you accessed does not exist or has been deleted~',
'error_page_btn' => 'Return to previous page', 'error_page_btn' => 'Return to previous page',
'no_repeat' => 'Do not re-add', 'no_repeat' => 'Do not re-add',
'product_active_false' => 'Product active are indirect ordering of products',
'contacts' => 'Contacts', 'contacts' => 'Contacts',
'content' => 'Content', 'content' => 'Content',

View File

@ -49,6 +49,7 @@ return [
'text_suggested_size' => '建议尺寸(宽x高): ', 'text_suggested_size' => '建议尺寸(宽x高): ',
'text_word' => '文字', 'text_word' => '文字',
'text_add_pictures' => '添加图片', 'text_add_pictures' => '添加图片',
'text_add_video' => '添加视频',
'text_refresh_cookie' => '刷新 Cookie', 'text_refresh_cookie' => '刷新 Cookie',
'text_popup_hint' => '注:用户点击关闭将不再显示,直到浏览器关闭重新打开。本地测试可点击 "刷新 Cookie",后刷新浏览器,弹窗可再次启动。 ', 'text_popup_hint' => '注:用户点击关闭将不再显示,直到浏览器关闭重新打开。本地测试可点击 "刷新 Cookie",后刷新浏览器,弹窗可再次启动。 ',
'text_cookie_refresh_success' => 'Cookie 刷新成功,刷新浏览器即可看到弹窗内容。', 'text_cookie_refresh_success' => 'Cookie 刷新成功,刷新浏览器即可看到弹窗内容。',
@ -197,6 +198,7 @@ return [
'modules_content' => '内容', 'modules_content' => '内容',
'modules_edit_content' => '编辑内容', 'modules_edit_content' => '编辑内容',
'modules_select_image' => '选择图片', 'modules_select_image' => '选择图片',
'modules_select_video' => '选择视频',
'modules_quantity_line' => '一行显示几个', 'modules_quantity_line' => '一行显示几个',
'modules_please_choose' => '请选择', 'modules_please_choose' => '请选择',
'modules_choose' => '选择', 'modules_choose' => '选择',

View File

@ -14,6 +14,7 @@ return [
'module_banner' => '横幅模块', 'module_banner' => '横幅模块',
'module_four_image_pro' => '一行四图 PRO', 'module_four_image_pro' => '一行四图 PRO',
'module_slideshow' => '幻灯片模块', 'module_slideshow' => '幻灯片模块',
'module_slideshow_video'=> '视频模块',
'module_tab_products' => '选项卡商品', 'module_tab_products' => '选项卡商品',
'module_product' => '商品模块', 'module_product' => '商品模块',
'module_icons' => '图标模块', 'module_icons' => '图标模块',

View File

@ -45,6 +45,7 @@ return [
'default_main_product' => '默认主商品', 'default_main_product' => '默认主商品',
'modify_order' => '双击修改、拖动调整顺序', 'modify_order' => '双击修改、拖动调整顺序',
'weight_text' => '重量', 'weight_text' => '重量',
'length_width_height' => '长宽高',
'weight_class' => '重量单位', 'weight_class' => '重量单位',
'confirm_batch_product' => '确认要批量删除选中的商品吗?', 'confirm_batch_product' => '确认要批量删除选中的商品吗?',

View File

@ -21,12 +21,15 @@ return [
'deleted_success' => '删除成功!', 'deleted_success' => '删除成功!',
'restored_success' => '恢复成功!', 'restored_success' => '恢复成功!',
'updated_success' => '更新成功!', 'updated_success' => '更新成功!',
'copy_success' => '复制成功!',
'edit_success' => '修改成功!', 'edit_success' => '修改成功!',
'get_success' => '获取成功!', 'get_success' => '获取成功!',
'all' => '全部', 'all' => '全部',
'status' => '状态', 'status' => '状态',
'enable' => '启用', 'enable' => '启用',
'enable_status' => '直接下单产品',
'disable' => '禁用', 'disable' => '禁用',
'disable_status' => '非直接下单产品',
'enabled' => '启用', 'enabled' => '启用',
'disabled' => '禁用', 'disabled' => '禁用',
'home' => '首页', 'home' => '首页',
@ -46,12 +49,14 @@ return [
'reset' => '重置', 'reset' => '重置',
'export' => '导出', 'export' => '导出',
'edit' => '编辑', 'edit' => '编辑',
'copy' => '复制',
'action' => '操作', 'action' => '操作',
'add' => '添加', 'add' => '添加',
'please_choose' => '请选择', 'please_choose' => '请选择',
'recommend_size' => '建议尺寸', 'recommend_size' => '建议尺寸',
'pick_datetime' => '选择时间', 'pick_datetime' => '选择时间',
'confirm_delete' => '确定要删除吗?', 'confirm_delete' => '确定要删除吗?',
'confirm_copy' => '确定要复制吗?',
'text_hint' => '提示', 'text_hint' => '提示',
'restore' => '恢复', 'restore' => '恢复',
'name' => '名称', 'name' => '名称',
@ -89,6 +94,7 @@ return [
'error_page' => '您访问的数据不存在或已被删除~', 'error_page' => '您访问的数据不存在或已被删除~',
'error_page_btn' => '返回上一页', 'error_page_btn' => '返回上一页',
'no_repeat' => '请勿重新添加', 'no_repeat' => '请勿重新添加',
'product_active_false' => '产品状态为非直接下单产品',
'contacts' => '联系人', 'contacts' => '联系人',
'content' => '内容', 'content' => '内容',

View File

@ -40,6 +40,7 @@ return [
'default_main_product' => '默認主商品', 'default_main_product' => '默認主商品',
'modify_order' => '雙擊修改、拖動調整順序', 'modify_order' => '雙擊修改、拖動調整順序',
'weight_text' => '重量', 'weight_text' => '重量',
'length_width_height' => '长宽高',
'weight_class' => '重量單位', 'weight_class' => '重量單位',
'confirm_batch_product' => '確認要批量刪除選中的商品嗎? ', 'confirm_batch_product' => '確認要批量刪除選中的商品嗎? ',

View File

@ -53,4 +53,4 @@
slideshowSwiper(); slideshowSwiper();
@endif @endif
</script> </script>
</section> </section>

View File

@ -0,0 +1,61 @@
@push('header')
<script src="{{ asset('vendor/swiper/swiper-bundle.min.js') }}"></script>
<link rel="stylesheet" href="{{ asset('vendor/swiper/swiper-bundle.min.css') }}">
@endpush
<section class="module-item {{ $design ? 'module-item-design' : ''}}" id="module-{{ $module_id }}">
@include('design._partial._module_tool')
<div class="module-info mb-3 mb-md-5 {{ !$content['full'] ? 'container' : '' }}">
<div class="swiper module-swiper-{{ $module_id }} module-slideshow">
<div class="swiper-wrapper">
@foreach($content['images'] as $image)
<div class="swiper-slide">
<a href="{{ $image['link']['link'] ?: 'javascript:void(0)' }}" class="d-flex justify-content-center">
@if(in_array(pathinfo($image['image'])['extension'],['mp4']))
<video src="{{ $image['image'] }}" class="img-fluid" muted autoplay loop>
@else
<img src="{{ $image['image'] }}" class="img-fluid">
@endif
</a>
</div>
@endforeach
</div>
<div class="swiper-pagination slideshow-pagination-{{ $module_id }}"></div>
<div class="swiper-button-prev slideshow-btnprev-{{ $module_id }}"></div>
<div class="swiper-button-next slideshow-btnnext-{{ $module_id }}"></div>
</div>
</div>
<script>
function slideshowSwiper() {
new Swiper ('.module-swiper-{{ $module_id }}', {
loop: '{{ count($content['images']) > 1 ? true : false }}', // 循环模式选项
autoplay: true,
pauseOnMouseEnter: true,
clickable :true,
// 如果需要分页器
pagination: {
el: '.slideshow-pagination-{{ $module_id }}',
clickable :true
},
// 如果需要前进后退按钮
navigation: {
nextEl: '.slideshow-btnnext-{{ $module_id }}',
prevEl: '.slideshow-btnprev-{{ $module_id }}',
},
})
}
@if ($design)
bk.loadStyle('{{ asset('vendor/swiper/swiper-bundle.min.css') }}');
bk.loadScript('{{ asset('vendor/swiper/swiper-bundle.min.js') }}', () => {
slideshowSwiper();
})
@else
slideshowSwiper();
@endif
</script>
</section>

View File

@ -10,8 +10,8 @@
<script src="{{ asset('vendor/zoom/jquery.zoom.min.js') }}"></script> <script src="{{ asset('vendor/zoom/jquery.zoom.min.js') }}"></script>
<link rel="stylesheet" href="{{ asset('vendor/swiper/swiper-bundle.min.css') }}"> <link rel="stylesheet" href="{{ asset('vendor/swiper/swiper-bundle.min.css') }}">
<script src="{{ asset('vendor/element-ui/2.15.6/js.js') }}"></script> <script src="{{ asset('vendor/element-ui/index.js') }}"></script>
<link rel="stylesheet" href="{{ asset('vendor/element-ui/2.15.6/css.css') }}"> <link rel="stylesheet" href="{{ asset('vendor/element-ui/index.css') }}">
@if ($product['video']) @if ($product['video'])
<script src="{{ asset('vendor/video/video.min.js') }}"></script> <script src="{{ asset('vendor/video/video.min.js') }}"></script>
<link rel="stylesheet" href="{{ asset('vendor/video/video-js.min.css') }}"> <link rel="stylesheet" href="{{ asset('vendor/video/video-js.min.css') }}">
@ -203,6 +203,28 @@
@endif @endif
@else @else
{{-- <div class="text-danger"><i class="bi bi-exclamation-circle-fill"></i> {{ __('product.has_been_inactive') }}</div>--}} {{-- <div class="text-danger"><i class="bi bi-exclamation-circle-fill"></i> {{ __('product.has_been_inactive') }}</div>--}}
<div class="quantity-btns">
@hook('product.detail.buy.before')
@hookwrapper('product.detail.quantity.input')
<div class="quantity-wrap">
<input type="text" class="form-control" :disabled="!product.quantity" onkeyup="this.value=this.value.replace(/\D/g,'')" v-model="quantity" name="quantity">
<div class="right">
<i class="bi bi-chevron-up"></i>
<i class="bi bi-chevron-down"></i>
</div>
</div>
@endhookwrapper
@hookwrapper('product.detail.add_to_cart')
<button
class="btn btn-outline-dark ms-md-3 add-cart fw-bold"
:product-id="product.id"
:product-price="product.price"
:disabled="!product.quantity"
@click="addCart(false, this)"
><i class="bi bi-cart-fill me-1"></i>{{ __('shop/products.add_to_cart') }}
</button>
@endhookwrapper
</div>
@endif @endif
<button <button
style="width: 16em;" style="width: 16em;"

View File

@ -40,7 +40,7 @@
data-bs-placement="top" data-bs-placement="top"
title="{{ __('shop/products.add_to_cart') }}" title="{{ __('shop/products.add_to_cart') }}"
@if ($product['price_setting'] === 'num') @if ($product['price_setting'] === 'num')
onclick="bk.addCart({sku_id: '{{ $product['sku_id'] }}',quantity: {{$product['numprices'][0]['num']}} }, this)"> onclick="bk.addCart({sku_id: '{{ $product['sku_id'] }}',quantity: {{$product['numprices'] != [] ? $product['numprices'][0]['num'] : 1}} }, this)">
@else @else
onclick="bk.addCart({sku_id: '{{ $product['sku_id'] }}'}, this)"> onclick="bk.addCart({sku_id: '{{ $product['sku_id'] }}'}, this)">
@endif @endif
@ -71,7 +71,7 @@
<!--yt修改--> <!--yt修改-->
<div class="product-price"> <div class="product-price">
@if ($product['price_setting'] === 'num') @if ($product['price_setting'] === 'num')
<span class="price-new">{{$product['numprices'][0]['num']}} pieces</span> <span class="price-new">{{$product['numprices'] != [] ? $product['numprices'][0]['num'] : 1}} pieces</span>
@else @else
<span class="price-new">1 pieces</span> <span class="price-new">1 pieces</span>
@endif @endif