mirror of
https://git.meshkee.com/cssd/cssd-back.git
synced 2026-10-10 23:41:04 +03:30
153 lines
3.7 KiB
JavaScript
Vendored
153 lines
3.7 KiB
JavaScript
Vendored
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.patchChildren = patchChildren;
|
|
exports.h = h;
|
|
|
|
function isUndef(v) {
|
|
return v === null || v === undefined;
|
|
}
|
|
|
|
function isDef(v) {
|
|
return v !== null && v !== undefined;
|
|
}
|
|
|
|
function sameVval(oldVval, vval) {
|
|
return vval.tag === oldVval.tag && vval.key === oldVval.key;
|
|
}
|
|
|
|
function createVm(vval) {
|
|
var Vm = vval.tag;
|
|
vval.vm = new Vm({
|
|
data: vval.args
|
|
});
|
|
}
|
|
|
|
function updateVval(vval) {
|
|
var keys = Object.keys(vval.args);
|
|
|
|
for (var i = 0; i < keys.length; i++) {
|
|
keys.forEach(function (k) {
|
|
vval.vm[k] = vval.args[k];
|
|
});
|
|
}
|
|
}
|
|
|
|
function createKeyToOldIdx(children, beginIdx, endIdx) {
|
|
var i, key;
|
|
var map = {};
|
|
|
|
for (i = beginIdx; i <= endIdx; ++i) {
|
|
key = children[i].key;
|
|
if (isDef(key)) map[key] = i;
|
|
}
|
|
|
|
return map;
|
|
}
|
|
|
|
function updateChildren(oldCh, newCh) {
|
|
var oldStartIdx = 0;
|
|
var newStartIdx = 0;
|
|
var oldEndIdx = oldCh.length - 1;
|
|
var oldStartVval = oldCh[0];
|
|
var oldEndVval = oldCh[oldEndIdx];
|
|
var newEndIdx = newCh.length - 1;
|
|
var newStartVval = newCh[0];
|
|
var newEndVval = newCh[newEndIdx];
|
|
var oldKeyToIdx, idxInOld, elmToMove;
|
|
|
|
while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
|
|
if (isUndef(oldStartVval)) {
|
|
oldStartVval = oldCh[++oldStartIdx];
|
|
} else if (isUndef(oldEndVval)) {
|
|
oldEndVval = oldCh[--oldEndIdx];
|
|
} else if (sameVval(oldStartVval, newStartVval)) {
|
|
patchVval(oldStartVval, newStartVval);
|
|
oldStartVval = oldCh[++oldStartIdx];
|
|
newStartVval = newCh[++newStartIdx];
|
|
} else if (sameVval(oldEndVval, newEndVval)) {
|
|
patchVval(oldEndVval, newEndVval);
|
|
oldEndVval = oldCh[--oldEndIdx];
|
|
newEndVval = newCh[--newEndIdx];
|
|
} else if (sameVval(oldStartVval, newEndVval)) {
|
|
patchVval(oldStartVval, newEndVval);
|
|
oldStartVval = oldCh[++oldStartIdx];
|
|
newEndVval = newCh[--newEndIdx];
|
|
} else if (sameVval(oldEndVval, newStartVval)) {
|
|
patchVval(oldEndVval, newStartVval);
|
|
oldEndVval = oldCh[--oldEndIdx];
|
|
newStartVval = newCh[++newStartIdx];
|
|
} else {
|
|
if (isUndef(oldKeyToIdx)) oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
|
|
idxInOld = isDef(newStartVval.key) ? oldKeyToIdx[newStartVval.key] : null;
|
|
|
|
if (isUndef(idxInOld)) {
|
|
createVm(newStartVval);
|
|
newStartVval = newCh[++newStartIdx];
|
|
} else {
|
|
elmToMove = oldCh[idxInOld];
|
|
|
|
if (sameVval(elmToMove, newStartVval)) {
|
|
patchVval(elmToMove, newStartVval);
|
|
oldCh[idxInOld] = undefined;
|
|
newStartVval = newCh[++newStartIdx];
|
|
} else {
|
|
createVm(newStartVval);
|
|
newStartVval = newCh[++newStartIdx];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (oldStartIdx > oldEndIdx) {
|
|
addVvals(newCh, newStartIdx, newEndIdx);
|
|
} else if (newStartIdx > newEndIdx) {
|
|
removeVvals(oldCh, oldStartIdx, oldEndIdx);
|
|
}
|
|
}
|
|
|
|
function addVvals(vvals, startIdx, endIdx) {
|
|
for (; startIdx <= endIdx; ++startIdx) {
|
|
createVm(vvals[startIdx]);
|
|
}
|
|
}
|
|
|
|
function removeVvals(vvals, startIdx, endIdx) {
|
|
for (; startIdx <= endIdx; ++startIdx) {
|
|
var ch = vvals[startIdx];
|
|
|
|
if (isDef(ch)) {
|
|
ch.vm.$destroy();
|
|
ch.vm = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
function patchVval(oldVval, vval) {
|
|
if (oldVval === vval) {
|
|
return;
|
|
}
|
|
|
|
vval.vm = oldVval.vm;
|
|
updateVval(vval);
|
|
}
|
|
|
|
function patchChildren(oldCh, ch) {
|
|
if (isDef(oldCh) && isDef(ch)) {
|
|
if (oldCh !== ch) updateChildren(oldCh, ch);
|
|
} else if (isDef(ch)) {
|
|
addVvals(ch, 0, ch.length - 1);
|
|
} else if (isDef(oldCh)) {
|
|
removeVvals(oldCh, 0, oldCh.length - 1);
|
|
}
|
|
}
|
|
|
|
function h(tag, key, args) {
|
|
return {
|
|
tag: tag,
|
|
key: key,
|
|
args: args
|
|
};
|
|
} |