wenay-react2 1.0.45 → 1.0.47
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/README.md +7 -1
- package/doc/changes/v1.0.46.md +16 -0
- package/doc/changes/v1.0.47.md +9 -0
- package/doc/examples/README.md +6 -0
- package/doc/examples/peer-call-media.tsx +8 -0
- package/doc/examples/stand.tsx +6 -0
- package/doc/native.md +37 -0
- package/doc/progress/common2-adoption-1.0.74.md +24 -0
- package/doc/progress/stand-as-examples-audit.md +22 -0
- package/doc/target/my.md +12 -0
- package/doc/wenay-react2.md +1 -1
- package/lib/common/demo/peerMedia.d.ts +6 -0
- package/lib/common/demo/peerMedia.js +128 -0
- package/lib/common/src/components/Toolbar/Toolbar.d.ts +4 -0
- package/lib/common/src/components/Toolbar/Toolbar.js +16 -7
- package/lib/common/src/components/index.d.ts +12 -0
- package/lib/common/src/components/index.js +12 -0
- package/lib/common/src/grid/columnState/CardList.d.ts +2 -0
- package/lib/common/src/grid/columnState/CardList.js +1 -1
- package/lib/common/src/grid/columnState/ColumnsMenu.d.ts +2 -0
- package/lib/common/src/grid/columnState/ColumnsMenu.js +3 -2
- package/lib/common/src/grid/columnState/columnState.d.ts +15 -0
- package/lib/common/src/grid/columnState/columnState.js +53 -5
- package/lib/common/src/hooks/index.d.ts +1 -0
- package/lib/common/src/hooks/index.js +1 -0
- package/lib/common/src/hooks/usePeerCall.d.ts +68 -0
- package/lib/common/src/hooks/usePeerCall.js +79 -0
- package/lib/common/src/hooks/useReorder.d.ts +2 -0
- package/lib/common/src/hooks/useReorder.js +3 -1
- package/lib/common/src/utils/memoryStore.d.ts +2 -2
- package/lib/common/testUseReact/qa.d.ts +1 -0
- package/lib/common/testUseReact/qa.js +1148 -0
- package/lib/common/testUseReact/replayVideo.d.ts +14 -0
- package/lib/common/testUseReact/replayVideo.js +311 -0
- package/lib/common/testUseReact/testParams.d.ts +1 -0
- package/lib/common/testUseReact/testParams.js +15 -0
- package/lib/common/testUseReact/useGrid.d.ts +2 -0
- package/lib/common/testUseReact/useGrid.js +62 -0
- package/lib/native/columnDots.d.ts +41 -0
- package/lib/native/columnDots.js +104 -0
- package/lib/native/columnState.d.ts +69 -0
- package/lib/native/columnState.js +209 -0
- package/lib/native/index.d.ts +3 -0
- package/lib/native/index.js +3 -0
- package/lib/style/style.css +24 -0
- package/package.json +6 -3
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
const SCHEMA_V = 1;
|
|
2
|
+
function copy(config) {
|
|
3
|
+
return {
|
|
4
|
+
...config,
|
|
5
|
+
order: config.order.slice(),
|
|
6
|
+
visible: { ...config.visible },
|
|
7
|
+
width: { ...config.width },
|
|
8
|
+
sort: config.sort ? { ...config.sort } : null,
|
|
9
|
+
filter: { ...config.filter },
|
|
10
|
+
groups: Object.fromEntries(Object.entries(config.groups).map(([group, keys]) => [group, keys.slice()])),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function pinFixed(order, columns) {
|
|
14
|
+
const fixed = new Set(columns.filter(column => column.fixed).map(column => column.key));
|
|
15
|
+
const result = order.filter(key => !fixed.has(key));
|
|
16
|
+
columns.forEach(function pin(column, index) {
|
|
17
|
+
if (column.fixed)
|
|
18
|
+
result.splice(Math.min(index, result.length), 0, column.key);
|
|
19
|
+
});
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
/** Headless, platform-neutral column controller. AsyncStorage satisfies storage directly. */
|
|
23
|
+
export function createNativeColumnState(opts) {
|
|
24
|
+
const columns = opts.columns.slice();
|
|
25
|
+
const byKey = new Map(columns.map(column => [column.key, column]));
|
|
26
|
+
const known = new Set(byKey.keys());
|
|
27
|
+
const groupKeys = [...new Set(columns.map(column => column.group).filter((group) => !!group))];
|
|
28
|
+
const listeners = new Set();
|
|
29
|
+
let revision = 0;
|
|
30
|
+
let hydrated = !opts.storage;
|
|
31
|
+
let disposed = false;
|
|
32
|
+
let timer;
|
|
33
|
+
let writes = Promise.resolve();
|
|
34
|
+
const members = (group) => columns.filter(column => column.group == group).map(column => column.key);
|
|
35
|
+
function defaults() {
|
|
36
|
+
return {
|
|
37
|
+
v: SCHEMA_V,
|
|
38
|
+
order: opts.def?.order?.slice() ?? columns.map(column => column.key),
|
|
39
|
+
visible: opts.def?.visible ? { ...opts.def.visible } : Object.fromEntries(columns.map(column => [column.key, column.defaultVisible != false])),
|
|
40
|
+
width: opts.def?.width ? { ...opts.def.width } : {},
|
|
41
|
+
sort: opts.def?.sort ? { ...opts.def.sort } : null,
|
|
42
|
+
filter: opts.def?.filter ? { ...opts.def.filter } : {},
|
|
43
|
+
groups: opts.def?.groups ? { ...opts.def.groups } : Object.fromEntries(groupKeys.map(group => [group, members(group)])),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function normalize(value) {
|
|
47
|
+
const base = defaults();
|
|
48
|
+
const order = (Array.isArray(value?.order) ? value.order : base.order)
|
|
49
|
+
.filter(key => known.has(key) && !byKey.get(key)?.fixed);
|
|
50
|
+
for (const column of columns)
|
|
51
|
+
if (!column.fixed && !order.includes(column.key))
|
|
52
|
+
order.push(column.key);
|
|
53
|
+
const rawVisible = value?.visible && typeof value.visible == 'object' ? value.visible : base.visible;
|
|
54
|
+
const visible = {};
|
|
55
|
+
for (const column of columns)
|
|
56
|
+
visible[column.key] = column.fixed ? true : (rawVisible[column.key] ?? column.defaultVisible != false);
|
|
57
|
+
const width = {};
|
|
58
|
+
for (const [key, item] of Object.entries(value?.width ?? {}))
|
|
59
|
+
if (known.has(key) && typeof item == 'number' && isFinite(item) && item > 0)
|
|
60
|
+
width[key] = item;
|
|
61
|
+
const sort = value?.sort && known.has(value.sort.key) && (value.sort.dir == 'asc' || value.sort.dir == 'desc')
|
|
62
|
+
? { key: value.sort.key, dir: value.sort.dir } : null;
|
|
63
|
+
const filter = {};
|
|
64
|
+
for (const [key, item] of Object.entries(value?.filter ?? {}))
|
|
65
|
+
if (known.has(key))
|
|
66
|
+
filter[key] = item;
|
|
67
|
+
const groups = {};
|
|
68
|
+
for (const group of groupKeys) {
|
|
69
|
+
const allowed = members(group);
|
|
70
|
+
const raw = value?.groups?.[group];
|
|
71
|
+
groups[group] = Array.isArray(raw) ? raw.filter(key => allowed.includes(key)) : allowed;
|
|
72
|
+
}
|
|
73
|
+
return { v: SCHEMA_V, order: pinFixed(order, columns), visible, width, sort, filter, groups };
|
|
74
|
+
}
|
|
75
|
+
let config = normalize(defaults());
|
|
76
|
+
const emit = () => {
|
|
77
|
+
const snapshot = copy(config);
|
|
78
|
+
for (const listener of listeners)
|
|
79
|
+
listener(snapshot);
|
|
80
|
+
};
|
|
81
|
+
const report = (phase, error) => opts.onError?.({ phase, error });
|
|
82
|
+
function enqueue(snapshot) {
|
|
83
|
+
if (!opts.storage || disposed)
|
|
84
|
+
return;
|
|
85
|
+
writes = writes.then(async function save() {
|
|
86
|
+
try {
|
|
87
|
+
await opts.storage.setItem(opts.key, JSON.stringify(snapshot));
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
report('write', error);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function schedule() {
|
|
95
|
+
if (!opts.storage || !hydrated || disposed)
|
|
96
|
+
return;
|
|
97
|
+
clearTimeout(timer);
|
|
98
|
+
timer = setTimeout(function saveLater() {
|
|
99
|
+
timer = undefined;
|
|
100
|
+
enqueue(copy(config));
|
|
101
|
+
}, opts.saveMs ?? 100);
|
|
102
|
+
}
|
|
103
|
+
function commit(next) {
|
|
104
|
+
if (disposed)
|
|
105
|
+
return;
|
|
106
|
+
config = normalize(next);
|
|
107
|
+
revision++;
|
|
108
|
+
emit();
|
|
109
|
+
schedule();
|
|
110
|
+
}
|
|
111
|
+
const ready = (async function hydrate() {
|
|
112
|
+
if (!opts.storage)
|
|
113
|
+
return copy(config);
|
|
114
|
+
const before = revision;
|
|
115
|
+
try {
|
|
116
|
+
const raw = await opts.storage.getItem(opts.key);
|
|
117
|
+
if (raw != null && revision == before) {
|
|
118
|
+
try {
|
|
119
|
+
config = normalize(JSON.parse(raw));
|
|
120
|
+
emit();
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
report('parse', error);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
report('read', error);
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
hydrated = true;
|
|
132
|
+
if (revision != before)
|
|
133
|
+
schedule();
|
|
134
|
+
}
|
|
135
|
+
return copy(config);
|
|
136
|
+
})();
|
|
137
|
+
const getConfig = () => copy(config);
|
|
138
|
+
const subscribe = (listener) => {
|
|
139
|
+
listeners.add(listener);
|
|
140
|
+
return function unsubscribe() { listeners.delete(listener); };
|
|
141
|
+
};
|
|
142
|
+
function show(key, visible) {
|
|
143
|
+
if (!known.has(key) || byKey.get(key)?.fixed)
|
|
144
|
+
return;
|
|
145
|
+
commit({ ...config, visible: { ...config.visible, [key]: visible } });
|
|
146
|
+
}
|
|
147
|
+
function move(order) { commit({ ...config, order }); }
|
|
148
|
+
function moveKey(key, to) {
|
|
149
|
+
if (!known.has(key) || byKey.get(key)?.fixed)
|
|
150
|
+
return;
|
|
151
|
+
const order = config.order.slice();
|
|
152
|
+
const from = order.indexOf(key);
|
|
153
|
+
if (from == -1)
|
|
154
|
+
return;
|
|
155
|
+
order.splice(from, 1);
|
|
156
|
+
order.splice(Math.max(0, Math.min(order.length, to)), 0, key);
|
|
157
|
+
move(order);
|
|
158
|
+
}
|
|
159
|
+
function setSort(sort) { commit({ ...config, sort }); }
|
|
160
|
+
function toggleSort(key) {
|
|
161
|
+
if (!known.has(key))
|
|
162
|
+
return;
|
|
163
|
+
const current = config.sort;
|
|
164
|
+
setSort(current?.key != key ? { key, dir: 'asc' } : current.dir == 'asc' ? { key, dir: 'desc' } : null);
|
|
165
|
+
}
|
|
166
|
+
function setFilter(key, value) {
|
|
167
|
+
if (!known.has(key))
|
|
168
|
+
return;
|
|
169
|
+
const filter = { ...config.filter };
|
|
170
|
+
if (value == null)
|
|
171
|
+
delete filter[key];
|
|
172
|
+
else
|
|
173
|
+
filter[key] = value;
|
|
174
|
+
commit({ ...config, filter });
|
|
175
|
+
}
|
|
176
|
+
function setGroup(group, keys) {
|
|
177
|
+
if (!groupKeys.includes(group))
|
|
178
|
+
return;
|
|
179
|
+
commit({ ...config, groups: { ...config.groups, [group]: keys } });
|
|
180
|
+
}
|
|
181
|
+
function visibleKeys() {
|
|
182
|
+
return config.order.filter(key => {
|
|
183
|
+
if (config.visible[key] == false)
|
|
184
|
+
return false;
|
|
185
|
+
const group = byKey.get(key)?.group;
|
|
186
|
+
return !group || config.groups[group]?.includes(key);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
function reset() { commit(defaults()); }
|
|
190
|
+
async function flush() {
|
|
191
|
+
clearTimeout(timer);
|
|
192
|
+
timer = undefined;
|
|
193
|
+
await ready;
|
|
194
|
+
enqueue(copy(config));
|
|
195
|
+
await writes;
|
|
196
|
+
}
|
|
197
|
+
function dispose() {
|
|
198
|
+
disposed = true;
|
|
199
|
+
clearTimeout(timer);
|
|
200
|
+
listeners.clear();
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
columns: columns,
|
|
204
|
+
ready,
|
|
205
|
+
api: { getConfig, setConfig: (next) => commit(next), subscribe, show, move, moveKey,
|
|
206
|
+
setSort, toggleSort, setFilter, setGroup, visibleKeys, reset, flush },
|
|
207
|
+
dispose,
|
|
208
|
+
};
|
|
209
|
+
}
|
package/lib/style/style.css
CHANGED
|
@@ -1058,6 +1058,30 @@ body {
|
|
|
1058
1058
|
color: var(--cols-card-accent-color, #0969da);
|
|
1059
1059
|
white-space: nowrap;
|
|
1060
1060
|
}
|
|
1061
|
+
.wenayCardListFields {
|
|
1062
|
+
display: block;
|
|
1063
|
+
}
|
|
1064
|
+
.wenayCardListItem_compact .wenayCardListFields {
|
|
1065
|
+
display: grid;
|
|
1066
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
1067
|
+
gap: 4px 8px;
|
|
1068
|
+
}
|
|
1069
|
+
.wenayCardListItem_compact .wenayCardListField {
|
|
1070
|
+
min-width: 0;
|
|
1071
|
+
padding: 2px 6px;
|
|
1072
|
+
border-radius: 5px;
|
|
1073
|
+
background: var(--cols-card-field-bg, #f6f8fa);
|
|
1074
|
+
line-height: 1.45;
|
|
1075
|
+
}
|
|
1076
|
+
.wenayCardListItem_compact .wenayCardListLabel {
|
|
1077
|
+
min-width: 0;
|
|
1078
|
+
font-size: 10px;
|
|
1079
|
+
text-transform: uppercase;
|
|
1080
|
+
letter-spacing: .03em;
|
|
1081
|
+
}
|
|
1082
|
+
@media (max-width: 320px) {
|
|
1083
|
+
.wenayCardListItem_compact .wenayCardListFields { grid-template-columns: 1fr; }
|
|
1084
|
+
}
|
|
1061
1085
|
.wenayCardListField {
|
|
1062
1086
|
display: flex;
|
|
1063
1087
|
gap: var(--cols-card-field-gap, 10px);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wenay-react2",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.47",
|
|
4
4
|
"description": "Common react",
|
|
5
5
|
"strict": true,
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"react": "^19.2.0",
|
|
25
25
|
"react-dom": "^19.2.0",
|
|
26
26
|
"react-rnd": "^10.5.3",
|
|
27
|
-
"wenay-common2": "^1.0.
|
|
27
|
+
"wenay-common2": "^1.0.74"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"react": "^19.2.0",
|
|
@@ -45,6 +45,9 @@
|
|
|
45
45
|
},
|
|
46
46
|
"exports": {
|
|
47
47
|
".": "./lib/index.js",
|
|
48
|
-
"./
|
|
48
|
+
"./native": "./lib/native/index.js",
|
|
49
|
+
"./package.json": "./package.json",
|
|
50
|
+
"./demo/peer-media": "./lib/common/demo/peerMedia.js",
|
|
51
|
+
"./demo/stand": "./lib/common/testUseReact/qa.js"
|
|
49
52
|
}
|
|
50
53
|
}
|