Add coexistence checks to all enqueue methods to prevent loading both React and Grid.js assets simultaneously. Changes: - ReactAdmin.php: Only enqueue React assets when ?react=1 - Init.php: Skip Grid.js when React active on admin pages - Form.php, Coupon.php, Access.php: Restore classic assets when ?react=0 - Customer.php, Product.php, License.php: Add coexistence checks Now the toggle between Classic and React versions works correctly. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
604 lines
21 KiB
JavaScript
604 lines
21 KiB
JavaScript
System.register(['valtio/vanilla'], (function (exports) {
|
|
'use strict';
|
|
var subscribe, snapshot, proxy, getVersion, ref;
|
|
return {
|
|
setters: [function (module) {
|
|
subscribe = module.subscribe;
|
|
snapshot = module.snapshot;
|
|
proxy = module.proxy;
|
|
getVersion = module.getVersion;
|
|
ref = module.ref;
|
|
}],
|
|
execute: (function () {
|
|
|
|
exports({
|
|
addComputed: addComputed_DEPRECATED,
|
|
derive: derive,
|
|
devtools: devtools,
|
|
proxyMap: proxyMap,
|
|
proxySet: proxySet,
|
|
proxyWithComputed: proxyWithComputed,
|
|
proxyWithHistory: proxyWithHistory,
|
|
subscribeKey: subscribeKey,
|
|
underive: underive,
|
|
watch: watch
|
|
});
|
|
|
|
function subscribeKey(proxyObject, key, callback, notifyInSync) {
|
|
return subscribe(
|
|
proxyObject,
|
|
(ops) => {
|
|
if (ops.some((op) => op[1][0] === key)) {
|
|
callback(proxyObject[key]);
|
|
}
|
|
},
|
|
notifyInSync
|
|
);
|
|
}
|
|
|
|
let currentCleanups;
|
|
function watch(callback, options) {
|
|
let alive = true;
|
|
const cleanups = /* @__PURE__ */ new Set();
|
|
const subscriptions = /* @__PURE__ */ new Map();
|
|
const cleanup = () => {
|
|
if (alive) {
|
|
alive = false;
|
|
cleanups.forEach((clean) => clean());
|
|
cleanups.clear();
|
|
subscriptions.forEach((unsubscribe) => unsubscribe());
|
|
subscriptions.clear();
|
|
}
|
|
};
|
|
const revalidate = () => {
|
|
if (!alive) {
|
|
return;
|
|
}
|
|
cleanups.forEach((clean) => clean());
|
|
cleanups.clear();
|
|
const proxiesToSubscribe = /* @__PURE__ */ new Set();
|
|
const parent = currentCleanups;
|
|
currentCleanups = cleanups;
|
|
try {
|
|
const cleanupReturn = callback((proxyObject) => {
|
|
proxiesToSubscribe.add(proxyObject);
|
|
return proxyObject;
|
|
});
|
|
if (cleanupReturn) {
|
|
cleanups.add(cleanupReturn);
|
|
}
|
|
} finally {
|
|
currentCleanups = parent;
|
|
}
|
|
subscriptions.forEach((unsubscribe, proxyObject) => {
|
|
if (proxiesToSubscribe.has(proxyObject)) {
|
|
proxiesToSubscribe.delete(proxyObject);
|
|
} else {
|
|
subscriptions.delete(proxyObject);
|
|
unsubscribe();
|
|
}
|
|
});
|
|
proxiesToSubscribe.forEach((proxyObject) => {
|
|
const unsubscribe = subscribe(proxyObject, revalidate, options == null ? void 0 : options.sync);
|
|
subscriptions.set(proxyObject, unsubscribe);
|
|
});
|
|
};
|
|
if (currentCleanups) {
|
|
currentCleanups.add(cleanup);
|
|
}
|
|
revalidate();
|
|
return cleanup;
|
|
}
|
|
|
|
const DEVTOOLS = Symbol();
|
|
function devtools(proxyObject, options) {
|
|
if (typeof options === "string") {
|
|
console.warn(
|
|
"string name option is deprecated, use { name }. https://github.com/pmndrs/valtio/pull/400"
|
|
);
|
|
options = { name: options };
|
|
}
|
|
const { enabled, name = "" } = options || {};
|
|
let extension;
|
|
try {
|
|
extension = (enabled != null ? enabled : true) && window.__REDUX_DEVTOOLS_EXTENSION__;
|
|
} catch {
|
|
}
|
|
if (!extension) {
|
|
if (enabled) {
|
|
console.warn("[Warning] Please install/enable Redux devtools extension");
|
|
}
|
|
return;
|
|
}
|
|
let isTimeTraveling = false;
|
|
const devtools2 = extension.connect({ name });
|
|
const unsub1 = subscribe(proxyObject, (ops) => {
|
|
const action = ops.filter(([_, path]) => path[0] !== DEVTOOLS).map(([op, path]) => `${op}:${path.map(String).join(".")}`).join(", ");
|
|
if (!action) {
|
|
return;
|
|
}
|
|
if (isTimeTraveling) {
|
|
isTimeTraveling = false;
|
|
} else {
|
|
const snapWithoutDevtools = Object.assign({}, snapshot(proxyObject));
|
|
delete snapWithoutDevtools[DEVTOOLS];
|
|
devtools2.send(
|
|
{
|
|
type: action,
|
|
updatedAt: new Date().toLocaleString()
|
|
},
|
|
snapWithoutDevtools
|
|
);
|
|
}
|
|
});
|
|
const unsub2 = devtools2.subscribe((message) => {
|
|
var _a, _b, _c, _d, _e, _f;
|
|
if (message.type === "ACTION" && message.payload) {
|
|
try {
|
|
Object.assign(proxyObject, JSON.parse(message.payload));
|
|
} catch (e) {
|
|
console.error(
|
|
"please dispatch a serializable value that JSON.parse() and proxy() support\n",
|
|
e
|
|
);
|
|
}
|
|
}
|
|
if (message.type === "DISPATCH" && message.state) {
|
|
if (((_a = message.payload) == null ? void 0 : _a.type) === "JUMP_TO_ACTION" || ((_b = message.payload) == null ? void 0 : _b.type) === "JUMP_TO_STATE") {
|
|
isTimeTraveling = true;
|
|
const state = JSON.parse(message.state);
|
|
Object.assign(proxyObject, state);
|
|
}
|
|
proxyObject[DEVTOOLS] = message;
|
|
} else if (message.type === "DISPATCH" && ((_c = message.payload) == null ? void 0 : _c.type) === "COMMIT") {
|
|
devtools2.init(snapshot(proxyObject));
|
|
} else if (message.type === "DISPATCH" && ((_d = message.payload) == null ? void 0 : _d.type) === "IMPORT_STATE") {
|
|
const actions = (_e = message.payload.nextLiftedState) == null ? void 0 : _e.actionsById;
|
|
const computedStates = ((_f = message.payload.nextLiftedState) == null ? void 0 : _f.computedStates) || [];
|
|
isTimeTraveling = true;
|
|
computedStates.forEach(({ state }, index) => {
|
|
const action = actions[index] || "No action found";
|
|
Object.assign(proxyObject, state);
|
|
if (index === 0) {
|
|
devtools2.init(snapshot(proxyObject));
|
|
} else {
|
|
devtools2.send(action, snapshot(proxyObject));
|
|
}
|
|
});
|
|
}
|
|
});
|
|
devtools2.init(snapshot(proxyObject));
|
|
return () => {
|
|
unsub1();
|
|
unsub2 == null ? void 0 : unsub2();
|
|
};
|
|
}
|
|
|
|
const sourceObjectMap = /* @__PURE__ */ new WeakMap();
|
|
const derivedObjectMap = /* @__PURE__ */ new WeakMap();
|
|
const markPending = (sourceObject, callback) => {
|
|
const sourceObjectEntry = sourceObjectMap.get(sourceObject);
|
|
if (sourceObjectEntry) {
|
|
sourceObjectEntry[0].forEach((subscription) => {
|
|
const { d: derivedObject } = subscription;
|
|
if (sourceObject !== derivedObject) {
|
|
markPending(derivedObject);
|
|
}
|
|
});
|
|
++sourceObjectEntry[2];
|
|
if (callback) {
|
|
sourceObjectEntry[3].add(callback);
|
|
}
|
|
}
|
|
};
|
|
const checkPending = (sourceObject, callback) => {
|
|
const sourceObjectEntry = sourceObjectMap.get(sourceObject);
|
|
if (sourceObjectEntry == null ? void 0 : sourceObjectEntry[2]) {
|
|
sourceObjectEntry[3].add(callback);
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
const unmarkPending = (sourceObject) => {
|
|
const sourceObjectEntry = sourceObjectMap.get(sourceObject);
|
|
if (sourceObjectEntry) {
|
|
--sourceObjectEntry[2];
|
|
if (!sourceObjectEntry[2]) {
|
|
sourceObjectEntry[3].forEach((callback) => callback());
|
|
sourceObjectEntry[3].clear();
|
|
}
|
|
sourceObjectEntry[0].forEach((subscription) => {
|
|
const { d: derivedObject } = subscription;
|
|
if (sourceObject !== derivedObject) {
|
|
unmarkPending(derivedObject);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
const addSubscription = (subscription) => {
|
|
const { s: sourceObject, d: derivedObject } = subscription;
|
|
let derivedObjectEntry = derivedObjectMap.get(derivedObject);
|
|
if (!derivedObjectEntry) {
|
|
derivedObjectEntry = [/* @__PURE__ */ new Set()];
|
|
derivedObjectMap.set(subscription.d, derivedObjectEntry);
|
|
}
|
|
derivedObjectEntry[0].add(subscription);
|
|
let sourceObjectEntry = sourceObjectMap.get(sourceObject);
|
|
if (!sourceObjectEntry) {
|
|
const subscriptions = /* @__PURE__ */ new Set();
|
|
const unsubscribe = subscribe(
|
|
sourceObject,
|
|
(ops) => {
|
|
subscriptions.forEach((subscription2) => {
|
|
const {
|
|
d: derivedObject2,
|
|
c: callback,
|
|
n: notifyInSync,
|
|
i: ignoreKeys
|
|
} = subscription2;
|
|
if (sourceObject === derivedObject2 && ops.every(
|
|
(op) => op[1].length === 1 && ignoreKeys.includes(op[1][0])
|
|
)) {
|
|
return;
|
|
}
|
|
if (subscription2.p) {
|
|
return;
|
|
}
|
|
markPending(sourceObject, callback);
|
|
if (notifyInSync) {
|
|
unmarkPending(sourceObject);
|
|
} else {
|
|
subscription2.p = Promise.resolve().then(() => {
|
|
delete subscription2.p;
|
|
unmarkPending(sourceObject);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
true
|
|
);
|
|
sourceObjectEntry = [subscriptions, unsubscribe, 0, /* @__PURE__ */ new Set()];
|
|
sourceObjectMap.set(sourceObject, sourceObjectEntry);
|
|
}
|
|
sourceObjectEntry[0].add(subscription);
|
|
};
|
|
const removeSubscription = (subscription) => {
|
|
const { s: sourceObject, d: derivedObject } = subscription;
|
|
const derivedObjectEntry = derivedObjectMap.get(derivedObject);
|
|
derivedObjectEntry == null ? void 0 : derivedObjectEntry[0].delete(subscription);
|
|
if ((derivedObjectEntry == null ? void 0 : derivedObjectEntry[0].size) === 0) {
|
|
derivedObjectMap.delete(derivedObject);
|
|
}
|
|
const sourceObjectEntry = sourceObjectMap.get(sourceObject);
|
|
if (sourceObjectEntry) {
|
|
const [subscriptions, unsubscribe] = sourceObjectEntry;
|
|
subscriptions.delete(subscription);
|
|
if (!subscriptions.size) {
|
|
unsubscribe();
|
|
sourceObjectMap.delete(sourceObject);
|
|
}
|
|
}
|
|
};
|
|
const listSubscriptions = (derivedObject) => {
|
|
const derivedObjectEntry = derivedObjectMap.get(derivedObject);
|
|
if (derivedObjectEntry) {
|
|
return Array.from(derivedObjectEntry[0]);
|
|
}
|
|
return [];
|
|
};
|
|
const unstable_deriveSubscriptions = exports('unstable_deriveSubscriptions', {
|
|
add: addSubscription,
|
|
remove: removeSubscription,
|
|
list: listSubscriptions
|
|
});
|
|
function derive(derivedFns, options) {
|
|
const proxyObject = (options == null ? void 0 : options.proxy) || proxy({});
|
|
const notifyInSync = !!(options == null ? void 0 : options.sync);
|
|
const derivedKeys = Object.keys(derivedFns);
|
|
derivedKeys.forEach((key) => {
|
|
if (Object.getOwnPropertyDescriptor(proxyObject, key)) {
|
|
throw new Error("object property already defined");
|
|
}
|
|
const fn = derivedFns[key];
|
|
let lastDependencies = null;
|
|
const evaluate = () => {
|
|
if (lastDependencies) {
|
|
if (Array.from(lastDependencies).map(([p]) => checkPending(p, evaluate)).some((isPending) => isPending)) {
|
|
return;
|
|
}
|
|
if (Array.from(lastDependencies).every(
|
|
([p, entry]) => getVersion(p) === entry.v
|
|
)) {
|
|
return;
|
|
}
|
|
}
|
|
const dependencies = /* @__PURE__ */ new Map();
|
|
const get = (p) => {
|
|
dependencies.set(p, { v: getVersion(p) });
|
|
return p;
|
|
};
|
|
const value = fn(get);
|
|
const subscribeToDependencies = () => {
|
|
dependencies.forEach((entry, p) => {
|
|
var _a;
|
|
const lastSubscription = (_a = lastDependencies == null ? void 0 : lastDependencies.get(p)) == null ? void 0 : _a.s;
|
|
if (lastSubscription) {
|
|
entry.s = lastSubscription;
|
|
} else {
|
|
const subscription = {
|
|
s: p,
|
|
d: proxyObject,
|
|
k: key,
|
|
c: evaluate,
|
|
n: notifyInSync,
|
|
i: derivedKeys
|
|
};
|
|
addSubscription(subscription);
|
|
entry.s = subscription;
|
|
}
|
|
});
|
|
lastDependencies == null ? void 0 : lastDependencies.forEach((entry, p) => {
|
|
if (!dependencies.has(p) && entry.s) {
|
|
removeSubscription(entry.s);
|
|
}
|
|
});
|
|
lastDependencies = dependencies;
|
|
};
|
|
if (value instanceof Promise) {
|
|
value.finally(subscribeToDependencies);
|
|
} else {
|
|
subscribeToDependencies();
|
|
}
|
|
proxyObject[key] = value;
|
|
};
|
|
evaluate();
|
|
});
|
|
return proxyObject;
|
|
}
|
|
function underive(proxyObject, options) {
|
|
const keysToDelete = (options == null ? void 0 : options.delete) ? /* @__PURE__ */ new Set() : null;
|
|
listSubscriptions(proxyObject).forEach((subscription) => {
|
|
const { k: key } = subscription;
|
|
if (!(options == null ? void 0 : options.keys) || options.keys.includes(key)) {
|
|
removeSubscription(subscription);
|
|
if (keysToDelete) {
|
|
keysToDelete.add(key);
|
|
}
|
|
}
|
|
});
|
|
if (keysToDelete) {
|
|
keysToDelete.forEach((key) => {
|
|
delete proxyObject[key];
|
|
});
|
|
}
|
|
}
|
|
|
|
function addComputed_DEPRECATED(proxyObject, computedFns_FAKE, targetObject = proxyObject) {
|
|
console.warn(
|
|
"addComputed is deprecated. Please consider using `derive` or `proxyWithComputed` instead. Falling back to emulation with derive. https://github.com/pmndrs/valtio/pull/201"
|
|
);
|
|
const derivedFns = {};
|
|
Object.keys(computedFns_FAKE).forEach((key) => {
|
|
derivedFns[key] = (get) => computedFns_FAKE[key](get(proxyObject));
|
|
});
|
|
return derive(derivedFns, { proxy: targetObject });
|
|
}
|
|
|
|
function proxyWithComputed(initialObject, computedFns) {
|
|
Object.keys(computedFns).forEach((key) => {
|
|
if (Object.getOwnPropertyDescriptor(initialObject, key)) {
|
|
throw new Error("object property already defined");
|
|
}
|
|
const computedFn = computedFns[key];
|
|
const { get, set } = typeof computedFn === "function" ? { get: computedFn } : computedFn;
|
|
const desc = {};
|
|
desc.get = () => get(snapshot(proxyObject));
|
|
if (set) {
|
|
desc.set = (newValue) => set(proxyObject, newValue);
|
|
}
|
|
Object.defineProperty(initialObject, key, desc);
|
|
});
|
|
const proxyObject = proxy(initialObject);
|
|
return proxyObject;
|
|
}
|
|
|
|
const isObject = (x) => typeof x === "object" && x !== null;
|
|
const deepClone = (obj) => {
|
|
if (!isObject(obj)) {
|
|
return obj;
|
|
}
|
|
const baseObject = Array.isArray(obj) ? [] : Object.create(Object.getPrototypeOf(obj));
|
|
Reflect.ownKeys(obj).forEach((key) => {
|
|
baseObject[key] = deepClone(obj[key]);
|
|
});
|
|
return baseObject;
|
|
};
|
|
function proxyWithHistory(initialValue, skipSubscribe = false) {
|
|
const proxyObject = proxy({
|
|
value: initialValue,
|
|
history: ref({
|
|
wip: void 0,
|
|
snapshots: [],
|
|
index: -1
|
|
}),
|
|
canUndo: () => proxyObject.history.index > 0,
|
|
undo: () => {
|
|
if (proxyObject.canUndo()) {
|
|
proxyObject.value = proxyObject.history.wip = deepClone(
|
|
proxyObject.history.snapshots[--proxyObject.history.index]
|
|
);
|
|
}
|
|
},
|
|
canRedo: () => proxyObject.history.index < proxyObject.history.snapshots.length - 1,
|
|
redo: () => {
|
|
if (proxyObject.canRedo()) {
|
|
proxyObject.value = proxyObject.history.wip = deepClone(
|
|
proxyObject.history.snapshots[++proxyObject.history.index]
|
|
);
|
|
}
|
|
},
|
|
saveHistory: () => {
|
|
proxyObject.history.snapshots.splice(proxyObject.history.index + 1);
|
|
proxyObject.history.snapshots.push(snapshot(proxyObject).value);
|
|
++proxyObject.history.index;
|
|
},
|
|
subscribe: () => subscribe(proxyObject, (ops) => {
|
|
if (ops.every(
|
|
(op) => op[1][0] === "value" && (op[0] !== "set" || op[2] !== proxyObject.history.wip)
|
|
)) {
|
|
proxyObject.saveHistory();
|
|
}
|
|
})
|
|
});
|
|
proxyObject.saveHistory();
|
|
if (!skipSubscribe) {
|
|
proxyObject.subscribe();
|
|
}
|
|
return proxyObject;
|
|
}
|
|
|
|
function proxySet(initialValues) {
|
|
const set = proxy({
|
|
data: Array.from(new Set(initialValues)),
|
|
has(value) {
|
|
return this.data.indexOf(value) !== -1;
|
|
},
|
|
add(value) {
|
|
let hasProxy = false;
|
|
if (typeof value === "object" && value !== null) {
|
|
hasProxy = this.data.indexOf(proxy(value)) !== -1;
|
|
}
|
|
if (this.data.indexOf(value) === -1 && !hasProxy) {
|
|
this.data.push(value);
|
|
}
|
|
return this;
|
|
},
|
|
delete(value) {
|
|
const index = this.data.indexOf(value);
|
|
if (index === -1) {
|
|
return false;
|
|
}
|
|
this.data.splice(index, 1);
|
|
return true;
|
|
},
|
|
clear() {
|
|
this.data.splice(0);
|
|
},
|
|
get size() {
|
|
return this.data.length;
|
|
},
|
|
forEach(cb) {
|
|
this.data.forEach((value) => {
|
|
cb(value, value, this);
|
|
});
|
|
},
|
|
get [Symbol.toStringTag]() {
|
|
return "Set";
|
|
},
|
|
toJSON() {
|
|
return {};
|
|
},
|
|
[Symbol.iterator]() {
|
|
return this.data[Symbol.iterator]();
|
|
},
|
|
values() {
|
|
return this.data.values();
|
|
},
|
|
keys() {
|
|
return this.data.values();
|
|
},
|
|
entries() {
|
|
return new Set(this.data).entries();
|
|
}
|
|
});
|
|
Object.defineProperties(set, {
|
|
data: {
|
|
enumerable: false
|
|
},
|
|
size: {
|
|
enumerable: false
|
|
},
|
|
toJSON: {
|
|
enumerable: false
|
|
}
|
|
});
|
|
Object.seal(set);
|
|
return set;
|
|
}
|
|
|
|
function proxyMap(entries) {
|
|
const map = proxy({
|
|
data: Array.from(entries || []),
|
|
has(key) {
|
|
return this.data.some((p) => p[0] === key);
|
|
},
|
|
set(key, value) {
|
|
const record = this.data.find((p) => p[0] === key);
|
|
if (record) {
|
|
record[1] = value;
|
|
} else {
|
|
this.data.push([key, value]);
|
|
}
|
|
return this;
|
|
},
|
|
get(key) {
|
|
var _a;
|
|
return (_a = this.data.find((p) => p[0] === key)) == null ? void 0 : _a[1];
|
|
},
|
|
delete(key) {
|
|
const index = this.data.findIndex((p) => p[0] === key);
|
|
if (index === -1) {
|
|
return false;
|
|
}
|
|
this.data.splice(index, 1);
|
|
return true;
|
|
},
|
|
clear() {
|
|
this.data.splice(0);
|
|
},
|
|
get size() {
|
|
return this.data.length;
|
|
},
|
|
toJSON() {
|
|
return {};
|
|
},
|
|
forEach(cb) {
|
|
this.data.forEach((p) => {
|
|
cb(p[1], p[0], this);
|
|
});
|
|
},
|
|
keys() {
|
|
return this.data.map((p) => p[0]).values();
|
|
},
|
|
values() {
|
|
return this.data.map((p) => p[1]).values();
|
|
},
|
|
entries() {
|
|
return new Map(this.data).entries();
|
|
},
|
|
get [Symbol.toStringTag]() {
|
|
return "Map";
|
|
},
|
|
[Symbol.iterator]() {
|
|
return this.entries();
|
|
}
|
|
});
|
|
Object.defineProperties(map, {
|
|
data: {
|
|
enumerable: false
|
|
},
|
|
size: {
|
|
enumerable: false
|
|
},
|
|
toJSON: {
|
|
enumerable: false
|
|
}
|
|
});
|
|
Object.seal(map);
|
|
return map;
|
|
}
|
|
|
|
})
|
|
};
|
|
}));
|