feat: Add IntegrationRepository and ShopProClient for managing integrations and fetching products from shopPRO API
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
:root{--c-primary: #6690f4;--c-primary-dark: #3164db;--c-bg: #f4f6f9;--c-surface: #ffffff;--c-text: #4e5e6a;--c-text-strong: #2d3748;--c-muted: #718096;--c-border: #e2e8f0;--c-danger: #cc0000;--focus-ring: 0 0 0 3px rgba(102, 144, 244, 0.15);--shadow-card: 0 1px 4px rgba(0, 0, 0, 0.06)}.btn{display:inline-flex;align-items:center;justify-content:center;min-height:38px;padding:8px 16px;border:1px solid rgba(0,0,0,0);border-radius:8px;font:inherit;font-weight:600;text-decoration:none;cursor:pointer;transition:background-color .2s ease,border-color .2s ease,color .2s ease,transform .1s ease}.btn--primary{color:#fff;background:var(--c-primary)}.btn--primary:hover{background:var(--c-primary-dark)}.btn--secondary{color:var(--c-text-strong);border-color:var(--c-border);background:var(--c-surface)}.btn--secondary:hover{border-color:#cbd5e0;background:#f8fafc}.btn--block{width:100%}.btn:active{transform:translateY(1px)}.btn:focus-visible{outline:none;box-shadow:var(--focus-ring);border-color:var(--c-primary)}.form-control{width:100%;min-height:38px;border:1px solid var(--c-border);border-radius:8px;padding:7px 12px;font:inherit;color:var(--c-text-strong);background:#fff;transition:border-color .2s ease,box-shadow .2s ease}.form-control:focus{outline:none;border-color:var(--c-primary);box-shadow:var(--focus-ring)}.alert{padding:12px 14px;border-radius:8px;border:1px solid rgba(0,0,0,0);font-size:13px;min-height:44px}.alert--danger{border-color:#fed7d7;background:#fff5f5;color:var(--c-danger)}.alert--success{border-color:#b7ebcf;background:#f0fff6;color:#0f6b39}.alert--warning{border-color:#f7dd8b;background:#fff8e8;color:#815500}.form-field{display:grid;gap:7px}.field-label{color:var(--c-text-strong);font-size:13px;font-weight:600}.table-wrap{width:100%;overflow-x:auto}.table{width:100%;border-collapse:collapse;background:var(--c-surface)}.table th,.table td{padding:10px 12px;border-bottom:1px solid var(--c-border);text-align:left}.table th{color:var(--c-text-strong);font-weight:700;background:#f8fafc}.pagination{display:flex;align-items:center;flex-wrap:wrap;gap:8px}.pagination__item{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 10px;border-radius:8px;border:1px solid var(--c-border);color:var(--c-text-strong);background:var(--c-surface);text-decoration:none;font-weight:600}.pagination__item:hover{border-color:#cbd5e0;background:#f8fafc}.pagination__item.is-active{border-color:var(--c-primary);color:var(--c-primary);background:#edf2ff}:root{--shadow-card: 0 20px 50px rgba(22, 34, 58, 0.14)}*{box-sizing:border-box}html,body{min-height:100%}body{margin:0;font-family:"Roboto","Segoe UI",sans-serif;color:var(--c-text);background:var(--c-bg);overflow-x:hidden}.bg-orb{position:fixed;width:460px;height:460px;border-radius:999px;filter:blur(28px);z-index:0;opacity:.45;pointer-events:none}.bg-orb-left{top:-200px;left:-180px;background:radial-gradient(circle, rgba(102, 144, 244, 0.48) 0%, rgba(102, 144, 244, 0) 70%)}.bg-orb-right{right:-200px;bottom:-220px;background:radial-gradient(circle, rgba(30, 42, 58, 0.36) 0%, rgba(30, 42, 58, 0) 70%)}.login-page{min-height:100vh;display:grid;place-items:center;padding:32px 20px;position:relative;z-index:1}.login-card{width:100%;max-width:430px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:12px;box-shadow:var(--shadow-card);padding:34px 30px 28px;animation:card-enter 420ms ease-out}.login-header{margin-bottom:24px}.login-badge{display:inline-block;margin:0 0 14px;padding:5px 12px;border-radius:999px;border:1px solid #d9e2ff;background:#eef2ff;color:#3f5faf;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em}h1{margin:0;color:var(--c-text-strong);font-size:clamp(1.6rem,2.5vw,1.9rem);line-height:1.15;font-weight:700}.login-subtitle{margin:10px 0 0;font-size:15px;line-height:1.55;color:var(--c-muted)}.login-alert{margin-bottom:18px}.login-alert-placeholder{opacity:.56}.login-form{display:grid;gap:16px}.form-field{display:grid;gap:7px}.field-label{color:var(--c-text-strong);font-size:13px;font-weight:600}.login-form .form-control{min-height:46px;padding:0 14px;border-width:2px}.login-form .form-control::placeholder{color:#cbd5e0}.login-submit{margin-top:2px;font-size:15px;min-height:48px}@keyframes card-enter{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@media(max-width: 640px){.login-page{padding:18px 14px}.login-card{padding:24px 20px 20px}h1{font-size:1.55rem}}
|
||||
:root{--c-primary: #6690f4;--c-primary-dark: #3164db;--c-bg: #f4f6f9;--c-surface: #ffffff;--c-text: #4e5e6a;--c-text-strong: #2d3748;--c-muted: #718096;--c-border: #e2e8f0;--c-danger: #cc0000;--focus-ring: 0 0 0 3px rgba(102, 144, 244, 0.15);--shadow-card: 0 1px 4px rgba(0, 0, 0, 0.06)}.btn{display:inline-flex;align-items:center;justify-content:center;min-height:38px;padding:8px 16px;border:1px solid rgba(0,0,0,0);border-radius:8px;font:inherit;font-weight:600;text-decoration:none;cursor:pointer;transition:background-color .2s ease,border-color .2s ease,color .2s ease,transform .1s ease}.btn--primary{color:#fff;background:var(--c-primary)}.btn--primary:hover{background:var(--c-primary-dark)}.btn--secondary{color:var(--c-text-strong);border-color:var(--c-border);background:var(--c-surface)}.btn--secondary:hover{border-color:#cbd5e0;background:#f8fafc}.btn--danger{color:#fff;border-color:#b91c1c;background:#dc2626}.btn--danger:hover{border-color:#991b1b;background:#b91c1c}.btn--block{width:100%}.btn:active{transform:translateY(1px)}.btn:focus-visible{outline:none;box-shadow:var(--focus-ring);border-color:var(--c-primary)}.form-control{width:100%;min-height:38px;border:1px solid var(--c-border);border-radius:8px;padding:7px 12px;font:inherit;color:var(--c-text-strong);background:#fff;transition:border-color .2s ease,box-shadow .2s ease}.form-control:focus{outline:none;border-color:var(--c-primary);box-shadow:var(--focus-ring)}.alert{padding:12px 14px;border-radius:8px;border:1px solid rgba(0,0,0,0);font-size:13px;min-height:44px}.alert--danger{border-color:#fed7d7;background:#fff5f5;color:var(--c-danger)}.alert--success{border-color:#b7ebcf;background:#f0fff6;color:#0f6b39}.alert--warning{border-color:#f7dd8b;background:#fff8e8;color:#815500}.form-field{display:grid;gap:7px}.field-label{color:var(--c-text-strong);font-size:13px;font-weight:600}.table-wrap{width:100%;overflow-x:auto}.table{width:100%;border-collapse:collapse;background:var(--c-surface)}.table th,.table td{padding:10px 12px;border-bottom:1px solid var(--c-border);text-align:left}.table th{color:var(--c-text-strong);font-weight:700;background:#f8fafc}.pagination{display:flex;align-items:center;flex-wrap:wrap;gap:8px}.pagination__item{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 10px;border-radius:8px;border:1px solid var(--c-border);color:var(--c-text-strong);background:var(--c-surface);text-decoration:none;font-weight:600}.pagination__item:hover{border-color:#cbd5e0;background:#f8fafc}.pagination__item.is-active{border-color:var(--c-primary);color:var(--c-primary);background:#edf2ff}:root{--shadow-card: 0 20px 50px rgba(22, 34, 58, 0.14)}*{box-sizing:border-box}html,body{min-height:100%}body{margin:0;font-family:"Roboto","Segoe UI",sans-serif;color:var(--c-text);background:var(--c-bg);overflow-x:hidden}.bg-orb{position:fixed;width:460px;height:460px;border-radius:999px;filter:blur(28px);z-index:0;opacity:.45;pointer-events:none}.bg-orb-left{top:-200px;left:-180px;background:radial-gradient(circle, rgba(102, 144, 244, 0.48) 0%, rgba(102, 144, 244, 0) 70%)}.bg-orb-right{right:-200px;bottom:-220px;background:radial-gradient(circle, rgba(30, 42, 58, 0.36) 0%, rgba(30, 42, 58, 0) 70%)}.login-page{min-height:100vh;display:grid;place-items:center;padding:32px 20px;position:relative;z-index:1}.login-card{width:100%;max-width:430px;background:var(--c-surface);border:1px solid var(--c-border);border-radius:12px;box-shadow:var(--shadow-card);padding:34px 30px 28px;animation:card-enter 420ms ease-out}.login-header{margin-bottom:24px}.login-badge{display:inline-block;margin:0 0 14px;padding:5px 12px;border-radius:999px;border:1px solid #d9e2ff;background:#eef2ff;color:#3f5faf;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em}h1{margin:0;color:var(--c-text-strong);font-size:clamp(1.6rem,2.5vw,1.9rem);line-height:1.15;font-weight:700}.login-subtitle{margin:10px 0 0;font-size:15px;line-height:1.55;color:var(--c-muted)}.login-alert{margin-bottom:18px}.login-alert-placeholder{opacity:.56}.login-form{display:grid;gap:16px}.form-field{display:grid;gap:7px}.field-label{color:var(--c-text-strong);font-size:13px;font-weight:600}.login-form .form-control{min-height:46px;padding:0 14px;border-width:2px}.login-form .form-control::placeholder{color:#cbd5e0}.login-submit{margin-top:2px;font-size:15px;min-height:48px}@keyframes card-enter{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@media(max-width: 640px){.login-page{padding:18px 14px}.login-card{padding:24px 20px 20px}h1{font-size:1.55rem}}
|
||||
|
||||
@@ -1 +1 @@
|
||||
.jq-alert{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:12px;padding:12px 14px;border:1px solid rgba(0,0,0,0);border-radius:8px;font-size:14px;opacity:0;transform:translateY(4px);transition:opacity .18s ease,transform .18s ease}.jq-alert.is-visible{opacity:1;transform:translateY(0)}.jq-alert--info{color:#1e3a8a;background:#eff6ff;border-color:#bfdbfe}.jq-alert--success{color:#065f46;background:#ecfdf5;border-color:#a7f3d0}.jq-alert--warning{color:#92400e;background:#fffbeb;border-color:#fde68a}.jq-alert--error{color:#991b1b;background:#fef2f2;border-color:#fecaca}.jq-alert__content{flex:1}.jq-alert__close{appearance:none;border:0;padding:0;line-height:1;font-size:18px;cursor:pointer;color:inherit;background:rgba(0,0,0,0)}
|
||||
.jq-alert-host{position:fixed;top:16px;right:16px;z-index:300;width:min(420px,100vw - 32px)}.jq-alert{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:12px;padding:12px 14px;border:1px solid rgba(0,0,0,0);border-radius:8px;font-size:14px;opacity:0;transform:translateY(4px);transition:opacity .18s ease,transform .18s ease}.jq-alert.is-visible{opacity:1;transform:translateY(0)}.jq-alert--info{color:#1e3a8a;background:#eff6ff;border-color:#bfdbfe}.jq-alert--success{color:#065f46;background:#ecfdf5;border-color:#a7f3d0}.jq-alert--warning{color:#92400e;background:#fffbeb;border-color:#fde68a}.jq-alert--error{color:#991b1b;background:#fef2f2;border-color:#fecaca}.jq-alert__content{flex:1}.jq-alert__close{appearance:none;border:0;padding:0;line-height:1;font-size:18px;cursor:pointer;color:inherit;background:rgba(0,0,0,0)}.jq-alert-modal-backdrop{position:fixed;inset:0;z-index:310;display:flex;align-items:center;justify-content:center;padding:16px;background:rgba(15,23,42,.5);opacity:0;transition:opacity .18s ease}.jq-alert-modal-backdrop.is-visible{opacity:1}.jq-alert-modal{width:min(520px,100%);border-radius:10px;border:1px solid #dbe3ee;background:#fff;box-shadow:0 18px 42px rgba(15,23,42,.3)}.jq-alert-modal__header{padding:14px 16px;border-bottom:1px solid #e2e8f0}.jq-alert-modal__header h3{margin:0;color:#2d3748;font-size:18px}.jq-alert-modal__body{padding:14px 16px;color:#4e5e6a;line-height:1.45}.jq-alert-modal__footer{display:flex;justify-content:flex-end;gap:8px;padding:0 16px 14px}
|
||||
|
||||
230
public/assets/js/modules/jquery-alerts.js
vendored
230
public/assets/js/modules/jquery-alerts.js
vendored
@@ -1,17 +1,17 @@
|
||||
"use strict";
|
||||
|
||||
(function (factory) {
|
||||
if (typeof module === "object" && module.exports) {
|
||||
module.exports = factory;
|
||||
if (typeof module === "object" && module.exports && typeof window === "undefined") {
|
||||
module.exports = factory(null, null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof window.jQuery !== "undefined") {
|
||||
factory(window.jQuery);
|
||||
}
|
||||
})(function ($) {
|
||||
if (!$ || !$.fn) {
|
||||
return;
|
||||
var win = typeof window !== "undefined" ? window : null;
|
||||
var $ = win && typeof win.jQuery !== "undefined" ? win.jQuery : null;
|
||||
factory($, win);
|
||||
})(function ($, win) {
|
||||
if (!win || !win.document) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const DEFAULTS = {
|
||||
@@ -21,52 +21,190 @@
|
||||
classPrefix: "jq-alert",
|
||||
};
|
||||
|
||||
function removeAlert($el) {
|
||||
$el.removeClass("is-visible");
|
||||
window.setTimeout(function () {
|
||||
$el.remove();
|
||||
function removeAlert(el) {
|
||||
if (!el) {
|
||||
return;
|
||||
}
|
||||
el.classList.remove("is-visible");
|
||||
win.setTimeout(function () {
|
||||
if (el.parentNode) {
|
||||
el.parentNode.removeChild(el);
|
||||
}
|
||||
}, 180);
|
||||
}
|
||||
|
||||
$.fn.orderProAlert = function (options) {
|
||||
const settings = $.extend({}, DEFAULTS, options);
|
||||
function createElement(tag, className) {
|
||||
var el = win.document.createElement(tag);
|
||||
if (className) {
|
||||
el.className = className;
|
||||
}
|
||||
return el;
|
||||
}
|
||||
|
||||
return this.each(function () {
|
||||
const $host = $(this);
|
||||
const $alert = $("<div>", {
|
||||
class: settings.classPrefix + " " + settings.classPrefix + "--" + settings.type + " is-visible",
|
||||
role: "alert",
|
||||
function getGlobalHost() {
|
||||
var id = "jq-alert-host";
|
||||
var existing = win.document.getElementById(id);
|
||||
if (existing) {
|
||||
return existing;
|
||||
}
|
||||
|
||||
var host = createElement("div", "jq-alert-host");
|
||||
host.id = id;
|
||||
win.document.body.appendChild(host);
|
||||
return host;
|
||||
}
|
||||
|
||||
function renderAlert(host, options) {
|
||||
var settings = Object.assign({}, DEFAULTS, options || {});
|
||||
var alertEl = createElement(
|
||||
"div",
|
||||
settings.classPrefix + " " + settings.classPrefix + "--" + settings.type + " is-visible"
|
||||
);
|
||||
alertEl.setAttribute("role", "alert");
|
||||
|
||||
var content = createElement("div", settings.classPrefix + "__content");
|
||||
content.textContent = String(settings.message || "");
|
||||
alertEl.appendChild(content);
|
||||
|
||||
if (settings.dismissible) {
|
||||
var close = createElement("button", settings.classPrefix + "__close");
|
||||
close.type = "button";
|
||||
close.setAttribute("aria-label", "Close alert");
|
||||
close.textContent = "x";
|
||||
close.addEventListener("click", function () {
|
||||
removeAlert(alertEl);
|
||||
});
|
||||
alertEl.appendChild(close);
|
||||
}
|
||||
|
||||
const $content = $("<div>", {
|
||||
class: settings.classPrefix + "__content",
|
||||
text: String(settings.message || ""),
|
||||
host.appendChild(alertEl);
|
||||
|
||||
if (settings.timeout > 0) {
|
||||
win.setTimeout(function () {
|
||||
removeAlert(alertEl);
|
||||
}, settings.timeout);
|
||||
}
|
||||
|
||||
return alertEl;
|
||||
}
|
||||
|
||||
function show(options) {
|
||||
return renderAlert(getGlobalHost(), options);
|
||||
}
|
||||
|
||||
function closeConfirm(backdrop, resolve, value) {
|
||||
if (!backdrop || backdrop.getAttribute("data-closed") === "1") {
|
||||
return;
|
||||
}
|
||||
backdrop.setAttribute("data-closed", "1");
|
||||
backdrop.classList.remove("is-visible");
|
||||
win.setTimeout(function () {
|
||||
if (backdrop.parentNode) {
|
||||
backdrop.parentNode.removeChild(backdrop);
|
||||
}
|
||||
resolve(value);
|
||||
}, 180);
|
||||
}
|
||||
|
||||
function confirm(options) {
|
||||
var settings = Object.assign(
|
||||
{
|
||||
title: "Potwierdzenie",
|
||||
message: "",
|
||||
confirmLabel: "Potwierdz",
|
||||
cancelLabel: "Anuluj",
|
||||
danger: false,
|
||||
},
|
||||
options || {}
|
||||
);
|
||||
|
||||
return new Promise(function (resolve) {
|
||||
var backdrop = createElement("div", "jq-alert-modal-backdrop is-visible");
|
||||
var modal = createElement("div", "jq-alert-modal");
|
||||
modal.setAttribute("role", "dialog");
|
||||
modal.setAttribute("aria-modal", "true");
|
||||
|
||||
var titleId = "jq-alert-modal-title-" + Date.now();
|
||||
modal.setAttribute("aria-labelledby", titleId);
|
||||
|
||||
var header = createElement("div", "jq-alert-modal__header");
|
||||
var title = createElement("h3");
|
||||
title.id = titleId;
|
||||
title.textContent = String(settings.title || "");
|
||||
header.appendChild(title);
|
||||
|
||||
var body = createElement("div", "jq-alert-modal__body");
|
||||
body.textContent = String(settings.message || "");
|
||||
|
||||
var footer = createElement("div", "jq-alert-modal__footer");
|
||||
var cancelButton = createElement("button", "btn btn--secondary");
|
||||
cancelButton.type = "button";
|
||||
cancelButton.textContent = String(settings.cancelLabel || "Anuluj");
|
||||
var confirmButton = createElement(
|
||||
"button",
|
||||
settings.danger ? "btn btn--danger" : "btn btn--primary"
|
||||
);
|
||||
confirmButton.type = "button";
|
||||
confirmButton.textContent = String(settings.confirmLabel || "Potwierdz");
|
||||
footer.appendChild(cancelButton);
|
||||
footer.appendChild(confirmButton);
|
||||
|
||||
modal.appendChild(header);
|
||||
modal.appendChild(body);
|
||||
modal.appendChild(footer);
|
||||
backdrop.appendChild(modal);
|
||||
win.document.body.appendChild(backdrop);
|
||||
|
||||
var onKeyDown = function (event) {
|
||||
if (event.key === "Escape") {
|
||||
onCancel();
|
||||
}
|
||||
};
|
||||
var cleanup = function () {
|
||||
win.document.removeEventListener("keydown", onKeyDown);
|
||||
};
|
||||
|
||||
var onConfirm = function () {
|
||||
cleanup();
|
||||
if (typeof settings.onConfirm === "function") {
|
||||
settings.onConfirm();
|
||||
}
|
||||
closeConfirm(backdrop, resolve, true);
|
||||
};
|
||||
var onCancel = function () {
|
||||
cleanup();
|
||||
if (typeof settings.onCancel === "function") {
|
||||
settings.onCancel();
|
||||
}
|
||||
closeConfirm(backdrop, resolve, false);
|
||||
};
|
||||
|
||||
confirmButton.addEventListener("click", onConfirm);
|
||||
cancelButton.addEventListener("click", onCancel);
|
||||
backdrop.addEventListener("click", function (event) {
|
||||
if (event.target === backdrop) {
|
||||
onCancel();
|
||||
}
|
||||
});
|
||||
win.document.addEventListener("keydown", onKeyDown);
|
||||
|
||||
$alert.append($content);
|
||||
|
||||
if (settings.dismissible) {
|
||||
const $close = $("<button>", {
|
||||
class: settings.classPrefix + "__close",
|
||||
type: "button",
|
||||
"aria-label": "Close alert",
|
||||
text: "x",
|
||||
});
|
||||
|
||||
$close.on("click", function () {
|
||||
removeAlert($alert);
|
||||
});
|
||||
|
||||
$alert.append($close);
|
||||
}
|
||||
|
||||
$host.append($alert);
|
||||
|
||||
if (settings.timeout > 0) {
|
||||
window.setTimeout(function () {
|
||||
removeAlert($alert);
|
||||
}, settings.timeout);
|
||||
}
|
||||
confirmButton.focus();
|
||||
});
|
||||
}
|
||||
|
||||
win.OrderProAlerts = {
|
||||
show: show,
|
||||
confirm: confirm,
|
||||
};
|
||||
|
||||
if ($ && $.fn) {
|
||||
$.fn.orderProAlert = function (options) {
|
||||
var settings = $.extend({}, DEFAULTS, options);
|
||||
return this.each(function () {
|
||||
renderAlert(this, settings);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
return win.OrderProAlerts;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user