diff --git a/backend/Dockerfile b/backend/Dockerfile index 047904a7..fb64ee84 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,5 @@ # Build stage +# Image: code.cannabrands.app/creationshop/dispensary-scraper FROM node:20-slim AS builder WORKDIR /app @@ -49,6 +50,9 @@ COPY --from=builder /app/dist ./dist # Create local images directory for when MinIO is not configured RUN mkdir -p /app/public/images/products +# Copy static downloads (plugin files, etc.) +COPY public/downloads /app/public/downloads + EXPOSE 3010 CMD ["node", "dist/index.js"] diff --git a/backend/public/downloads/crawlsy-menus-1.3.0.zip b/backend/public/downloads/crawlsy-menus-1.3.0.zip new file mode 100644 index 00000000..2f92c50d Binary files /dev/null and b/backend/public/downloads/crawlsy-menus-1.3.0.zip differ diff --git a/backend/src/index.ts b/backend/src/index.ts index 8f1abbba..ddcdfc01 100755 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -18,6 +18,10 @@ app.use(express.json()); const LOCAL_IMAGES_PATH = process.env.LOCAL_IMAGES_PATH || '/app/public/images'; app.use('/images', express.static(LOCAL_IMAGES_PATH)); +// Serve static downloads (plugin files, etc.) +const LOCAL_DOWNLOADS_PATH = process.env.LOCAL_DOWNLOADS_PATH || '/app/public/downloads'; +app.use('/downloads', express.static(LOCAL_DOWNLOADS_PATH)); + app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString() }); }); diff --git a/wordpress-plugin/assets/css/dutchie-menus.css b/wordpress-plugin/assets/css/crawlsy-menus.css similarity index 74% rename from wordpress-plugin/assets/css/dutchie-menus.css rename to wordpress-plugin/assets/css/crawlsy-menus.css index 01e3e1a9..3a9c924f 100644 --- a/wordpress-plugin/assets/css/dutchie-menus.css +++ b/wordpress-plugin/assets/css/crawlsy-menus.css @@ -1,53 +1,53 @@ /** - * Dutchie Menus - WordPress Plugin Styles + * Crawlsy Menus - WordPress Plugin Styles */ /* Product Grid */ -.dutchie-product-grid { +.crawlsy-product-grid { display: grid; gap: 24px; margin: 20px 0; } -.dutchie-grid-cols-2 { +.crawlsy-grid-cols-2 { grid-template-columns: repeat(2, 1fr); } -.dutchie-grid-cols-3 { +.crawlsy-grid-cols-3 { grid-template-columns: repeat(3, 1fr); } -.dutchie-grid-cols-4 { +.crawlsy-grid-cols-4 { grid-template-columns: repeat(4, 1fr); } -.dutchie-grid-cols-6 { +.crawlsy-grid-cols-6 { grid-template-columns: repeat(6, 1fr); } @media (max-width: 1024px) { - .dutchie-grid-cols-4, - .dutchie-grid-cols-6 { + .crawlsy-grid-cols-4, + .crawlsy-grid-cols-6 { grid-template-columns: repeat(3, 1fr); } } @media (max-width: 768px) { - .dutchie-grid-cols-3, - .dutchie-grid-cols-4, - .dutchie-grid-cols-6 { + .crawlsy-grid-cols-3, + .crawlsy-grid-cols-4, + .crawlsy-grid-cols-6 { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 480px) { - .dutchie-product-grid { + .crawlsy-product-grid { grid-template-columns: 1fr; } } /* Product Card */ -.dutchie-product-card { +.crawlsy-product-card { background: #fff; border-radius: 8px; overflow: hidden; @@ -57,32 +57,32 @@ flex-direction: column; } -.dutchie-product-card:hover { +.crawlsy-product-card:hover { transform: translateY(-4px); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); } -.dutchie-product-image { +.crawlsy-product-image { width: 100%; aspect-ratio: 1; overflow: hidden; background: #f5f5f5; } -.dutchie-product-image img { +.crawlsy-product-image img { width: 100%; height: 100%; object-fit: cover; } -.dutchie-product-content { +.crawlsy-product-content { padding: 16px; flex: 1; display: flex; flex-direction: column; } -.dutchie-product-title { +.crawlsy-product-title { font-size: 18px; font-weight: 600; margin: 0 0 8px 0; @@ -90,48 +90,48 @@ line-height: 1.4; } -.dutchie-product-brand { +.crawlsy-product-brand { font-size: 14px; color: #666; margin-bottom: 8px; } -.dutchie-product-description { +.crawlsy-product-description { font-size: 14px; color: #666; line-height: 1.6; margin: 0 0 12px 0; } -.dutchie-product-meta { +.crawlsy-product-meta { display: flex; flex-wrap: wrap; gap: 12px; margin: 12px 0; } -.dutchie-meta-item { +.crawlsy-meta-item { font-size: 13px; padding: 4px 10px; border-radius: 4px; background: #f0f0f0; } -.dutchie-meta-item strong { +.crawlsy-meta-item strong { color: #333; } -.dutchie-thc { +.crawlsy-thc { background: #e8f5e9; color: #2e7d32; } -.dutchie-cbd { +.crawlsy-cbd { background: #e3f2fd; color: #1565c0; } -.dutchie-product-price { +.crawlsy-product-price { font-size: 20px; font-weight: 700; color: #2e7d32; @@ -139,7 +139,7 @@ padding-top: 12px; } -.dutchie-out-of-stock { +.crawlsy-out-of-stock { display: inline-block; padding: 6px 12px; background: #ffebee; @@ -151,7 +151,7 @@ } /* Single Product */ -.dutchie-single-product { +.crawlsy-single-product { background: #fff; border-radius: 8px; padding: 24px; @@ -159,25 +159,25 @@ margin: 20px 0; } -.dutchie-layout-horizontal { +.crawlsy-layout-horizontal { display: grid; grid-template-columns: 400px 1fr; gap: 32px; } -.dutchie-layout-vertical { +.crawlsy-layout-vertical { display: flex; flex-direction: column; gap: 24px; } @media (max-width: 768px) { - .dutchie-layout-horizontal { + .crawlsy-layout-horizontal { grid-template-columns: 1fr; } } -.dutchie-single-product-image { +.crawlsy-single-product-image { width: 100%; aspect-ratio: 1; overflow: hidden; @@ -185,19 +185,19 @@ background: #f5f5f5; } -.dutchie-single-product-image img { +.crawlsy-single-product-image img { width: 100%; height: 100%; object-fit: cover; } -.dutchie-single-product-details { +.crawlsy-single-product-details { display: flex; flex-direction: column; gap: 16px; } -.dutchie-single-product-title { +.crawlsy-single-product-title { font-size: 28px; font-weight: 700; margin: 0; @@ -205,22 +205,22 @@ line-height: 1.3; } -.dutchie-single-product-brand { +.crawlsy-single-product-brand { font-size: 16px; color: #666; } -.dutchie-single-product-brand strong { +.crawlsy-single-product-brand strong { color: #333; } -.dutchie-single-product-description { +.crawlsy-single-product-description { font-size: 16px; line-height: 1.6; color: #555; } -.dutchie-single-product-info { +.crawlsy-single-product-info { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; @@ -229,44 +229,44 @@ border-radius: 8px; } -.dutchie-info-item { +.crawlsy-info-item { display: flex; flex-direction: column; gap: 4px; } -.dutchie-info-item strong { +.crawlsy-info-item strong { font-size: 14px; color: #333; text-transform: uppercase; letter-spacing: 0.5px; } -.dutchie-info-item span { +.crawlsy-info-item span { font-size: 16px; color: #555; } -.dutchie-info-item.dutchie-terpenes span, -.dutchie-info-item.dutchie-effects span, -.dutchie-info-item.dutchie-flavors span { +.crawlsy-info-item.crawlsy-terpenes span, +.crawlsy-info-item.crawlsy-effects span, +.crawlsy-info-item.crawlsy-flavors span { font-size: 14px; } -.dutchie-single-product-price { +.crawlsy-single-product-price { font-size: 32px; font-weight: 700; color: #2e7d32; } /* Loading State */ -.dutchie-loading { +.crawlsy-loading { text-align: center; padding: 40px; color: #666; } -.dutchie-loading:after { +.crawlsy-loading:after { content: "..."; animation: dots 1.5s steps(4, end) infinite; } @@ -293,7 +293,7 @@ } /* Error State */ -.dutchie-error { +.crawlsy-error { padding: 16px; background: #ffebee; color: #c62828; diff --git a/wordpress-plugin/assets/js/dutchie-menus.js b/wordpress-plugin/assets/js/crawlsy-menus.js similarity index 91% rename from wordpress-plugin/assets/js/dutchie-menus.js rename to wordpress-plugin/assets/js/crawlsy-menus.js index 33394bc5..4d225889 100644 --- a/wordpress-plugin/assets/js/dutchie-menus.js +++ b/wordpress-plugin/assets/js/crawlsy-menus.js @@ -1,5 +1,5 @@ /** - * Dutchie Menus - WordPress Plugin JavaScript + * Crawlsy Menus - WordPress Plugin JavaScript */ (function($) { @@ -24,7 +24,7 @@ }); }); - document.querySelectorAll('.dutchie-product-image img[data-src]').forEach(img => { + document.querySelectorAll('.crawlsy-product-image img[data-src]').forEach(img => { imageObserver.observe(img); }); } @@ -48,7 +48,7 @@ threshold: 0.1 }); - document.querySelectorAll('.dutchie-product-card').forEach(card => { + document.querySelectorAll('.crawlsy-product-card').forEach(card => { cardObserver.observe(card); }); } diff --git a/wordpress-plugin/dutchie-menus.php b/wordpress-plugin/crawlsy-menus.php similarity index 70% rename from wordpress-plugin/dutchie-menus.php rename to wordpress-plugin/crawlsy-menus.php index 36fa3122..f4ce3585 100644 --- a/wordpress-plugin/dutchie-menus.php +++ b/wordpress-plugin/crawlsy-menus.php @@ -1,13 +1,13 @@ register(new \Dutchie_Menus_Product_Grid_Widget()); - $widgets_manager->register(new \Dutchie_Menus_Single_Product_Widget()); + $widgets_manager->register(new \Crawlsy_Menus_Product_Grid_Widget()); + $widgets_manager->register(new \Crawlsy_Menus_Single_Product_Widget()); } /** @@ -67,17 +70,17 @@ class Dutchie_Menus_Plugin { */ public function enqueue_scripts() { wp_enqueue_style( - 'dutchie-menus-styles', - DUTCHIE_MENUS_PLUGIN_URL . 'assets/css/dutchie-menus.css', + 'crawlsy-menus-styles', + CRAWLSY_MENUS_PLUGIN_URL . 'assets/css/crawlsy-menus.css', [], - DUTCHIE_MENUS_VERSION + CRAWLSY_MENUS_VERSION ); wp_enqueue_script( - 'dutchie-menus-script', - DUTCHIE_MENUS_PLUGIN_URL . 'assets/js/dutchie-menus.js', + 'crawlsy-menus-script', + CRAWLSY_MENUS_PLUGIN_URL . 'assets/js/crawlsy-menus.js', ['jquery'], - DUTCHIE_MENUS_VERSION, + CRAWLSY_MENUS_VERSION, true ); } @@ -87,10 +90,10 @@ class Dutchie_Menus_Plugin { */ public function add_admin_menu() { add_menu_page( - 'Dutchie Menus', - 'Dutchie Menus', + 'Crawlsy Menus', + 'Crawlsy Menus', 'manage_options', - 'dutchie-menus', + 'crawlsy-menus', [$this, 'admin_page'], 'dashicons-products', 30 @@ -101,7 +104,13 @@ class Dutchie_Menus_Plugin { * Register Plugin Settings */ public function register_settings() { - register_setting('dutchie_menus_settings', 'dutchie_api_token'); + register_setting('crawlsy_menus_settings', 'crawlsy_api_token'); + + // Migrate old setting if exists + $old_token = get_option('dutchie_api_token'); + if ($old_token && !get_option('crawlsy_api_token')) { + update_option('crawlsy_api_token', $old_token); + } } /** @@ -110,19 +119,19 @@ class Dutchie_Menus_Plugin { public function admin_page() { ?>
-

Dutchie Menus Settings

-

Version by Creationshop

+

Crawlsy Menus Settings

+

Version by Creationshop

- - + + - + @@ -141,8 +150,8 @@ class Dutchie_Menus_Plugin {
-

Your authentication token from the admin dashboard. The token includes your store configuration.