@zhangfengshun/dsh-remote-ssh 2.3.3 → 2.3.5
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.
- package/CHANGELOG.md +12 -0
- package/lib/client.js +62 -29
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
本文件的版本号与 `package.json` 的 `version` 保持一致。每个版本对应一个 Cordis Package 快照(`pkg-N`)。
|
|
4
4
|
|
|
5
|
+
## [2.3.5] — 地球角标样式重制:右下角、默认文件夹形状、透明底白经纬线
|
|
6
|
+
### 变更
|
|
7
|
+
- **文件夹形状与默认完全一致**:不再自绘/改写文件夹几何,壳层 IconFolderOpen16/Close16 的原始路径与几何零改写,仅向工作区行首槽位 svg **追加**一个透明地球经纬线组(appendChild 不触碰 React 管理的子节点,零对账风险)。
|
|
8
|
+
- **角标移到右下角**:地球中心 (11.6, 11.9),含轮廓圈、经线椭圆、赤道与南北纬弧。
|
|
9
|
+
- **透明底色**:去掉蓝色圆盘与描边底环,仅保留白色经纬线(0.9 描边),地球区域全透明。
|
|
10
|
+
- 状态判据改为 svg 内 `[data-rssh-globe]` 子节点存在性(React 属性还原/子节点重建均覆盖),1s 复检自愈逻辑不变。
|
|
11
|
+
|
|
12
|
+
## [2.3.4] — 修复点击会话后图标退化 + 角标加大
|
|
13
|
+
### 修复
|
|
14
|
+
- **图标退化**:点击会话等交互触发 React 重渲染,会把 svg 的 viewBox/children 还原成纯文件夹(属性级变化不触发 childList 观察器),而 2.3.3 的防重入守卫只认 data 标记——标记在即跳过,还原后永不重刷。改为:守卫校验**实际状态**(viewBox 是否为目标帧),不匹配即重新应用;并维护已匹配标题元素清单,**每 1s 幂等复检**(断连清理),任何还原 1 秒内自愈。
|
|
15
|
+
- **角标加大**:地球角标半径 3.1 → 5.2(渲染直径 ≈5px → ≈8.3px,视觉接近翻倍),地球线稿与描边同步放大,位置微调至文件夹左下角不越界。
|
|
16
|
+
|
|
5
17
|
## [2.3.3] — 修复工作区图标替换不生效
|
|
6
18
|
### 修复
|
|
7
19
|
- 2.3.2 的图标替换向上爬找「直接子级含 svg 的祖先」,但壳层工作区行的文件夹 svg 位于标题的**前兄弟槽位**(`projectRow > [slot.folder(svg), …, projectText > title]`),不是任何祖先的直接子级 → 匹配后静默跳过、图标从未被替换。改为:从标题向上最多 4 层,取每层容器的**第一个子元素**,首个含 svg 的即行首文件夹槽位;并将「插入新节点」改为**原位改写**该 svg 的 viewBox/尺寸/内容(不插入/删除节点,避免 React 对账风险;展开态切换重建 svg 后由观察器 500ms 内自动重刷)。
|
package/lib/client.js
CHANGED
|
@@ -1139,9 +1139,10 @@ window.__ModuleLoader__.load({
|
|
|
1139
1139
|
// ---- 远程工作区图标:单个「地球角标文件夹」SVG 替换壳层默认纯文件夹图标 ----
|
|
1140
1140
|
// 壳层工作区行的文件夹图标是固定原语(IconFolderOpen16/Close16),无 per-workspace
|
|
1141
1141
|
// 图标 API;旧方案在标题里塞 🌐 emoji 造成「文件夹 + 地球」双重标识。现按标题文本
|
|
1142
|
-
// 定位远程工作区行,找到行首 slot.folder
|
|
1143
|
-
//
|
|
1142
|
+
// 定位远程工作区行,找到行首 slot.folder 槽位(标题的前兄弟),向其中的 svg
|
|
1143
|
+
// 追加地球经纬线组 —— 文件夹本体保持壳层默认原语几何,零改写零对账风险。
|
|
1144
1144
|
var remoteTitles = new Set();
|
|
1145
|
+
var watchedTitles = []; // 已匹配的标题元素:定时幂等复检,抵消 React 重渲染对图标的还原
|
|
1145
1146
|
function refreshRemoteTitles() {
|
|
1146
1147
|
api("listWorkspaces").then(function (r) {
|
|
1147
1148
|
if (!(r && r.ok && Array.isArray(r.workspaces))) return;
|
|
@@ -1154,41 +1155,71 @@ window.__ModuleLoader__.load({
|
|
|
1154
1155
|
swapWorkspaceIconsIn(document.body); // 标题集就绪后补一次全量替换
|
|
1155
1156
|
}).catch(function () {});
|
|
1156
1157
|
}
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1158
|
+
/** 地球经纬线组(右下角、无圆盘底色):线为白色、其余全透明;文件夹本体完全
|
|
1159
|
+
* 保留壳层默认原语(IconFolderOpen16/Close16 原始路径与几何,零改写),
|
|
1160
|
+
* 仅向 svg 追加本组 —— appendChild 不触碰 React 管理的子节点,零对账风险。 */
|
|
1161
|
+
function globeGridElement() {
|
|
1162
|
+
var NS = "http://www.w3.org/2000/svg";
|
|
1163
|
+
var g = document.createElementNS(NS, "g");
|
|
1164
|
+
g.setAttribute("data-rssh-globe", "1");
|
|
1165
|
+
g.setAttribute("fill", "none");
|
|
1166
|
+
g.setAttribute("stroke", "#ffffff");
|
|
1167
|
+
g.setAttribute("stroke-width", "0.9");
|
|
1168
|
+
function add(name, attrs) {
|
|
1169
|
+
var n = document.createElementNS(NS, name);
|
|
1170
|
+
for (var k in attrs) n.setAttribute(k, attrs[k]);
|
|
1171
|
+
g.appendChild(n);
|
|
1172
|
+
}
|
|
1173
|
+
add("circle", { cx: "11.6", cy: "11.9", r: "3.4" }); // 地球轮廓
|
|
1174
|
+
add("ellipse", { cx: "11.6", cy: "11.9", rx: "1.6", ry: "3.4" }); // 经线
|
|
1175
|
+
add("path", { d: "M8.2 11.9h6.8" }); // 赤道(纬线)
|
|
1176
|
+
add("path", { d: "M8.7 9.6c0.9 0.65 1.85 0.97 2.9 0.97s2-0.32 2.9-0.97" }); // 北纬弧
|
|
1177
|
+
add("path", { d: "M8.7 14.2c0.9-0.65 1.85-0.97 2.9-0.97s2 0.32 2.9 0.97" }); // 南纬弧
|
|
1178
|
+
return g;
|
|
1179
|
+
}
|
|
1180
|
+
/** 幂等应用:React 还原/重建子节点会清掉本组 —— 以 [data-rssh-globe] 子节点
|
|
1181
|
+
* 存在性为状态判据(覆盖属性级还原与节点重建),缺席即追加。 */
|
|
1182
|
+
function applyFolderGlobe(slotSvg) {
|
|
1183
|
+
if (slotSvg.querySelector("[data-rssh-globe]")) return;
|
|
1184
|
+
slotSvg.setAttribute("data-rssh-folder-globe", "1");
|
|
1185
|
+
slotSvg.appendChild(globeGridElement());
|
|
1186
|
+
}
|
|
1187
|
+
/** 对单个标题元素做行首槽位修复:projectRow > [slot.folder(svg), …, projectText > title],
|
|
1188
|
+
* 文件夹 svg 在标题的前兄弟槽位 —— 向上 ≤4 层取每层容器第一个子元素,首个含 svg 即是。 */
|
|
1189
|
+
function fixRowIconFor(el) {
|
|
1190
|
+
var holder = el;
|
|
1191
|
+
for (var hop = 0; hop < 4 && holder && holder.parentElement; hop++) {
|
|
1192
|
+
var row = holder.parentElement;
|
|
1193
|
+
var first = row.children && row.children[0];
|
|
1194
|
+
if (first && first.querySelector && first.querySelector("svg")) {
|
|
1195
|
+
applyFolderGlobe(first.querySelector("svg"));
|
|
1196
|
+
return true;
|
|
1197
|
+
}
|
|
1198
|
+
holder = row;
|
|
1199
|
+
}
|
|
1200
|
+
return false;
|
|
1201
|
+
}
|
|
1202
|
+
function watchTitle(el) {
|
|
1203
|
+
for (var i = 0; i < watchedTitles.length; i++) { if (watchedTitles[i] === el) return; }
|
|
1204
|
+
watchedTitles.push(el);
|
|
1205
|
+
fixRowIconFor(el);
|
|
1206
|
+
}
|
|
1207
|
+
function recheckWatched() {
|
|
1208
|
+
for (var i = watchedTitles.length - 1; i >= 0; i--) {
|
|
1209
|
+
var el = watchedTitles[i];
|
|
1210
|
+
if (!el || !el.isConnected) { watchedTitles.splice(i, 1); continue; }
|
|
1211
|
+
fixRowIconFor(el);
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1161
1214
|
function swapWorkspaceIconsIn(root) {
|
|
1162
1215
|
if (!remoteTitles.size) return;
|
|
1163
1216
|
try {
|
|
1164
1217
|
var nodes = root.querySelectorAll("span,div,button,a,p");
|
|
1165
1218
|
for (var i = 0; i < nodes.length; i++) {
|
|
1166
1219
|
var el = nodes[i];
|
|
1167
|
-
if (el.getAttribute && el.getAttribute("data-rssh-title-scan") === "1") continue;
|
|
1168
1220
|
var t = (el.textContent || "").trim();
|
|
1169
1221
|
if (!t || !remoteTitles.has(t) || el.childElementCount > 2) continue;
|
|
1170
|
-
el
|
|
1171
|
-
// 行结构:projectRow > [slot.folder(svg), slot.chevron(svg), projectText > span.title, ...]
|
|
1172
|
-
// 从标题元素向上最多 4 层,取每层容器的第一个子元素——首个含 svg 的即行首
|
|
1173
|
-
// 文件夹槽位;将其 svg 原位改写为地球角标文件夹(React 复用同一节点,
|
|
1174
|
-
// 展开态切换会重建 svg,观察器 500ms 内自动重刷)。
|
|
1175
|
-
var holder = el;
|
|
1176
|
-
for (var hop = 0; hop < 4 && holder && holder.parentElement; hop++) {
|
|
1177
|
-
var row = holder.parentElement;
|
|
1178
|
-
var first = row.children && row.children[0];
|
|
1179
|
-
if (first && first.querySelector && first.querySelector("svg")) {
|
|
1180
|
-
var oldSvg = first.querySelector("svg");
|
|
1181
|
-
if (oldSvg.getAttribute("data-rssh-folder-globe") !== "1") {
|
|
1182
|
-
oldSvg.setAttribute("data-rssh-folder-globe", "1");
|
|
1183
|
-
oldSvg.setAttribute("viewBox", "0 0 20 16");
|
|
1184
|
-
oldSvg.setAttribute("width", "16");
|
|
1185
|
-
oldSvg.setAttribute("height", "16");
|
|
1186
|
-
oldSvg.innerHTML = FOLDER_GLOBE_INNER;
|
|
1187
|
-
}
|
|
1188
|
-
break;
|
|
1189
|
-
}
|
|
1190
|
-
holder = row;
|
|
1191
|
-
}
|
|
1222
|
+
watchTitle(el);
|
|
1192
1223
|
}
|
|
1193
1224
|
} catch (e) {}
|
|
1194
1225
|
}
|
|
@@ -1197,6 +1228,7 @@ window.__ModuleLoader__.load({
|
|
|
1197
1228
|
hideRemoteGearIcon();
|
|
1198
1229
|
refreshRemoteTitles();
|
|
1199
1230
|
var titleTimer = setInterval(refreshRemoteTitles, 30000);
|
|
1231
|
+
var recheckTimer = setInterval(recheckWatched, 1000); // 抵消 React 属性还原
|
|
1200
1232
|
var timer = null;
|
|
1201
1233
|
var pendingRoots = null;
|
|
1202
1234
|
var schedule = function (root) {
|
|
@@ -1231,6 +1263,7 @@ window.__ModuleLoader__.load({
|
|
|
1231
1263
|
if (off) off();
|
|
1232
1264
|
if (timer) clearTimeout(timer);
|
|
1233
1265
|
clearInterval(titleTimer);
|
|
1266
|
+
clearInterval(recheckTimer);
|
|
1234
1267
|
};
|
|
1235
1268
|
}, "dsh-remote-ssh: settings gear hide + remote workspace folder-globe icon");
|
|
1236
1269
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhangfengshun/dsh-remote-ssh",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.5",
|
|
4
4
|
"description": "DSH web plugin: VSCode Remote-SSH-like remote development (SSH to supercomputers/servers, remote workspace, file explorer, integrated terminal), integrated with dsh-better-sidebar and DSH settings.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|