@feedmepos/mf-order-setting 0.0.91 → 0.0.92

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/{DisplaySystemView-n7Kqdw-h.js → DisplaySystemView-DZS7EVfk.js} +1 -1
  2. package/dist/{KioskDevicesView-Bz6seroM.js → KioskDevicesView-d2WLB0-w.js} +1 -1
  3. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-I39sE8Pe.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-rs-hNWUW.js} +3 -3
  4. package/dist/{KioskSettingView-Cajjh4Zm.js → KioskSettingView-DFE3_u5c.js} +3 -3
  5. package/dist/{KioskView-BPSbsMi5.js → KioskView-C3Pi3lWW.js} +5 -5
  6. package/dist/{OrderSettingsView-jPxZ3JDM.js → OrderSettingsView-Dxg9RjSd.js} +26999 -25299
  7. package/dist/{app-DIhv5ssA.js → app-BFlQtcsd.js} +3253 -3062
  8. package/dist/app.js +1 -1
  9. package/dist/common/order-platform/index.d.ts +20 -0
  10. package/dist/frontend/mf-order/src/api/reservation/index.d.ts +8 -0
  11. package/dist/frontend/mf-order/src/app.d.ts +84 -0
  12. package/dist/frontend/mf-order/src/main.d.ts +84 -0
  13. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -3
  14. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +3 -0
  15. package/dist/frontend/mf-order/src/views/order-settings/reservation/CopySettingsSheet.vue.d.ts +186 -0
  16. package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomTimePicker.vue.d.ts +11 -0
  17. package/dist/frontend/mf-order/src/views/order-settings/reservation/ReservationSetting.vue.d.ts +2 -0
  18. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  19. package/dist/{index-vaSLX6r3.js → index-ByiTrmdq.js} +2 -2
  20. package/dist/{index-Clp_YRJ2.js → index-CaO7aaaT.js} +1 -1
  21. package/dist/{index-CmqNrkNl.js → index-s2kWGMtz.js} +1 -1
  22. package/dist/order.dto-C829lA69.js +41528 -0
  23. package/dist/package/entity/delivery/delivery.dto.d.ts +7 -0
  24. package/dist/package/entity/food-court/food-court.dto.d.ts +315 -264
  25. package/dist/package/entity/food-court/order-v2.do.d.ts +231 -0
  26. package/dist/package/entity/food-court/order-v2.do.spec.d.ts +1 -0
  27. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +15 -6
  28. package/dist/package/entity/index.d.ts +7 -0
  29. package/dist/package/entity/index.frontend.d.ts +2 -0
  30. package/dist/package/entity/member/member.dto.d.ts +2 -2
  31. package/dist/package/entity/order/dine-in/dine-in.do.d.ts +44 -9
  32. package/dist/package/entity/order/dine-in/dine-in.dto.d.ts +17 -3
  33. package/dist/package/entity/order/menu/menu.dto.d.ts +33 -3
  34. package/dist/package/entity/order/order-item/order-item.dto.d.ts +18 -18
  35. package/dist/package/entity/order/order.do.d.ts +87 -12
  36. package/dist/package/entity/order/order.dto.d.ts +762 -358
  37. package/dist/package/entity/order/order.enum.d.ts +1 -1
  38. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +7 -0
  39. package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +7 -0
  40. package/dist/package/entity/order-platform/menu.dto.d.ts +10 -10
  41. package/dist/package/entity/order-platform/order-platform.dto.d.ts +92 -0
  42. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +7 -0
  43. package/dist/package/entity/order-platform/tng/tng-menu.do.d.ts +6 -6
  44. package/dist/package/entity/order-setting/order-setting.do.d.ts +866 -5
  45. package/dist/package/entity/order-setting/order-setting.dto.d.ts +10 -10
  46. package/dist/package/entity/order-setting/reservationV2/reservation.do.d.ts +1269 -0
  47. package/dist/package/entity/order-setting/sms/sms.do.d.ts +3 -3
  48. package/dist/package/entity/order-setting/sms/sms.dto.d.ts +3 -3
  49. package/dist/package/entity/queue/queue.dto.d.ts +175 -121
  50. package/dist/package/entity/reservation/reservation-pos.do.d.ts +222 -0
  51. package/dist/package/entity/reservation/reservation.do.d.ts +205 -0
  52. package/dist/package/entity/reservation/reservation.dto.d.ts +428 -0
  53. package/dist/package/entity/reservation/reservation.enum.d.ts +3 -0
  54. package/dist/package/entity/reservation/reservation.utils.d.ts +152 -0
  55. package/dist/package/entity/restaurant/restaurant.dto.d.ts +39 -24
  56. package/dist/package/entity/user/user.do.d.ts +2 -2
  57. package/dist/package/entity/websocket/websocket.dto.d.ts +161 -21
  58. package/dist/package/entity/websocket/websocket.enum.d.ts +1 -1
  59. package/dist/style.css +1 -1
  60. package/package.json +2 -2
  61. package/src/api/reservation/index.ts +25 -0
  62. package/src/assets/images/not-found.png +0 -0
  63. package/src/locales/en-US.json +21 -0
  64. package/src/locales/ja-JP.json +21 -0
  65. package/src/locales/th-TH.json +21 -0
  66. package/src/locales/zh-CN.json +21 -0
  67. package/src/views/order-settings/OrderSettingsView.vue +9 -2
  68. package/src/views/order-settings/delivery/delivery.spec.ts +21 -0
  69. package/src/views/order-settings/delivery/delivery.ts +2 -51
  70. package/src/views/order-settings/dine-in/DineInSetting.vue +11 -1
  71. package/src/views/order-settings/reservation/CopySettingsSheet.vue +256 -0
  72. package/src/views/order-settings/reservation/CustomTimePicker.vue +311 -0
  73. package/src/views/order-settings/reservation/ReservationSetting.vue +1549 -0
  74. package/vitest.config.ts +2 -1
  75. package/dist/order.dto-DV1qL3Q_.js +0 -40301
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .integration-details[data-v-64de12e4]{display:flex;flex-direction:column;gap:.625rem;padding:1rem;margin-top:1rem;border:1px solid #e5e7eb;border-radius:.5rem}.integration-details--owned[data-v-64de12e4]{border-color:var(--fm-color-primary-oats);box-shadow:inset .25rem 0 0 var(--fm-color-primary)}.integration-details__header[data-v-64de12e4]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem}.integration-details__title[data-v-64de12e4]{display:flex;align-items:center;gap:.375rem}.integration-details__store-label[data-v-64de12e4]{padding:.25rem .625rem;color:var(--fm-color-primary);background:var(--fm-color-primary-oats);border-radius:999px}.integration-details__row[data-v-64de12e4]{display:grid;grid-template-columns:10rem minmax(0,1fr);align-items:center;gap:1rem}.integration-details__value[data-v-64de12e4]{display:flex;min-width:0;align-items:center;gap:.5rem}.integration-details__action[data-v-64de12e4]{display:inline-flex;flex:0 0 auto}.integration-details__value>code[data-v-64de12e4]{flex:1 1 auto}.integration-details__summary[data-v-64de12e4]{display:flex;justify-content:flex-end;margin-top:.25rem}.integration-details__message[data-v-64de12e4]{max-height:9rem;overflow-y:auto;white-space:pre-wrap}code[data-v-64de12e4]{min-width:0;overflow-wrap:anywhere}@media (max-width: 460px){.integration-details__row[data-v-64de12e4]{grid-template-columns:1fr;gap:.25rem}.integration-details__header[data-v-64de12e4]{align-items:flex-start}}.store-section[data-v-64f1ea7c]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-64f1ea7c]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-64f1ea7c]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.store-card__title[data-v-64f1ea7c]{min-width:0;word-break:break-all}.store-card__actions[data-v-64f1ea7c]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-64f1ea7c]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-64f1ea7c]{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:1rem}.store-field>span[data-v-64f1ea7c]:first-child{color:var(--fm-color-neutral-gray-400)}.store-field>span[data-v-64f1ea7c]:last-child{word-break:break-word}.store-sheet-body[data-v-64f1ea7c]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}@media (max-width: 460px){.store-field[data-v-64f1ea7c]{grid-template-columns:1fr}}.store-section[data-v-fe141f25]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-fe141f25]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-fe141f25]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.25rem}.store-card__title[data-v-fe141f25]{min-width:0;word-break:break-all}.store-card__actions[data-v-fe141f25]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-fe141f25]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-fe141f25]{display:grid;grid-template-columns:9rem minmax(0,1fr);align-items:start;-moz-column-gap:1rem;column-gap:1rem;row-gap:.125rem}.store-field>span[data-v-fe141f25]:last-child{word-break:break-word}.store-sheet-body[data-v-fe141f25]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}.store-sheet-activate[data-v-fe141f25]{padding-top:1.25rem;border-top:1px solid #e5e7eb}.store-sheet-activate__hint[data-v-fe141f25]{margin-top:.5rem}@media (max-width: 460px){.store-field[data-v-fe141f25]{grid-template-columns:1fr}}.store-section[data-v-b94bbdb0]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-b94bbdb0]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-b94bbdb0]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.store-card__title[data-v-b94bbdb0]{min-width:0;word-break:break-all}.store-card__actions[data-v-b94bbdb0]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-b94bbdb0]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-b94bbdb0]{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:1rem}.store-field>span[data-v-b94bbdb0]:first-child{color:var(--fm-color-neutral-gray-400)}.store-field>span[data-v-b94bbdb0]:last-child{word-break:break-word}.store-sheet-body[data-v-b94bbdb0]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}@media (max-width: 460px){.store-field[data-v-b94bbdb0]{grid-template-columns:1fr}}[data-v-91393c58] .fm-checkbox--wrapper:has(input:disabled){pointer-events:none}[data-v-a959025e] .flex.flex-col.gap-8>:first-child,[data-v-a959025e] .flex.flex-col.gap-8>:last-child{display:none}.toggle[data-v-5266c20e]{position:relative;flex-shrink:0;width:52px;height:32px;padding:0;border:none;border-radius:9999px;background:var(--fm-color-neutral-gray-200);cursor:pointer;transition:background-color .2s ease-out}.toggle[data-v-5266c20e]:focus{outline:none}.toggle[data-v-5266c20e]:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--fm-color-primary) 40%,transparent)}.toggle--on[data-v-5266c20e]{background:var(--fm-color-primary)}.toggle__thumb[data-v-5266c20e]{position:absolute;top:50%;left:8px;width:18px;height:18px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #0003;transform:translateY(-50%);transition:all .2s ease-out}.toggle--on .toggle__thumb[data-v-5266c20e]{left:24px;width:24px;height:24px}.toggle:active .toggle__thumb[data-v-5266c20e]{transform:translateY(-50%) scale(1.1)}.delivery-company-filter-toolbar[data-v-e2763a83]{display:flex;flex-direction:row;justify-content:space-between}@media (max-width: 647px){.delivery-company-filter-toolbar[data-v-e2763a83]{flex-direction:column;flex-wrap:wrap}}.preview-frame[data-v-bd8d2976]{position:relative;width:100%;overflow:hidden;border:1px solid #d1d5db;border-radius:12px;aspect-ratio:16 / 9;background:#111827;box-shadow:0 16px 40px #0f172a1f}.preview-iframe[data-v-bd8d2976]{display:block;width:100%;height:100%;border:0;background:#f3f4f6}.preview-status[data-v-bd8d2976]{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-content:center;gap:12px;background:#f9fafbf0;color:#4b5563;text-align:center;font-size:13px}.preview-status p[data-v-bd8d2976]{margin:0}.preview-status[data-v-bd8d2976] button{justify-self:center}.preview-loading[data-v-bd8d2976]{display:grid;justify-items:center;gap:10px}.preview-loading span[data-v-bd8d2976]{width:24px;height:24px;border:3px solid #fed7aa;border-top-color:#ef661f;border-radius:50%;animation:preview-spin-bd8d2976 .8s linear infinite}@keyframes preview-spin-bd8d2976{to{transform:rotate(360deg)}}.canvas-area[data-v-cdd742c6]{position:relative;display:flex;min-width:0;min-height:0;flex-direction:column}.canvas-area-card[data-v-cdd742c6]{display:flex;flex:1;min-width:0;min-height:0;flex-direction:column;gap:8px;overflow:visible;border:1.5px dashed rgb(255 255 255 / 55%);border-radius:10px;padding:6px;background:#11182752;text-align:left}.canvas-area-card[data-v-cdd742c6]:hover{background:#1118276b}.canvas-area-active[data-v-cdd742c6]{border-style:solid;border-color:#f97316;background:#f973164d;box-shadow:0 0 0 3px #f973161f}.canvas-area-context[data-v-cdd742c6]{border-style:solid;border-color:#fed7aa;background:#fdba7433}.canvas-area-droppable[data-v-cdd742c6]{border-color:#f97316;background:#f973165c}.canvas-area-drop-over[data-v-cdd742c6]{border-style:solid;box-shadow:0 0 0 3px #f9731633}.canvas-area-head[data-v-cdd742c6]{display:flex;align-items:center;gap:8px}.canvas-area-name[data-v-cdd742c6],.canvas-area-share[data-v-cdd742c6]{color:#f9fafb;text-shadow:0 1px 3px rgb(0 0 0 / 70%);font-weight:700}.canvas-area-name[data-v-cdd742c6]{font-size:10px;letter-spacing:.06em;text-transform:uppercase}.canvas-area-share[data-v-cdd742c6]{margin-left:auto;font-size:12px;font-variant-numeric:tabular-nums}.canvas-area-remove[data-v-cdd742c6]{display:grid;flex:0 0 auto;place-items:center;border-radius:999px;padding:2px;background:#1118278c;color:#f9fafb;opacity:0;transition:opacity .1s ease}.canvas-area-remove[data-v-cdd742c6]:hover{background:#fef2f2;color:#dc2626}.canvas-edge[data-v-cdd742c6]{position:absolute;display:grid;place-items:center;width:20px;height:20px;border-radius:999px;background:#fff;box-shadow:0 0 0 1.5px #d1d5db;color:#9ca3af;opacity:0;transition:opacity .1s ease;z-index:1}.canvas-area:hover .canvas-edge[data-v-cdd742c6],.canvas-area:focus-within .canvas-edge[data-v-cdd742c6],.canvas-area:hover .canvas-area-remove[data-v-cdd742c6],.canvas-area:focus-within .canvas-area-remove[data-v-cdd742c6]{opacity:1}.canvas-edge[data-v-cdd742c6]:hover{box-shadow:0 0 0 1.5px #f97316;color:#f97316}.canvas-edge-right[data-v-cdd742c6]{top:50%;right:-10px;transform:translateY(-50%)}.canvas-edge-bottom[data-v-cdd742c6]{bottom:-10px;left:50%;transform:translate(-50%)}.canvas-chips[data-v-cdd742c6]{display:flex;min-height:0;flex:1;flex-direction:column}.canvas-chip[data-v-cdd742c6]{display:flex;align-items:center;align-self:flex-start;max-width:100%;gap:6px;border:1px solid #e5e7eb;border-radius:8px;padding:6px 8px;background:#ffffffeb;color:#374151;font-size:12px;text-align:left;cursor:grab}.canvas-chip[data-v-cdd742c6]:hover{border-color:#fdba74}.canvas-chip-active[data-v-cdd742c6]{border-color:#f97316;box-shadow:inset 4px 0 #f97316,0 0 0 3px #f973161f;font-weight:600}.canvas-chip-active .canvas-chip-grip[data-v-cdd742c6]{color:#f97316}.canvas-chip-context[data-v-cdd742c6]{border-color:#fed7aa;background:#fffdfa}.canvas-chip[data-v-cdd742c6]:active{cursor:grabbing}.canvas-chip-grip[data-v-cdd742c6]{flex:0 0 auto;color:#9ca3af}.canvas-chip-label[data-v-cdd742c6]{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-chip-swap[data-v-cdd742c6]{display:grid;flex:0 0 auto;place-items:center;margin-left:2px;border-radius:6px;padding:2px;color:#9ca3af;opacity:0;transition:opacity .1s ease}.canvas-chip:hover .canvas-chip-swap[data-v-cdd742c6],.canvas-chip:focus-within .canvas-chip-swap[data-v-cdd742c6]{opacity:1}.canvas-chip-swap[data-v-cdd742c6]:hover{background:#fff;color:#f97316}.canvas-area-empty[data-v-cdd742c6]{display:grid;flex:1;place-items:center;border:1px dashed rgb(255 255 255 / 60%);border-radius:8px;background:transparent;color:#f3f4f6;font-size:11px;font-family:inherit;cursor:pointer}.canvas-area-empty[data-v-cdd742c6]:hover{border-color:#f97316;color:#f97316}@media (hover: none),(pointer: coarse){.canvas-edge[data-v-cdd742c6],.canvas-area-remove[data-v-cdd742c6],.canvas-chip-swap[data-v-cdd742c6]{opacity:1}}.canvas[data-v-eb790981]{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;min-height:0}.canvas-row[data-v-eb790981]{flex-direction:row}.canvas-column[data-v-eb790981]{flex-direction:column}.canvas-group[data-v-eb790981]{position:relative;display:flex;min-width:0;min-height:0}.canvas-divider[data-v-eb790981]{position:absolute;z-index:2;display:grid;place-items:center;touch-action:none}.divider-vertical[data-v-eb790981]{top:0;bottom:0;width:10px;transform:translate(-50%);cursor:col-resize}.divider-horizontal[data-v-eb790981]{left:0;right:0;height:10px;transform:translateY(-50%);cursor:row-resize}.canvas-divider-grip[data-v-eb790981]{border-radius:999px;background:#d1d5db}.divider-vertical .canvas-divider-grip[data-v-eb790981]{height:34px;width:3px}.divider-horizontal .canvas-divider-grip[data-v-eb790981]{height:3px;width:34px}.canvas-divider:hover .canvas-divider-grip[data-v-eb790981]{background:#f97316}.module-picker[data-v-2892f182]{display:flex;flex-direction:column;gap:18px}.module-picker-hint[data-v-2892f182]{margin:0;color:#6b7280;font-size:12px}.module-picker-group[data-v-2892f182]{display:flex;flex-direction:column;gap:8px}.module-picker-group-label[data-v-2892f182]{margin:0;color:#9ca3af;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.module-picker-grid[data-v-2892f182]{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}.module-picker-card[data-v-2892f182]{display:flex;flex-direction:column;align-items:center;gap:8px;border:1px solid #e5e7eb;border-radius:10px;padding:14px 10px;background:#fff;color:#374151;font-size:13px;text-align:center;cursor:pointer}.module-picker-card[data-v-2892f182]:hover{border-color:#f97316;background:#fffbf5}.module-picker-icon[data-v-2892f182]{display:grid;height:36px;width:36px;place-items:center;border-radius:8px;background:#f3f4f6;color:#4b5563}.module-picker-label[data-v-2892f182]{line-height:1.3;overflow-wrap:anywhere}.media-field[data-v-839ff846]{display:flex;flex-direction:column;gap:6px}.media-label[data-v-839ff846]{color:#4b5563;font-size:12px}.media-thumb[data-v-839ff846]{height:72px;width:100%;border-radius:8px;border:1px solid #e5e7eb;-o-object-fit:cover;object-fit:cover}.media-empty[data-v-839ff846]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#9ca3af;font-size:12px}.media-warning[data-v-839ff846]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#b54708;font-size:12px}.media-actions[data-v-839ff846]{display:flex;gap:6px}.inspector[data-v-4cc442cf]{display:flex;flex-direction:column;gap:14px}.inspector-scope[data-v-4cc442cf]{align-self:stretch}.inspector-breadcrumb[data-v-4cc442cf]{display:flex;align-items:center;gap:2px;color:#6b7280;font-size:11px}.inspector-section[data-v-4cc442cf]{display:flex;flex-direction:column;gap:10px;border-top:1px solid #e5e7eb;padding-top:12px}.inspector-section-title[data-v-4cc442cf]{color:#9ca3af;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.inspector-note[data-v-4cc442cf]{color:#6b7280;font-size:11px;line-height:1.45}.inspector-warning[data-v-4cc442cf]{display:flex;align-items:flex-start;gap:6px;border-radius:8px;background:#fffbeb;padding:8px 10px;color:#92400e;font-size:12px}.inspector-list[data-v-4cc442cf]{display:flex;flex-direction:column;gap:8px}.inspector-list-head[data-v-4cc442cf]{display:flex;align-items:baseline;gap:6px}.inspector-list-count[data-v-4cc442cf]{border-radius:999px;background:#f3f4f6;padding:0 6px;color:#6b7280;font-size:10px;font-variant-numeric:tabular-nums}.inspector-item[data-v-4cc442cf]{display:flex;flex-direction:column;gap:10px;border:1px solid #e5e7eb;border-radius:10px;padding:10px;background:#fcfcfd}.inspector-item-head[data-v-4cc442cf]{display:flex;align-items:center;gap:2px}.inspector-item-name[data-v-4cc442cf]{flex:1;color:#6b7280;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.inspector-item-action[data-v-4cc442cf]{display:grid;flex:0 0 auto;place-items:center;border-radius:6px;padding:2px;color:#9ca3af}.inspector-item-action[data-v-4cc442cf]:hover:not(:disabled){background:#fff7ed;color:#f97316}.inspector-item-action[data-v-4cc442cf]:disabled{opacity:.35}.inspector-list-add[data-v-4cc442cf]{display:flex;gap:6px}.media-field[data-v-4cc442cf]{display:flex;flex-direction:column;gap:6px}.media-label[data-v-4cc442cf]{color:#4b5563;font-size:12px}.media-thumb[data-v-4cc442cf]{height:72px;width:100%;border-radius:8px;border:1px solid #e5e7eb;-o-object-fit:cover;object-fit:cover}.media-empty[data-v-4cc442cf]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#9ca3af;font-size:12px}.media-actions[data-v-4cc442cf]{display:flex;gap:6px}.editor-head[data-v-a673333e]{display:flex;shrink:0;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid #e5e7eb;padding:12px 20px}.editor-identity[data-v-a673333e]{display:flex;min-width:0;align-items:center;gap:10px}.editor-name[data-v-a673333e]{width:min(320px,40vw)}.editor-orientation[data-v-a673333e]{width:160px}.editor-error[data-v-a673333e]{flex-shrink:0;margin:12px 16px 0;border-radius:8px;background:#fef2f2;padding:8px 12px;color:#b91c1c;font-size:13px}.rail-scale[data-v-a673333e]{display:flex;flex-direction:column;gap:6px;margin-bottom:18px;border-bottom:1px solid #e5e7eb;padding-bottom:16px}.rail-scale-label[data-v-a673333e]{color:#4b5563;font-size:12px;font-weight:600}.rail-scale-hint[data-v-a673333e]{margin:0;color:#6b7280;font-size:11px;line-height:1.4}.rail-scale-warning[data-v-a673333e]{margin:0;border-radius:8px;padding:6px 8px;color:#9a3412;background:#fff7ed;font-size:11px;line-height:1.4}.editor-body[data-v-a673333e]{display:grid;min-height:0;flex:1;grid-template-columns:268px minmax(0,1fr) 320px}.editor-rail[data-v-a673333e],.editor-inspector[data-v-a673333e]{min-height:0;overflow:auto;padding:16px}.editor-rail[data-v-a673333e]{border-right:1px solid #e5e7eb;background:#f9fafb}.editor-inspector[data-v-a673333e]{border-left:1px solid #e5e7eb;background:#f9fafb}.editor-stage[data-v-a673333e]{display:flex;min-height:0;flex-direction:column;gap:12px;overflow:auto;padding:16px}.stage-preview[data-v-a673333e]{display:flex;min-height:0;flex:1;align-items:center;justify-content:center}.preview-box[data-v-a673333e]{position:relative;margin:0 auto}.preview-box.preview-landscape[data-v-a673333e]{width:100%;max-height:72vh;aspect-ratio:16 / 9}.preview-box.preview-portrait[data-v-a673333e]{height:72vh;max-width:100%;aspect-ratio:9 / 16}.preview-frame[data-v-a673333e]{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;border:1px solid #e5e7eb;border-radius:12px;background:#101828}.preview-frame[data-v-a673333e]>*{width:100%;height:100%}.preview-edit-overlay[data-v-a673333e]{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;pointer-events:none;transition:opacity .15s ease}.preview-box:hover .preview-edit-overlay[data-v-a673333e],.preview-box:focus-within .preview-edit-overlay[data-v-a673333e],.preview-edit-overlay.preview-edit-overlay-active[data-v-a673333e]{opacity:1;pointer-events:auto}@media (hover: none),(pointer: coarse){.preview-edit-overlay[data-v-a673333e]{opacity:1;pointer-events:auto}}.layout-bar[data-v-a673333e]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.layout-bar-title[data-v-a673333e]{display:flex;min-width:0;flex-direction:column;gap:2px}.layout-title[data-v-a673333e]{color:#111827;font-size:13px;font-weight:600}.layout-hint[data-v-a673333e]{color:#9ca3af;font-size:11px}.layout-actions[data-v-a673333e]{display:flex;flex-shrink:0;align-items:center;gap:6px}.layout-conflict[data-v-a673333e]{display:flex;align-items:flex-start;gap:6px;border-radius:8px;background:#fffbeb;padding:8px 10px;color:#92400e;font-size:12px;cursor:pointer}.preset-row[data-v-a673333e]{display:flex;flex-wrap:wrap;gap:8px;border-radius:10px;background:#f9fafb;padding:10px}.preset-card[data-v-a673333e]{display:flex;width:108px;flex-direction:column;gap:6px;border:1px solid #d1d5db;border-radius:10px;padding:8px;background:#fff;text-align:left}.preset-card[data-v-a673333e]:hover{border-color:#f97316;background:#fff7ed}.preset-diagram[data-v-a673333e]{display:flex;height:34px;gap:3px;border-radius:6px;background:#f3f4f6;padding:3px}.preset-row-dir[data-v-a673333e]{flex-direction:row}.preset-column-dir[data-v-a673333e]{flex-direction:column}.preset-cell[data-v-a673333e]{flex-basis:0;border-radius:4px;background:#fdba74}.preset-label[data-v-a673333e]{color:#374151;font-size:11px;line-height:1.3}@media (max-width: 1280px){.editor-body[data-v-a673333e]{grid-template-columns:220px minmax(0,1fr)}.editor-inspector[data-v-a673333e]{grid-column:1 / -1;border-left:0;border-top:1px solid #e5e7eb}}.layout-split[data-v-5595b416]{display:flex;min-width:0;min-height:0;flex:1;gap:6px}.layout-row[data-v-5595b416]{flex-direction:row}.layout-column[data-v-5595b416]{flex-direction:column}.layout-zone[data-v-5595b416]{display:flex;min-width:0;min-height:36px;flex:1;flex-direction:row;align-items:center;gap:8px;overflow:hidden;border:1.5px dashed #d1d5db;border-radius:10px;padding:6px 10px;background:#fff;text-align:left;transition:border-color .12s ease,background .12s ease}.layout-zone[data-v-5595b416]:hover{border-color:#fdba74;background:#fffbf5}.layout-zone-selected[data-v-5595b416]{border-style:solid;border-color:#f97316;background:#fff7ed;box-shadow:inset 0 0 0 1px #f97316}.layout-zone-index[data-v-5595b416]{flex:none;color:#6b7280;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.layout-zone-blocks[data-v-5595b416]{display:flex;min-width:0;gap:4px}.layout-zone-chip[data-v-5595b416]{display:inline-flex;max-width:100%;align-items:center;gap:4px;border-radius:999px;background:#f3f4f6;padding:3px 8px;color:#374151;font-size:11px}.display-toolbar[data-v-a2dda95a]{display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid #e5e7eb;padding-bottom:14px}.display-controls[data-v-a2dda95a]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:12px}.display-restaurant-select[data-v-a2dda95a]{width:min(360px,100%)}.display-outlet[data-v-a2dda95a]{display:flex;align-items:center;gap:16px}.display-entitlement[data-v-a2dda95a]{color:#6b7280;font-size:12px;white-space:nowrap}.restriction-note[data-v-a2dda95a]{margin-top:12px;border:1px solid #fed7aa;border-radius:10px;padding:10px 12px;color:#9a3412;background:#fff7ed;font-size:13px}.empty-state[data-v-a2dda95a]{display:grid;justify-items:center;gap:6px;border:1px dashed #d1d5db;border-radius:12px;padding:56px 20px;color:#6b7280;text-align:center}.empty-state strong[data-v-a2dda95a]{color:#111827}.layout-thumb[data-v-a2dda95a]{display:flex;height:auto;min-height:96px;margin-top:16px;border-radius:10px;background:#f3f4f6;padding:5px;pointer-events:none}.thumb-caption[data-v-a2dda95a]{margin-top:8px;color:#6b7280;font-size:11px}.resource-card[data-v-a2dda95a]{border:1px solid #e5e7eb;border-radius:12px;padding:20px;background:#fff;box-shadow:0 2px 8px #0000000a}.mode-badge[data-v-a2dda95a],.status-badge[data-v-a2dda95a]{border-radius:999px;padding:3px 8px;background:#f3f4f6;font-size:11px;font-weight:700}.status-badge.active[data-v-a2dda95a]{color:#166534;background:#dcfce7}.status-badge.disabled[data-v-a2dda95a]{color:#991b1b;background:#fee2e2}.status-badge.unlicensed[data-v-a2dda95a]{color:#b42318;background:#fef3f2;border:1px solid #fecdca}.online-dot[data-v-a2dda95a]{color:#6b7280;font-size:11px}.online-dot[data-v-a2dda95a]:before{display:inline-block;width:7px;height:7px;margin-right:5px;border-radius:50%;background:#9ca3af;content:""}.online-dot.online[data-v-a2dda95a]{color:#15803d}.online-dot.online[data-v-a2dda95a]:before{background:#22c55e}.meta-grid[data-v-a2dda95a]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:18px;border-top:1px solid #f0f0f0;padding-top:16px}.meta-grid dt[data-v-a2dda95a]{color:#6b7280;font-size:11px}.meta-grid dd[data-v-a2dda95a]{overflow:hidden;margin-top:2px;font-size:12px;text-overflow:ellipsis;white-space:nowrap}@media (max-width:640px){.display-toolbar[data-v-a2dda95a]{align-items:flex-start}.display-controls[data-v-a2dda95a]{align-items:stretch;flex-direction:column}.display-outlet[data-v-a2dda95a]{align-items:stretch;flex-direction:column;gap:8px}.display-restaurant-select[data-v-a2dda95a]{width:100%}}
1
+ .integration-details[data-v-64de12e4]{display:flex;flex-direction:column;gap:.625rem;padding:1rem;margin-top:1rem;border:1px solid #e5e7eb;border-radius:.5rem}.integration-details--owned[data-v-64de12e4]{border-color:var(--fm-color-primary-oats);box-shadow:inset .25rem 0 0 var(--fm-color-primary)}.integration-details__header[data-v-64de12e4]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem}.integration-details__title[data-v-64de12e4]{display:flex;align-items:center;gap:.375rem}.integration-details__store-label[data-v-64de12e4]{padding:.25rem .625rem;color:var(--fm-color-primary);background:var(--fm-color-primary-oats);border-radius:999px}.integration-details__row[data-v-64de12e4]{display:grid;grid-template-columns:10rem minmax(0,1fr);align-items:center;gap:1rem}.integration-details__value[data-v-64de12e4]{display:flex;min-width:0;align-items:center;gap:.5rem}.integration-details__action[data-v-64de12e4]{display:inline-flex;flex:0 0 auto}.integration-details__value>code[data-v-64de12e4]{flex:1 1 auto}.integration-details__summary[data-v-64de12e4]{display:flex;justify-content:flex-end;margin-top:.25rem}.integration-details__message[data-v-64de12e4]{max-height:9rem;overflow-y:auto;white-space:pre-wrap}code[data-v-64de12e4]{min-width:0;overflow-wrap:anywhere}@media (max-width: 460px){.integration-details__row[data-v-64de12e4]{grid-template-columns:1fr;gap:.25rem}.integration-details__header[data-v-64de12e4]{align-items:flex-start}}.store-section[data-v-64f1ea7c]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-64f1ea7c]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-64f1ea7c]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.store-card__title[data-v-64f1ea7c]{min-width:0;word-break:break-all}.store-card__actions[data-v-64f1ea7c]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-64f1ea7c]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-64f1ea7c]{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:1rem}.store-field>span[data-v-64f1ea7c]:first-child{color:var(--fm-color-neutral-gray-400)}.store-field>span[data-v-64f1ea7c]:last-child{word-break:break-word}.store-sheet-body[data-v-64f1ea7c]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}@media (max-width: 460px){.store-field[data-v-64f1ea7c]{grid-template-columns:1fr}}.store-section[data-v-fe141f25]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-fe141f25]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-fe141f25]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.25rem}.store-card__title[data-v-fe141f25]{min-width:0;word-break:break-all}.store-card__actions[data-v-fe141f25]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-fe141f25]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-fe141f25]{display:grid;grid-template-columns:9rem minmax(0,1fr);align-items:start;-moz-column-gap:1rem;column-gap:1rem;row-gap:.125rem}.store-field>span[data-v-fe141f25]:last-child{word-break:break-word}.store-sheet-body[data-v-fe141f25]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}.store-sheet-activate[data-v-fe141f25]{padding-top:1.25rem;border-top:1px solid #e5e7eb}.store-sheet-activate__hint[data-v-fe141f25]{margin-top:.5rem}@media (max-width: 460px){.store-field[data-v-fe141f25]{grid-template-columns:1fr}}.store-section[data-v-b94bbdb0]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-b94bbdb0]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-b94bbdb0]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.store-card__title[data-v-b94bbdb0]{min-width:0;word-break:break-all}.store-card__actions[data-v-b94bbdb0]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-b94bbdb0]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-b94bbdb0]{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:1rem}.store-field>span[data-v-b94bbdb0]:first-child{color:var(--fm-color-neutral-gray-400)}.store-field>span[data-v-b94bbdb0]:last-child{word-break:break-word}.store-sheet-body[data-v-b94bbdb0]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}@media (max-width: 460px){.store-field[data-v-b94bbdb0]{grid-template-columns:1fr}}[data-v-91393c58] .fm-checkbox--wrapper:has(input:disabled){pointer-events:none}[data-v-a959025e] .flex.flex-col.gap-8>:first-child,[data-v-a959025e] .flex.flex-col.gap-8>:last-child{display:none}.toggle[data-v-5266c20e]{position:relative;flex-shrink:0;width:52px;height:32px;padding:0;border:none;border-radius:9999px;background:var(--fm-color-neutral-gray-200);cursor:pointer;transition:background-color .2s ease-out}.toggle[data-v-5266c20e]:focus{outline:none}.toggle[data-v-5266c20e]:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--fm-color-primary) 40%,transparent)}.toggle--on[data-v-5266c20e]{background:var(--fm-color-primary)}.toggle__thumb[data-v-5266c20e]{position:absolute;top:50%;left:8px;width:18px;height:18px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #0003;transform:translateY(-50%);transition:all .2s ease-out}.toggle--on .toggle__thumb[data-v-5266c20e]{left:24px;width:24px;height:24px}.toggle:active .toggle__thumb[data-v-5266c20e]{transform:translateY(-50%) scale(1.1)}.delivery-company-filter-toolbar[data-v-e2763a83]{display:flex;flex-direction:row;justify-content:space-between}@media (max-width: 647px){.delivery-company-filter-toolbar[data-v-e2763a83]{flex-direction:column;flex-wrap:wrap}}.scrollbar-thin[data-v-09464e01]::-webkit-scrollbar{width:6px}.scrollbar-thin[data-v-09464e01]::-webkit-scrollbar-track{background:transparent;border-radius:3px;margin:4px 0}.scrollbar-thin[data-v-09464e01]::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:3px}.scrollbar-thin[data-v-09464e01]::-webkit-scrollbar-thumb:hover{background:#9ca3af}.time-picker-field[data-v-09464e01]{width:100%;height:40px;border-width:1.5px;border-style:solid;border-color:#d1d5db;border-radius:.625rem;padding:8px 36px 8px 12px;font-size:.95rem;line-height:1.25rem;font-weight:500;transition:all .2s;background-color:#fff;outline:none;box-sizing:border-box}.time-picker-field[data-v-09464e01]:hover{border-color:#9ca3af}.time-picker-field[data-v-09464e01]:focus{border-color:#f97316!important;background-color:#fff7ed!important}.preview-frame[data-v-bd8d2976]{position:relative;width:100%;overflow:hidden;border:1px solid #d1d5db;border-radius:12px;aspect-ratio:16 / 9;background:#111827;box-shadow:0 16px 40px #0f172a1f}.preview-iframe[data-v-bd8d2976]{display:block;width:100%;height:100%;border:0;background:#f3f4f6}.preview-status[data-v-bd8d2976]{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-content:center;gap:12px;background:#f9fafbf0;color:#4b5563;text-align:center;font-size:13px}.preview-status p[data-v-bd8d2976]{margin:0}.preview-status[data-v-bd8d2976] button{justify-self:center}.preview-loading[data-v-bd8d2976]{display:grid;justify-items:center;gap:10px}.preview-loading span[data-v-bd8d2976]{width:24px;height:24px;border:3px solid #fed7aa;border-top-color:#ef661f;border-radius:50%;animation:preview-spin-bd8d2976 .8s linear infinite}@keyframes preview-spin-bd8d2976{to{transform:rotate(360deg)}}.canvas-area[data-v-cdd742c6]{position:relative;display:flex;min-width:0;min-height:0;flex-direction:column}.canvas-area-card[data-v-cdd742c6]{display:flex;flex:1;min-width:0;min-height:0;flex-direction:column;gap:8px;overflow:visible;border:1.5px dashed rgb(255 255 255 / 55%);border-radius:10px;padding:6px;background:#11182752;text-align:left}.canvas-area-card[data-v-cdd742c6]:hover{background:#1118276b}.canvas-area-active[data-v-cdd742c6]{border-style:solid;border-color:#f97316;background:#f973164d;box-shadow:0 0 0 3px #f973161f}.canvas-area-context[data-v-cdd742c6]{border-style:solid;border-color:#fed7aa;background:#fdba7433}.canvas-area-droppable[data-v-cdd742c6]{border-color:#f97316;background:#f973165c}.canvas-area-drop-over[data-v-cdd742c6]{border-style:solid;box-shadow:0 0 0 3px #f9731633}.canvas-area-head[data-v-cdd742c6]{display:flex;align-items:center;gap:8px}.canvas-area-name[data-v-cdd742c6],.canvas-area-share[data-v-cdd742c6]{color:#f9fafb;text-shadow:0 1px 3px rgb(0 0 0 / 70%);font-weight:700}.canvas-area-name[data-v-cdd742c6]{font-size:10px;letter-spacing:.06em;text-transform:uppercase}.canvas-area-share[data-v-cdd742c6]{margin-left:auto;font-size:12px;font-variant-numeric:tabular-nums}.canvas-area-remove[data-v-cdd742c6]{display:grid;flex:0 0 auto;place-items:center;border-radius:999px;padding:2px;background:#1118278c;color:#f9fafb;opacity:0;transition:opacity .1s ease}.canvas-area-remove[data-v-cdd742c6]:hover{background:#fef2f2;color:#dc2626}.canvas-edge[data-v-cdd742c6]{position:absolute;display:grid;place-items:center;width:20px;height:20px;border-radius:999px;background:#fff;box-shadow:0 0 0 1.5px #d1d5db;color:#9ca3af;opacity:0;transition:opacity .1s ease;z-index:1}.canvas-area:hover .canvas-edge[data-v-cdd742c6],.canvas-area:focus-within .canvas-edge[data-v-cdd742c6],.canvas-area:hover .canvas-area-remove[data-v-cdd742c6],.canvas-area:focus-within .canvas-area-remove[data-v-cdd742c6]{opacity:1}.canvas-edge[data-v-cdd742c6]:hover{box-shadow:0 0 0 1.5px #f97316;color:#f97316}.canvas-edge-right[data-v-cdd742c6]{top:50%;right:-10px;transform:translateY(-50%)}.canvas-edge-bottom[data-v-cdd742c6]{bottom:-10px;left:50%;transform:translate(-50%)}.canvas-chips[data-v-cdd742c6]{display:flex;min-height:0;flex:1;flex-direction:column}.canvas-chip[data-v-cdd742c6]{display:flex;align-items:center;align-self:flex-start;max-width:100%;gap:6px;border:1px solid #e5e7eb;border-radius:8px;padding:6px 8px;background:#ffffffeb;color:#374151;font-size:12px;text-align:left;cursor:grab}.canvas-chip[data-v-cdd742c6]:hover{border-color:#fdba74}.canvas-chip-active[data-v-cdd742c6]{border-color:#f97316;box-shadow:inset 4px 0 #f97316,0 0 0 3px #f973161f;font-weight:600}.canvas-chip-active .canvas-chip-grip[data-v-cdd742c6]{color:#f97316}.canvas-chip-context[data-v-cdd742c6]{border-color:#fed7aa;background:#fffdfa}.canvas-chip[data-v-cdd742c6]:active{cursor:grabbing}.canvas-chip-grip[data-v-cdd742c6]{flex:0 0 auto;color:#9ca3af}.canvas-chip-label[data-v-cdd742c6]{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-chip-swap[data-v-cdd742c6]{display:grid;flex:0 0 auto;place-items:center;margin-left:2px;border-radius:6px;padding:2px;color:#9ca3af;opacity:0;transition:opacity .1s ease}.canvas-chip:hover .canvas-chip-swap[data-v-cdd742c6],.canvas-chip:focus-within .canvas-chip-swap[data-v-cdd742c6]{opacity:1}.canvas-chip-swap[data-v-cdd742c6]:hover{background:#fff;color:#f97316}.canvas-area-empty[data-v-cdd742c6]{display:grid;flex:1;place-items:center;border:1px dashed rgb(255 255 255 / 60%);border-radius:8px;background:transparent;color:#f3f4f6;font-size:11px;font-family:inherit;cursor:pointer}.canvas-area-empty[data-v-cdd742c6]:hover{border-color:#f97316;color:#f97316}@media (hover: none),(pointer: coarse){.canvas-edge[data-v-cdd742c6],.canvas-area-remove[data-v-cdd742c6],.canvas-chip-swap[data-v-cdd742c6]{opacity:1}}.canvas[data-v-eb790981]{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;min-height:0}.canvas-row[data-v-eb790981]{flex-direction:row}.canvas-column[data-v-eb790981]{flex-direction:column}.canvas-group[data-v-eb790981]{position:relative;display:flex;min-width:0;min-height:0}.canvas-divider[data-v-eb790981]{position:absolute;z-index:2;display:grid;place-items:center;touch-action:none}.divider-vertical[data-v-eb790981]{top:0;bottom:0;width:10px;transform:translate(-50%);cursor:col-resize}.divider-horizontal[data-v-eb790981]{left:0;right:0;height:10px;transform:translateY(-50%);cursor:row-resize}.canvas-divider-grip[data-v-eb790981]{border-radius:999px;background:#d1d5db}.divider-vertical .canvas-divider-grip[data-v-eb790981]{height:34px;width:3px}.divider-horizontal .canvas-divider-grip[data-v-eb790981]{height:3px;width:34px}.canvas-divider:hover .canvas-divider-grip[data-v-eb790981]{background:#f97316}.module-picker[data-v-2892f182]{display:flex;flex-direction:column;gap:18px}.module-picker-hint[data-v-2892f182]{margin:0;color:#6b7280;font-size:12px}.module-picker-group[data-v-2892f182]{display:flex;flex-direction:column;gap:8px}.module-picker-group-label[data-v-2892f182]{margin:0;color:#9ca3af;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.module-picker-grid[data-v-2892f182]{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}.module-picker-card[data-v-2892f182]{display:flex;flex-direction:column;align-items:center;gap:8px;border:1px solid #e5e7eb;border-radius:10px;padding:14px 10px;background:#fff;color:#374151;font-size:13px;text-align:center;cursor:pointer}.module-picker-card[data-v-2892f182]:hover{border-color:#f97316;background:#fffbf5}.module-picker-icon[data-v-2892f182]{display:grid;height:36px;width:36px;place-items:center;border-radius:8px;background:#f3f4f6;color:#4b5563}.module-picker-label[data-v-2892f182]{line-height:1.3;overflow-wrap:anywhere}.media-field[data-v-839ff846]{display:flex;flex-direction:column;gap:6px}.media-label[data-v-839ff846]{color:#4b5563;font-size:12px}.media-thumb[data-v-839ff846]{height:72px;width:100%;border-radius:8px;border:1px solid #e5e7eb;-o-object-fit:cover;object-fit:cover}.media-empty[data-v-839ff846]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#9ca3af;font-size:12px}.media-warning[data-v-839ff846]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#b54708;font-size:12px}.media-actions[data-v-839ff846]{display:flex;gap:6px}.inspector[data-v-4cc442cf]{display:flex;flex-direction:column;gap:14px}.inspector-scope[data-v-4cc442cf]{align-self:stretch}.inspector-breadcrumb[data-v-4cc442cf]{display:flex;align-items:center;gap:2px;color:#6b7280;font-size:11px}.inspector-section[data-v-4cc442cf]{display:flex;flex-direction:column;gap:10px;border-top:1px solid #e5e7eb;padding-top:12px}.inspector-section-title[data-v-4cc442cf]{color:#9ca3af;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.inspector-note[data-v-4cc442cf]{color:#6b7280;font-size:11px;line-height:1.45}.inspector-warning[data-v-4cc442cf]{display:flex;align-items:flex-start;gap:6px;border-radius:8px;background:#fffbeb;padding:8px 10px;color:#92400e;font-size:12px}.inspector-list[data-v-4cc442cf]{display:flex;flex-direction:column;gap:8px}.inspector-list-head[data-v-4cc442cf]{display:flex;align-items:baseline;gap:6px}.inspector-list-count[data-v-4cc442cf]{border-radius:999px;background:#f3f4f6;padding:0 6px;color:#6b7280;font-size:10px;font-variant-numeric:tabular-nums}.inspector-item[data-v-4cc442cf]{display:flex;flex-direction:column;gap:10px;border:1px solid #e5e7eb;border-radius:10px;padding:10px;background:#fcfcfd}.inspector-item-head[data-v-4cc442cf]{display:flex;align-items:center;gap:2px}.inspector-item-name[data-v-4cc442cf]{flex:1;color:#6b7280;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.inspector-item-action[data-v-4cc442cf]{display:grid;flex:0 0 auto;place-items:center;border-radius:6px;padding:2px;color:#9ca3af}.inspector-item-action[data-v-4cc442cf]:hover:not(:disabled){background:#fff7ed;color:#f97316}.inspector-item-action[data-v-4cc442cf]:disabled{opacity:.35}.inspector-list-add[data-v-4cc442cf]{display:flex;gap:6px}.media-field[data-v-4cc442cf]{display:flex;flex-direction:column;gap:6px}.media-label[data-v-4cc442cf]{color:#4b5563;font-size:12px}.media-thumb[data-v-4cc442cf]{height:72px;width:100%;border-radius:8px;border:1px solid #e5e7eb;-o-object-fit:cover;object-fit:cover}.media-empty[data-v-4cc442cf]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#9ca3af;font-size:12px}.media-actions[data-v-4cc442cf]{display:flex;gap:6px}.editor-head[data-v-a673333e]{display:flex;shrink:0;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid #e5e7eb;padding:12px 20px}.editor-identity[data-v-a673333e]{display:flex;min-width:0;align-items:center;gap:10px}.editor-name[data-v-a673333e]{width:min(320px,40vw)}.editor-orientation[data-v-a673333e]{width:160px}.editor-error[data-v-a673333e]{flex-shrink:0;margin:12px 16px 0;border-radius:8px;background:#fef2f2;padding:8px 12px;color:#b91c1c;font-size:13px}.rail-scale[data-v-a673333e]{display:flex;flex-direction:column;gap:6px;margin-bottom:18px;border-bottom:1px solid #e5e7eb;padding-bottom:16px}.rail-scale-label[data-v-a673333e]{color:#4b5563;font-size:12px;font-weight:600}.rail-scale-hint[data-v-a673333e]{margin:0;color:#6b7280;font-size:11px;line-height:1.4}.rail-scale-warning[data-v-a673333e]{margin:0;border-radius:8px;padding:6px 8px;color:#9a3412;background:#fff7ed;font-size:11px;line-height:1.4}.editor-body[data-v-a673333e]{display:grid;min-height:0;flex:1;grid-template-columns:268px minmax(0,1fr) 320px}.editor-rail[data-v-a673333e],.editor-inspector[data-v-a673333e]{min-height:0;overflow:auto;padding:16px}.editor-rail[data-v-a673333e]{border-right:1px solid #e5e7eb;background:#f9fafb}.editor-inspector[data-v-a673333e]{border-left:1px solid #e5e7eb;background:#f9fafb}.editor-stage[data-v-a673333e]{display:flex;min-height:0;flex-direction:column;gap:12px;overflow:auto;padding:16px}.stage-preview[data-v-a673333e]{display:flex;min-height:0;flex:1;align-items:center;justify-content:center}.preview-box[data-v-a673333e]{position:relative;margin:0 auto}.preview-box.preview-landscape[data-v-a673333e]{width:100%;max-height:72vh;aspect-ratio:16 / 9}.preview-box.preview-portrait[data-v-a673333e]{height:72vh;max-width:100%;aspect-ratio:9 / 16}.preview-frame[data-v-a673333e]{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;border:1px solid #e5e7eb;border-radius:12px;background:#101828}.preview-frame[data-v-a673333e]>*{width:100%;height:100%}.preview-edit-overlay[data-v-a673333e]{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;pointer-events:none;transition:opacity .15s ease}.preview-box:hover .preview-edit-overlay[data-v-a673333e],.preview-box:focus-within .preview-edit-overlay[data-v-a673333e],.preview-edit-overlay.preview-edit-overlay-active[data-v-a673333e]{opacity:1;pointer-events:auto}@media (hover: none),(pointer: coarse){.preview-edit-overlay[data-v-a673333e]{opacity:1;pointer-events:auto}}.layout-bar[data-v-a673333e]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.layout-bar-title[data-v-a673333e]{display:flex;min-width:0;flex-direction:column;gap:2px}.layout-title[data-v-a673333e]{color:#111827;font-size:13px;font-weight:600}.layout-hint[data-v-a673333e]{color:#9ca3af;font-size:11px}.layout-actions[data-v-a673333e]{display:flex;flex-shrink:0;align-items:center;gap:6px}.layout-conflict[data-v-a673333e]{display:flex;align-items:flex-start;gap:6px;border-radius:8px;background:#fffbeb;padding:8px 10px;color:#92400e;font-size:12px;cursor:pointer}.preset-row[data-v-a673333e]{display:flex;flex-wrap:wrap;gap:8px;border-radius:10px;background:#f9fafb;padding:10px}.preset-card[data-v-a673333e]{display:flex;width:108px;flex-direction:column;gap:6px;border:1px solid #d1d5db;border-radius:10px;padding:8px;background:#fff;text-align:left}.preset-card[data-v-a673333e]:hover{border-color:#f97316;background:#fff7ed}.preset-diagram[data-v-a673333e]{display:flex;height:34px;gap:3px;border-radius:6px;background:#f3f4f6;padding:3px}.preset-row-dir[data-v-a673333e]{flex-direction:row}.preset-column-dir[data-v-a673333e]{flex-direction:column}.preset-cell[data-v-a673333e]{flex-basis:0;border-radius:4px;background:#fdba74}.preset-label[data-v-a673333e]{color:#374151;font-size:11px;line-height:1.3}@media (max-width: 1280px){.editor-body[data-v-a673333e]{grid-template-columns:220px minmax(0,1fr)}.editor-inspector[data-v-a673333e]{grid-column:1 / -1;border-left:0;border-top:1px solid #e5e7eb}}.layout-split[data-v-5595b416]{display:flex;min-width:0;min-height:0;flex:1;gap:6px}.layout-row[data-v-5595b416]{flex-direction:row}.layout-column[data-v-5595b416]{flex-direction:column}.layout-zone[data-v-5595b416]{display:flex;min-width:0;min-height:36px;flex:1;flex-direction:row;align-items:center;gap:8px;overflow:hidden;border:1.5px dashed #d1d5db;border-radius:10px;padding:6px 10px;background:#fff;text-align:left;transition:border-color .12s ease,background .12s ease}.layout-zone[data-v-5595b416]:hover{border-color:#fdba74;background:#fffbf5}.layout-zone-selected[data-v-5595b416]{border-style:solid;border-color:#f97316;background:#fff7ed;box-shadow:inset 0 0 0 1px #f97316}.layout-zone-index[data-v-5595b416]{flex:none;color:#6b7280;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.layout-zone-blocks[data-v-5595b416]{display:flex;min-width:0;gap:4px}.layout-zone-chip[data-v-5595b416]{display:inline-flex;max-width:100%;align-items:center;gap:4px;border-radius:999px;background:#f3f4f6;padding:3px 8px;color:#374151;font-size:11px}.display-toolbar[data-v-a2dda95a]{display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid #e5e7eb;padding-bottom:14px}.display-controls[data-v-a2dda95a]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:12px}.display-restaurant-select[data-v-a2dda95a]{width:min(360px,100%)}.display-outlet[data-v-a2dda95a]{display:flex;align-items:center;gap:16px}.display-entitlement[data-v-a2dda95a]{color:#6b7280;font-size:12px;white-space:nowrap}.restriction-note[data-v-a2dda95a]{margin-top:12px;border:1px solid #fed7aa;border-radius:10px;padding:10px 12px;color:#9a3412;background:#fff7ed;font-size:13px}.empty-state[data-v-a2dda95a]{display:grid;justify-items:center;gap:6px;border:1px dashed #d1d5db;border-radius:12px;padding:56px 20px;color:#6b7280;text-align:center}.empty-state strong[data-v-a2dda95a]{color:#111827}.layout-thumb[data-v-a2dda95a]{display:flex;height:auto;min-height:96px;margin-top:16px;border-radius:10px;background:#f3f4f6;padding:5px;pointer-events:none}.thumb-caption[data-v-a2dda95a]{margin-top:8px;color:#6b7280;font-size:11px}.resource-card[data-v-a2dda95a]{border:1px solid #e5e7eb;border-radius:12px;padding:20px;background:#fff;box-shadow:0 2px 8px #0000000a}.mode-badge[data-v-a2dda95a],.status-badge[data-v-a2dda95a]{border-radius:999px;padding:3px 8px;background:#f3f4f6;font-size:11px;font-weight:700}.status-badge.active[data-v-a2dda95a]{color:#166534;background:#dcfce7}.status-badge.disabled[data-v-a2dda95a]{color:#991b1b;background:#fee2e2}.status-badge.unlicensed[data-v-a2dda95a]{color:#b42318;background:#fef3f2;border:1px solid #fecdca}.online-dot[data-v-a2dda95a]{color:#6b7280;font-size:11px}.online-dot[data-v-a2dda95a]:before{display:inline-block;width:7px;height:7px;margin-right:5px;border-radius:50%;background:#9ca3af;content:""}.online-dot.online[data-v-a2dda95a]{color:#15803d}.online-dot.online[data-v-a2dda95a]:before{background:#22c55e}.meta-grid[data-v-a2dda95a]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:18px;border-top:1px solid #f0f0f0;padding-top:16px}.meta-grid dt[data-v-a2dda95a]{color:#6b7280;font-size:11px}.meta-grid dd[data-v-a2dda95a]{overflow:hidden;margin-top:2px;font-size:12px;text-overflow:ellipsis;white-space:nowrap}@media (max-width:640px){.display-toolbar[data-v-a2dda95a]{align-items:flex-start}.display-controls[data-v-a2dda95a]{align-items:stretch;flex-direction:column}.display-outlet[data-v-a2dda95a]{align-items:stretch;flex-direction:column;gap:8px}.display-restaurant-select[data-v-a2dda95a]{width:100%}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feedmepos/mf-order-setting",
3
- "version": "0.0.91",
3
+ "version": "0.0.92",
4
4
  "type": "module",
5
5
  "module": "./dist/app.js",
6
6
  "license": "UNLICENSED",
@@ -10,7 +10,7 @@
10
10
  }
11
11
  },
12
12
  "dependencies": {
13
- "@feedmepos/core": "^2.15.52",
13
+ "@feedmepos/core": "^2.15.56",
14
14
  "@feedmepos/entity": "0.0.20",
15
15
  "@feedmepos/feature-flag": "^0.0.15",
16
16
  "@feedmepos/hrm-permission": "^1.0.13",
@@ -0,0 +1,25 @@
1
+ import { baseClientInstance, getData } from '@/api'
2
+ import type { FdoOrderReservationSettingsV2 } from '@entity'
3
+
4
+ // reservation-backend portal routes. The portal host's ingress rewrites
5
+ // `/reservation(.*)` to `/portal/reservation$1` on reservation-backend.
6
+ async function getReservationSetting(restaurantId: string): Promise<FdoOrderReservationSettingsV2> {
7
+ const result = await baseClientInstance().get(`/reservation/restaurant/${restaurantId}/setting`)
8
+ return getData<FdoOrderReservationSettingsV2>(result)
9
+ }
10
+
11
+ async function updateReservationSetting(
12
+ restaurantId: string,
13
+ payload: FdoOrderReservationSettingsV2
14
+ ): Promise<FdoOrderReservationSettingsV2> {
15
+ const result = await baseClientInstance().put(
16
+ `/reservation/restaurant/${restaurantId}/setting`,
17
+ payload
18
+ )
19
+ return getData<FdoOrderReservationSettingsV2>(result)
20
+ }
21
+
22
+ export const ReservationApi = {
23
+ getReservationSetting,
24
+ updateReservationSetting
25
+ }
Binary file
@@ -66,6 +66,8 @@
66
66
  "acceptedPayment": "Accepted Payment",
67
67
  "acceptQueue": "Accept queue",
68
68
  "acceptQueueSublabel": "Customer can use queue in FeedMe app",
69
+ "acceptReservation": "Accept reservation",
70
+ "acceptReservationSublabel": "Customers can book a table. FeedMe admin only",
69
71
  "actiavteFeedmeExpress": "Activate FeedMe Express",
70
72
  "activated": "Activated",
71
73
  "activatedDate": "Activated date",
@@ -398,6 +400,25 @@
398
400
  "padDigit": "Pad Digit",
399
401
  "paid": "Paid",
400
402
  "paxMax": "Pax Max",
403
+ "reservation": "Reservation",
404
+ "reservationStatus": "Reservation Status",
405
+ "reservationAvailability": "Reservation Availability",
406
+ "notificationSettings": "Notification Settings",
407
+ "smsEnabled": "Enable SMS Notifications",
408
+ "smsEnabledDescription": "Send SMS notifications to customers for reservation updates",
409
+ "emailEnabled": "Enable Email Notifications",
410
+ "emailEnabledDescription": "Send email notifications to customers for reservation updates",
411
+ "notifyOnConfirm": "Notify on Confirmation",
412
+ "notifyOnConfirmDescription": "Send notifications when a reservation is confirmed",
413
+ "notifyOnCancel": "Notify on Cancellation",
414
+ "notifyOnCancelDescription": "Send notifications when a reservation is cancelled",
415
+ "draftHoldTimeMinutes": "Draft Hold Time (Minutes)",
416
+ "posCanOverbook": "POS Can Overbook",
417
+ "posCanOverbookDescription": "Allow POS to create reservations even when capacity is full",
418
+ "saveAllChanges": "Save All Changes",
419
+ "settingUpdated": "Settings updated successfully",
420
+ "validationError": "Validation Error",
421
+ "ok": "OK",
401
422
  "paxMin": "Pax Min",
402
423
  "payAtCounter": "Pay at Counter",
403
424
  "paymentMethod": "Payment Method",
@@ -66,6 +66,8 @@
66
66
  "acceptedPayment": "受け付けた支払い",
67
67
  "acceptQueue": "待ち行列を受け付ける",
68
68
  "acceptQueueSublabel": "お客様はFeedMeアプリで順番待ちができます",
69
+ "acceptReservation": "予約を受け付ける",
70
+ "acceptReservationSublabel": "お客様はテーブルを予約できます。FeedMe管理者のみ",
69
71
  "actiavteFeedmeExpress": "FeedMe Expressを有効にする",
70
72
  "activated": "有効化済み",
71
73
  "activatedDate": "有効化日",
@@ -344,6 +346,25 @@
344
346
  "current": "現在",
345
347
  "paxMin": "最小人数",
346
348
  "paxMax": "最大人数",
349
+ "reservation": "予約",
350
+ "reservationStatus": "予約ステータス",
351
+ "reservationAvailability": "予約受付期間",
352
+ "notificationSettings": "通知設定",
353
+ "smsEnabled": "SMS通知を有効にする",
354
+ "smsEnabledDescription": "予約の更新をSMSでお客様に通知します",
355
+ "emailEnabled": "メール通知を有効にする",
356
+ "emailEnabledDescription": "予約の更新をメールでお客様に通知します",
357
+ "notifyOnConfirm": "予約確定時に通知",
358
+ "notifyOnConfirmDescription": "予約が確定したときに通知を送信します",
359
+ "notifyOnCancel": "キャンセル時に通知",
360
+ "notifyOnCancelDescription": "予約がキャンセルされたときに通知を送信します",
361
+ "draftHoldTimeMinutes": "仮予約の保持時間(分)",
362
+ "posCanOverbook": "POSでのオーバーブッキングを許可",
363
+ "posCanOverbookDescription": "満席の場合でもPOSで予約を作成できるようにします",
364
+ "saveAllChanges": "すべての変更を保存",
365
+ "settingUpdated": "設定を更新しました",
366
+ "validationError": "入力エラー",
367
+ "ok": "OK",
347
368
  "qrPay": "QR決済",
348
369
  "terminalScanPay": "端末スキャン決済",
349
370
  "terminalQrPay": "端末QR決済",
@@ -159,6 +159,8 @@
159
159
  "acceptedPayment": "ช่องทางการชำระเงินที่รองรับ",
160
160
  "acceptQueue": "จองคิว",
161
161
  "acceptQueueSublabel": "ลูกค้าสามารถจองคิวผ่านแอป FeedMe",
162
+ "acceptReservation": "รับการจองโต๊ะ",
163
+ "acceptReservationSublabel": "ลูกค้าสามารถจองโต๊ะได้ เฉพาะผู้ดูแลระบบ FeedMe",
162
164
  "actiavteFeedmeExpress": "เปิดใช้งาน FeedMe Express",
163
165
  "activated": "เปิดใช้งานแล้ว",
164
166
  "activatedDate": "วันที่เปิดใช้งาน",
@@ -441,6 +443,25 @@
441
443
  "current": "ปัจจุบัน",
442
444
  "paxMin": "จำนวนลูกค้าขั้นต่ำ",
443
445
  "paxMax": "จำนวนลูกค้าสูงสุด",
446
+ "reservation": "การจอง",
447
+ "reservationStatus": "สถานะการจอง",
448
+ "reservationAvailability": "ช่วงเวลาที่เปิดรับจอง",
449
+ "notificationSettings": "การตั้งค่าการแจ้งเตือน",
450
+ "smsEnabled": "เปิดใช้งานการแจ้งเตือนผ่าน SMS",
451
+ "smsEnabledDescription": "ส่งการแจ้งเตือนผ่าน SMS ให้กับลูกค้าสำหรับการอัพเดทการจอง",
452
+ "emailEnabled": "เปิดใช้งานการแจ้งเตือนผ่านอีเมล",
453
+ "emailEnabledDescription": "ส่งการแจ้งเตือนผ่านอีเมลให้กับลูกค้าสำหรับการอัพเดทการจอง",
454
+ "notifyOnConfirm": "แจ้งเตือนเมื่อยืนยัน",
455
+ "notifyOnConfirmDescription": "ส่งการแจ้งเตือนเมื่อการจองได้รับการยืนยัน",
456
+ "notifyOnCancel": "แจ้งเตือนเมื่อยกเลิก",
457
+ "notifyOnCancelDescription": "ส่งการแจ้งเตือนเมื่อการจองถูกยกเลิก",
458
+ "draftHoldTimeMinutes": "เวลาเก็บร่าง (นาที)",
459
+ "posCanOverbook": "POS สามารถจองเกินได้",
460
+ "posCanOverbookDescription": "อนุญาตให้ POS สร้างการจองแม้ว่าความจุเต็มแล้ว",
461
+ "saveAllChanges": "บันทึกการเปลี่ยนแปลงทั้งหมด",
462
+ "settingUpdated": "อัปเดตการตั้งค่าสำเร็จ",
463
+ "validationError": "ข้อผิดพลาดในการตรวจสอบ",
464
+ "ok": "ตกลง",
444
465
  "qrPay": "ชำระเงินด้วย QR",
445
466
  "terminalScanPay": "ชำระเงินด้วยการสแกนเทอร์มินัล",
446
467
  "terminalQrPay": "ชำระเงินด้วย QR เทอร์มินัล",
@@ -159,6 +159,8 @@
159
159
  "acceptedPayment": "可接受付款方式",
160
160
  "acceptQueue": "接受队列",
161
161
  "acceptQueueSublabel": "客户可以在FeedMe应用中使用排队功能",
162
+ "acceptReservation": "接受预订",
163
+ "acceptReservationSublabel": "客户可以预订餐桌。仅限 FeedMe 管理员",
162
164
  "actiavteFeedmeExpress": "激活FeedMe外卖配送",
163
165
  "activated": "已激活",
164
166
  "activatedDate": "激活日期",
@@ -443,6 +445,25 @@
443
445
  "current": "当前",
444
446
  "paxMin": "最少人数",
445
447
  "paxMax": "最多人数",
448
+ "reservation": "预订",
449
+ "reservationStatus": "预订状态",
450
+ "reservationAvailability": "预订开放时间",
451
+ "notificationSettings": "通知设置",
452
+ "smsEnabled": "启用短信通知",
453
+ "smsEnabledDescription": "向客户发送预订更新的短信通知",
454
+ "emailEnabled": "启用电子邮件通知",
455
+ "emailEnabledDescription": "向客户发送预订更新的电子邮件通知",
456
+ "notifyOnConfirm": "确认时通知",
457
+ "notifyOnConfirmDescription": "当预订被确认时发送通知",
458
+ "notifyOnCancel": "取消时通知",
459
+ "notifyOnCancelDescription": "当预订被取消时发送通知",
460
+ "draftHoldTimeMinutes": "草稿保留时间(分钟)",
461
+ "posCanOverbook": "POS可以超额预订",
462
+ "posCanOverbookDescription": "允许POS在容量已满时创建预订",
463
+ "saveAllChanges": "保存所有更改",
464
+ "settingUpdated": "设置已成功更新",
465
+ "validationError": "验证错误",
466
+ "ok": "确定",
446
467
  "qrPay": "二维码支付",
447
468
  "terminalScanPay": "终端扫描支付",
448
469
  "terminalQrPay": "终端二维码支付",
@@ -27,13 +27,16 @@ import SmsSetting from './sms/SmsSetting.vue'
27
27
 
28
28
  import GeneralSetting from './general/GeneralSetting.vue'
29
29
  import QueueSetting from './queue/QueueSetting.vue'
30
+ import ReservationSetting from './reservation/ReservationSetting.vue'
30
31
  import { useI18n, useCoreStore } from '@feedmepos/mf-common'
31
32
  import { useMenuStore } from '@/stores/menu/menu'
32
33
  import { useSnackbarFunctions } from '@/components/snackbar'
33
34
  import { useQrOrderingEnabled } from '@/composables/useQrOrderingEnabled'
34
35
 
35
36
  const { t } = useI18n()
36
- const { currentRestaurant } = useCoreStore()
37
+ const { currentRestaurant, sessionUser } = useCoreStore()
38
+ // Reservations are FeedMe-admin only during the pilot (as the Dine-in switch).
39
+ const isAdmin = computed(() => sessionUser.value?.role?.isAdmin ?? false)
37
40
  const menuStore = useMenuStore()
38
41
  const { showError } = useSnackbarFunctions()
39
42
  const qrEnabled = useQrOrderingEnabled()
@@ -47,6 +50,7 @@ type OrderSettingMenuItemValue =
47
50
  // | 'discountRule'
48
51
  | 'general'
49
52
  | 'queue'
53
+ | 'reservation'
50
54
  const selectedOrderSetting = ref<OrderSettingMenuItemValue>('delivery')
51
55
 
52
56
  const settingItem = computed<FmTabProps[]>(() => {
@@ -63,7 +67,8 @@ const settingItem = computed<FmTabProps[]>(() => {
63
67
  // { label: t('order.discountRule.title'), value: 'discountRule' },
64
68
  { label: t('order.notifications'), value: 'sms' },
65
69
  { label: t('order.general'), value: 'general' },
66
- { label: t('order.queue'), value: 'queue' }
70
+ { label: t('order.queue'), value: 'queue' },
71
+ ...(isAdmin.value ? [{ label: t('order.reservation'), value: 'reservation' }] : [])
67
72
  ]
68
73
  })
69
74
 
@@ -97,6 +102,8 @@ const currentComponent = computed(() => {
97
102
  return GeneralSetting
98
103
  case 'queue':
99
104
  return QueueSetting
105
+ case 'reservation':
106
+ return ReservationSetting
100
107
  default:
101
108
  return DeliverySetting
102
109
  }
@@ -42,6 +42,27 @@ describe('isIntegratedPlatformSupported', () => {
42
42
  )
43
43
  })
44
44
 
45
+ it('offers exactly these platforms per country', () => {
46
+ const C = AUTO_INTEGRATION_CLIENT
47
+ const expected: Record<string, AUTO_INTEGRATION_CLIENT[]> = {
48
+ MY: [C.foodpanda, C.grabfood, C.shopeefood, C.tng, C.external],
49
+ SG: [C.foodpanda, C.grabfood, C.deliveroo, C.external],
50
+ TH: [C.grabfood, C.external, C.lineman],
51
+ PK: [C.foodpanda, C.external],
52
+ ID: [C.grabfood, C.gofood, C.external],
53
+ GB: [C.external],
54
+ BN: [],
55
+ VN: []
56
+ }
57
+
58
+ for (const [country, offered] of Object.entries(expected)) {
59
+ const actual = Object.values(C).filter((key) =>
60
+ isIntegratedPlatformSupported(key, country as F_COUNTRY)
61
+ )
62
+ expect([country, actual.sort()]).toEqual([country, [...offered].sort()])
63
+ }
64
+ })
65
+
45
66
  it('offers no other integrated platform in the UK (GB)', () => {
46
67
  const others = Object.values(AUTO_INTEGRATION_CLIENT).filter(
47
68
  (key) => key !== AUTO_INTEGRATION_CLIENT.external
@@ -6,6 +6,7 @@ import {
6
6
  } from '@feedmepos/core/entity'
7
7
  import { useCoreStore } from '@feedmepos/mf-common'
8
8
  import { F_ORDER_PLATFORM, type FdoExternalSetting } from '@entity'
9
+ import { isIntegratedPlatformOffered } from '@common/order-platform'
9
10
 
10
11
  export type LinkedDeliveryDoc = FdoLinkedDelivery & { _rev: string }
11
12
 
@@ -100,57 +101,7 @@ export function useDelivery() {
100
101
  country?: F_COUNTRY | null
101
102
  ): boolean {
102
103
  country = country || useCoreStore().currentCountry.value || F_COUNTRY.enum.MY
103
- const mySupported = [
104
- AUTO_INTEGRATION_CLIENT.foodpanda,
105
- AUTO_INTEGRATION_CLIENT.grabfood,
106
- AUTO_INTEGRATION_CLIENT.shopeefood,
107
- AUTO_INTEGRATION_CLIENT.tng,
108
- AUTO_INTEGRATION_CLIENT.external
109
- ]
110
- const sgSupported = [
111
- AUTO_INTEGRATION_CLIENT.foodpanda,
112
- AUTO_INTEGRATION_CLIENT.grabfood,
113
- AUTO_INTEGRATION_CLIENT.deliveroo,
114
- AUTO_INTEGRATION_CLIENT.external
115
- ]
116
- const thSupported = [
117
- AUTO_INTEGRATION_CLIENT.grabfood,
118
- AUTO_INTEGRATION_CLIENT.external,
119
- AUTO_INTEGRATION_CLIENT.lineman
120
- ]
121
- const pkSupported = [AUTO_INTEGRATION_CLIENT.foodpanda, AUTO_INTEGRATION_CLIENT.external]
122
- const idSupported = [
123
- AUTO_INTEGRATION_CLIENT.grabfood,
124
- AUTO_INTEGRATION_CLIENT.gofood,
125
- AUTO_INTEGRATION_CLIENT.external
126
- ]
127
- const gbSupported = [AUTO_INTEGRATION_CLIENT.external]
128
-
129
- let supportedPlatforms: AUTO_INTEGRATION_CLIENT[] = []
130
- switch (country) {
131
- case F_COUNTRY.enum.MY:
132
- supportedPlatforms = mySupported
133
- break
134
- case F_COUNTRY.enum.SG:
135
- supportedPlatforms = sgSupported
136
- break
137
- case F_COUNTRY.enum.TH:
138
- supportedPlatforms = thSupported
139
- break
140
- case F_COUNTRY.enum.PK:
141
- supportedPlatforms = pkSupported
142
- break
143
- case F_COUNTRY.enum.ID:
144
- supportedPlatforms = idSupported
145
- break
146
- case F_COUNTRY.enum.GB:
147
- supportedPlatforms = gbSupported
148
- break
149
- default:
150
- break
151
- }
152
-
153
- return supportedPlatforms.includes(platform)
104
+ return isIntegratedPlatformOffered(platform, country)
154
105
  }
155
106
 
156
107
  return {
@@ -60,6 +60,14 @@
60
60
  :sublabel="t('order.acceptQueueSublabel')"
61
61
  label-placement="right"
62
62
  />
63
+ <FmSwitch
64
+ v-if="isAdmin"
65
+ v-model="dineInSetting.acceptReservation as boolean"
66
+ value="acceptReservation"
67
+ :label="t('order.acceptReservation')"
68
+ :sublabel="t('order.acceptReservationSublabel')"
69
+ label-placement="right"
70
+ />
63
71
 
64
72
  <FmSwitch
65
73
  :model-value="lastOrderBeforeCloseEnable"
@@ -201,8 +209,10 @@ const { t } = useI18n()
201
209
 
202
210
  type OrderDineInSettings = NonNullable<OrderSettingsDto['dineInSettings']>
203
211
 
204
- const { currentRestaurant } = useCoreStore()
212
+ const { currentRestaurant, sessionUser } = useCoreStore()
205
213
  const restaurantStore = useRestaurantStore()
214
+ // Reservations are switched on per outlet by FeedMe admins during the pilot.
215
+ const isAdmin = computed(() => sessionUser.value?.role?.isAdmin ?? false)
206
216
  const dineInSetting = ref<FdoRestaurantDineIn>(initDineInSetting())
207
217
  const orderSetting = ref<OrderSettingsDto | undefined>(undefined)
208
218
  const lastOrderBeforeCloseEnable = ref<boolean>(false)