@effect-app/vue-components 2.6.2 → 2.7.1
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/dist/types/components/OmegaForm/InputProps.d.ts +10 -4
- package/dist/types/components/OmegaForm/OmegaTaggedUnion.vue.d.ts +16 -9
- package/dist/types/components/OmegaForm/OmegaTaggedUnionInternal.vue.d.ts +2 -9
- package/dist/types/components/OmegaForm/useOmegaForm.d.ts +2 -1
- package/dist/vue-components.es10.js +231 -170
- package/dist/vue-components.es11.js +2 -2
- package/dist/vue-components.es12.js +137 -115
- package/dist/vue-components.es16.js +11 -10
- package/dist/vue-components.es17.js +10 -5
- package/dist/vue-components.es18.js +5 -55
- package/dist/vue-components.es19.js +50 -63
- package/dist/vue-components.es20.js +68 -6
- package/dist/vue-components.es21.js +4 -4
- package/dist/vue-components.es22.js +6 -3
- package/dist/vue-components.es23.js +3 -3
- package/dist/vue-components.es24.js +3 -2
- package/dist/vue-components.es25.js +1 -1
- package/dist/vue-components.es26.js +1 -1
- package/dist/vue-components.es27.js +1 -1
- package/dist/vue-components.es28.js +2 -17
- package/dist/vue-components.es29.js +16 -10
- package/dist/vue-components.es31.js +1 -1
- package/dist/vue-components.es32.js +1 -1
- package/dist/vue-components.es36.js +1 -1
- package/dist/vue-components.es40.js +4 -23
- package/dist/vue-components.es41.js +23 -5
- package/dist/vue-components.es42.js +5 -21
- package/dist/vue-components.es43.js +16 -25
- package/dist/vue-components.es44.js +23 -15
- package/dist/vue-components.es45.js +17 -7
- package/dist/vue-components.es46.js +12 -5
- package/dist/vue-components.es47.js +5 -19
- package/dist/vue-components.es48.js +19 -9
- package/dist/vue-components.es49.js +9 -31
- package/dist/vue-components.es5.js +1 -1
- package/dist/vue-components.es50.js +25 -42
- package/dist/vue-components.es51.js +38 -16
- package/dist/vue-components.es52.js +26 -11
- package/dist/vue-components.es53.js +11 -4
- package/dist/vue-components.es54.js +1 -1
- package/dist/vue-components.es56.js +1 -1
- package/dist/vue-components.es58.js +3 -3
- package/dist/vue-components.es59.js +1 -1
- package/dist/vue-components.es8.js +33 -41
- package/dist/vue-components.es9.js +7 -6
- package/package.json +3 -3
- package/src/components/OmegaForm/InputProps.ts +17 -8
- package/src/components/OmegaForm/OmegaFormStuff.ts +52 -0
- package/src/components/OmegaForm/OmegaTaggedUnion.vue +27 -39
- package/src/components/OmegaForm/OmegaTaggedUnionInternal.vue +4 -3
- package/src/components/OmegaForm/useOmegaForm.ts +139 -10
|
@@ -1,50 +1,33 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { DiagAPI as u } from "./vue-components.es54.js";
|
|
4
|
-
var y = function(t, e) {
|
|
5
|
-
var a = typeof Symbol == "function" && t[Symbol.iterator];
|
|
6
|
-
if (!a) return t;
|
|
7
|
-
var n = a.call(t), o, r = [], i;
|
|
8
|
-
try {
|
|
9
|
-
for (; (e === void 0 || e-- > 0) && !(o = n.next()).done; ) r.push(o.value);
|
|
10
|
-
} catch (c) {
|
|
11
|
-
i = { error: c };
|
|
12
|
-
} finally {
|
|
13
|
-
try {
|
|
14
|
-
o && !o.done && (a = n.return) && a.call(n);
|
|
15
|
-
} finally {
|
|
16
|
-
if (i) throw i.error;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return r;
|
|
20
|
-
}, d = function(t, e, a) {
|
|
21
|
-
if (a || arguments.length === 2) for (var n = 0, o = e.length, r; n < o; n++)
|
|
22
|
-
(r || !(n in e)) && (r || (r = Array.prototype.slice.call(e, 0, n)), r[n] = e[n]);
|
|
23
|
-
return t.concat(r || Array.prototype.slice.call(e));
|
|
24
|
-
}, l = "context", _ = new f(), A = (
|
|
1
|
+
import { INVALID_SPAN_CONTEXT as o } from "./vue-components.es49.js";
|
|
2
|
+
var i = (
|
|
25
3
|
/** @class */
|
|
26
4
|
(function() {
|
|
27
|
-
function t() {
|
|
5
|
+
function t(n) {
|
|
6
|
+
n === void 0 && (n = o), this._spanContext = n;
|
|
28
7
|
}
|
|
29
|
-
return t.
|
|
30
|
-
return this.
|
|
31
|
-
}, t.prototype.
|
|
32
|
-
return
|
|
33
|
-
}, t.prototype.
|
|
34
|
-
return this
|
|
35
|
-
}, t.prototype.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return
|
|
39
|
-
}, t.prototype.
|
|
40
|
-
return this
|
|
41
|
-
}, t.prototype.
|
|
42
|
-
return
|
|
43
|
-
}, t.prototype.
|
|
44
|
-
this
|
|
8
|
+
return t.prototype.spanContext = function() {
|
|
9
|
+
return this._spanContext;
|
|
10
|
+
}, t.prototype.setAttribute = function(n, e) {
|
|
11
|
+
return this;
|
|
12
|
+
}, t.prototype.setAttributes = function(n) {
|
|
13
|
+
return this;
|
|
14
|
+
}, t.prototype.addEvent = function(n, e) {
|
|
15
|
+
return this;
|
|
16
|
+
}, t.prototype.addLink = function(n) {
|
|
17
|
+
return this;
|
|
18
|
+
}, t.prototype.addLinks = function(n) {
|
|
19
|
+
return this;
|
|
20
|
+
}, t.prototype.setStatus = function(n) {
|
|
21
|
+
return this;
|
|
22
|
+
}, t.prototype.updateName = function(n) {
|
|
23
|
+
return this;
|
|
24
|
+
}, t.prototype.end = function(n) {
|
|
25
|
+
}, t.prototype.isRecording = function() {
|
|
26
|
+
return !1;
|
|
27
|
+
}, t.prototype.recordException = function(n, e) {
|
|
45
28
|
}, t;
|
|
46
29
|
})()
|
|
47
30
|
);
|
|
48
31
|
export {
|
|
49
|
-
|
|
32
|
+
i as NonRecordingSpan
|
|
50
33
|
};
|
|
@@ -1,28 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { NoopContextManager as f } from "./vue-components.es59.js";
|
|
2
|
+
import { registerGlobal as s, getGlobal as p, unregisterGlobal as g } from "./vue-components.es57.js";
|
|
3
|
+
import { DiagAPI as u } from "./vue-components.es54.js";
|
|
4
|
+
var y = function(t, e) {
|
|
5
|
+
var a = typeof Symbol == "function" && t[Symbol.iterator];
|
|
6
|
+
if (!a) return t;
|
|
7
|
+
var n = a.call(t), o, r = [], i;
|
|
8
|
+
try {
|
|
9
|
+
for (; (e === void 0 || e-- > 0) && !(o = n.next()).done; ) r.push(o.value);
|
|
10
|
+
} catch (c) {
|
|
11
|
+
i = { error: c };
|
|
12
|
+
} finally {
|
|
13
|
+
try {
|
|
14
|
+
o && !o.done && (a = n.return) && a.call(n);
|
|
15
|
+
} finally {
|
|
16
|
+
if (i) throw i.error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return r;
|
|
20
|
+
}, d = function(t, e, a) {
|
|
21
|
+
if (a || arguments.length === 2) for (var n = 0, o = e.length, r; n < o; n++)
|
|
22
|
+
(r || !(n in e)) && (r || (r = Array.prototype.slice.call(e, 0, n)), r[n] = e[n]);
|
|
23
|
+
return t.concat(r || Array.prototype.slice.call(e));
|
|
24
|
+
}, l = "context", _ = new f(), A = (
|
|
7
25
|
/** @class */
|
|
8
26
|
(function() {
|
|
9
27
|
function t() {
|
|
10
|
-
this._proxyTracerProvider = new i(), this.wrapSpanContext = c, this.isSpanContextValid = h, this.deleteSpan = g, this.getSpan = S, this.getActiveSpan = x, this.getSpanContext = d, this.setSpan = f, this.setSpanContext = l;
|
|
11
28
|
}
|
|
12
29
|
return t.getInstance = function() {
|
|
13
30
|
return this._instance || (this._instance = new t()), this._instance;
|
|
14
|
-
}, t.prototype.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
31
|
+
}, t.prototype.setGlobalContextManager = function(e) {
|
|
32
|
+
return s(l, e, u.instance());
|
|
33
|
+
}, t.prototype.active = function() {
|
|
34
|
+
return this._getContextManager().active();
|
|
35
|
+
}, t.prototype.with = function(e, a, n) {
|
|
36
|
+
for (var o, r = [], i = 3; i < arguments.length; i++)
|
|
37
|
+
r[i - 3] = arguments[i];
|
|
38
|
+
return (o = this._getContextManager()).with.apply(o, d([e, a, n], y(r), !1));
|
|
39
|
+
}, t.prototype.bind = function(e, a) {
|
|
40
|
+
return this._getContextManager().bind(e, a);
|
|
41
|
+
}, t.prototype._getContextManager = function() {
|
|
42
|
+
return p(l) || _;
|
|
21
43
|
}, t.prototype.disable = function() {
|
|
22
|
-
|
|
44
|
+
this._getContextManager().disable(), g(l, u.instance());
|
|
23
45
|
}, t;
|
|
24
46
|
})()
|
|
25
47
|
);
|
|
26
48
|
export {
|
|
27
|
-
|
|
49
|
+
A as ContextAPI
|
|
28
50
|
};
|
|
@@ -1,13 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { registerGlobal as a, getGlobal as p, unregisterGlobal as s } from "./vue-components.es57.js";
|
|
2
|
+
import { ProxyTracerProvider as i } from "./vue-components.es45.js";
|
|
3
|
+
import { wrapSpanContext as c, isSpanContextValid as h } from "./vue-components.es48.js";
|
|
4
|
+
import { deleteSpan as g, getSpan as S, getActiveSpan as x, getSpanContext as d, setSpan as f, setSpanContext as l } from "./vue-components.es58.js";
|
|
5
|
+
import { DiagAPI as o } from "./vue-components.es54.js";
|
|
6
|
+
var n = "trace", y = (
|
|
7
|
+
/** @class */
|
|
8
|
+
(function() {
|
|
9
|
+
function t() {
|
|
10
|
+
this._proxyTracerProvider = new i(), this.wrapSpanContext = c, this.isSpanContextValid = h, this.deleteSpan = g, this.getSpan = S, this.getActiveSpan = x, this.getSpanContext = d, this.setSpan = f, this.setSpanContext = l;
|
|
11
|
+
}
|
|
12
|
+
return t.getInstance = function() {
|
|
13
|
+
return this._instance || (this._instance = new t()), this._instance;
|
|
14
|
+
}, t.prototype.setGlobalTracerProvider = function(r) {
|
|
15
|
+
var e = a(n, this._proxyTracerProvider, o.instance());
|
|
16
|
+
return e && this._proxyTracerProvider.setDelegate(r), e;
|
|
17
|
+
}, t.prototype.getTracerProvider = function() {
|
|
18
|
+
return p(n) || this._proxyTracerProvider;
|
|
19
|
+
}, t.prototype.getTracer = function(r, e) {
|
|
20
|
+
return this.getTracerProvider().getTracer(r, e);
|
|
21
|
+
}, t.prototype.disable = function() {
|
|
22
|
+
s(n, o.instance()), this._proxyTracerProvider = new i();
|
|
23
|
+
}, t;
|
|
24
|
+
})()
|
|
25
|
+
);
|
|
11
26
|
export {
|
|
12
|
-
|
|
27
|
+
y as TraceAPI
|
|
13
28
|
};
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
1
|
+
import { useStore as u } from "@tanstack/vue-form";
|
|
2
|
+
import { computed as f } from "vue";
|
|
3
|
+
function c(o, t) {
|
|
4
|
+
return f(() => t ? u(o.store, (n) => {
|
|
5
|
+
const r = {};
|
|
6
|
+
for (const e of t)
|
|
7
|
+
r[e] = n[e];
|
|
8
|
+
return r;
|
|
9
|
+
}).value : {});
|
|
10
|
+
}
|
|
4
11
|
export {
|
|
5
|
-
|
|
12
|
+
c as getOmegaStore
|
|
6
13
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DiagComponentLogger as m } from "./vue-components.es55.js";
|
|
2
2
|
import { createLogLevelDiagLogger as y } from "./vue-components.es56.js";
|
|
3
|
-
import { DiagLogLevel as d } from "./vue-components.
|
|
3
|
+
import { DiagLogLevel as d } from "./vue-components.es42.js";
|
|
4
4
|
import { unregisterGlobal as p, getGlobal as v, registerGlobal as w } from "./vue-components.es57.js";
|
|
5
5
|
var b = function(i, n) {
|
|
6
6
|
var r = typeof Symbol == "function" && i[Symbol.iterator];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createContextKey as o } from "./vue-components.
|
|
2
|
-
import { NonRecordingSpan as a } from "./vue-components.
|
|
3
|
-
import { ContextAPI as u } from "./vue-components.
|
|
1
|
+
import { createContextKey as o } from "./vue-components.es41.js";
|
|
2
|
+
import { NonRecordingSpan as a } from "./vue-components.es50.js";
|
|
3
|
+
import { ContextAPI as u } from "./vue-components.es51.js";
|
|
4
4
|
var n = o("OpenTelemetry Context Key SPAN");
|
|
5
5
|
function r(e) {
|
|
6
6
|
return e.getValue(n) || void 0;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineComponent as d,
|
|
2
|
-
import
|
|
3
|
-
const
|
|
1
|
+
import { defineComponent as d, createBlock as u, openBlock as g, unref as l, withCtx as o, renderSlot as n, createVNode as r, createCommentVNode as c, normalizeProps as s, guardReactiveProps as f, createSlots as $, renderList as y } from "vue";
|
|
2
|
+
import C from "./vue-components.es9.js";
|
|
3
|
+
const h = /* @__PURE__ */ d({
|
|
4
4
|
__name: "OmegaTaggedUnion",
|
|
5
5
|
props: {
|
|
6
6
|
name: {},
|
|
@@ -9,46 +9,38 @@ const B = /* @__PURE__ */ d({
|
|
|
9
9
|
options: {},
|
|
10
10
|
label: {}
|
|
11
11
|
},
|
|
12
|
-
setup(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
e.form.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
})
|
|
24
|
-
}
|
|
25
|
-
}), (t, o) => (g(), p(v, null, [
|
|
26
|
-
m(i(n.form).Input, {
|
|
27
|
-
name: `${n.name}._tag`,
|
|
28
|
-
label: n.label,
|
|
29
|
-
type: n.type ?? "select",
|
|
30
|
-
options: n.options
|
|
31
|
-
}, null, 8, ["name", "label", "type", "options"]),
|
|
32
|
-
m(i(n.form).Field, { name: n.name }, {
|
|
33
|
-
default: u(({ field: a, state: l }) => [
|
|
34
|
-
l.value ? f(t.$slots, "default", { key: 0 }) : V("", !0),
|
|
35
|
-
m(k, {
|
|
36
|
-
field: a,
|
|
37
|
-
state: l.value
|
|
38
|
-
}, b({ _: 2 }, [
|
|
39
|
-
y(t.$slots, (C, r) => ({
|
|
40
|
-
name: r,
|
|
41
|
-
fn: u((s) => [
|
|
42
|
-
f(t.$slots, r, F($(s)))
|
|
43
|
-
])
|
|
44
|
-
}))
|
|
45
|
-
]), 1032, ["field", "state"])
|
|
12
|
+
setup(e) {
|
|
13
|
+
return (a, b) => (g(), u(l(e.form).Field, {
|
|
14
|
+
name: e.name ? `${e.name}._tag` : "_tag"
|
|
15
|
+
}, {
|
|
16
|
+
default: o((t) => [
|
|
17
|
+
n(a.$slots, "OmegaCustomInput", s(f(t)), () => [
|
|
18
|
+
r(l(e.form).Input, {
|
|
19
|
+
name: e.name ? `${e.name}._tag` : "_tag",
|
|
20
|
+
label: e.label,
|
|
21
|
+
type: e.type ?? "select",
|
|
22
|
+
options: e.options
|
|
23
|
+
}, null, 8, ["name", "label", "type", "options"])
|
|
46
24
|
]),
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
25
|
+
n(a.$slots, "default"),
|
|
26
|
+
r(C, {
|
|
27
|
+
field: t.field,
|
|
28
|
+
state: t.state.value,
|
|
29
|
+
name: e.name
|
|
30
|
+
}, $({ _: 2 }, [
|
|
31
|
+
y(a.$slots, (k, m) => ({
|
|
32
|
+
name: m,
|
|
33
|
+
fn: o((i) => [
|
|
34
|
+
n(a.$slots, m, s(f(i)))
|
|
35
|
+
])
|
|
36
|
+
}))
|
|
37
|
+
]), 1032, ["field", "state", "name"]),
|
|
38
|
+
t.state.value ? n(a.$slots, "OmegaCommon", { key: 0 }) : c("", !0)
|
|
39
|
+
]),
|
|
40
|
+
_: 3
|
|
41
|
+
}, 8, ["name"]));
|
|
50
42
|
}
|
|
51
43
|
});
|
|
52
44
|
export {
|
|
53
|
-
|
|
45
|
+
h as default
|
|
54
46
|
};
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { defineComponent as l, watch as
|
|
2
|
-
const
|
|
1
|
+
import { defineComponent as l, watch as i, renderSlot as m, createCommentVNode as s, normalizeProps as o, mergeProps as r } from "vue";
|
|
2
|
+
const f = /* @__PURE__ */ l({
|
|
3
3
|
__name: "OmegaTaggedUnionInternal",
|
|
4
4
|
props: {
|
|
5
5
|
state: {},
|
|
6
|
-
field: {}
|
|
6
|
+
field: {},
|
|
7
|
+
name: {}
|
|
7
8
|
},
|
|
8
9
|
setup(e) {
|
|
9
10
|
const a = e;
|
|
10
|
-
return
|
|
11
|
+
return i(() => a.state, (t, n) => {
|
|
11
12
|
t === null && a.field.setValue(null), t !== n && setTimeout(() => {
|
|
12
13
|
a.field.validate("change");
|
|
13
14
|
}, 0);
|
|
14
|
-
}), (t, n) => e.state
|
|
15
|
+
}), (t, n) => e.state ? m(t.$slots, `${e.name ? `${e.name}.` : ""}${e.state}`, o(r({ key: 0 }, { field: e.field, state: e.state }))) : s("", !0);
|
|
15
16
|
}
|
|
16
17
|
});
|
|
17
18
|
export {
|
|
18
|
-
|
|
19
|
+
f as default
|
|
19
20
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/vue-components",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.1",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@mdi/js": "^7.4.47",
|
|
6
6
|
"effect": "^3.18.0",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"highlight.js": "^11.11.1",
|
|
54
54
|
"mitt": "^3.0.1",
|
|
55
55
|
"vue3-highlightjs": "^1.0.5",
|
|
56
|
-
"effect-app": "
|
|
57
|
-
"
|
|
56
|
+
"@effect-app/vue": "2.92.2",
|
|
57
|
+
"effect-app": "3.12.0"
|
|
58
58
|
},
|
|
59
59
|
"scripts": {
|
|
60
60
|
"build": "pnpm build:run",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import type { DeepKeys, DeepValue, FieldApi, FieldAsyncValidateOrFn, FieldValidateAsyncFn, FieldValidateFn, FieldValidateOrFn, FormAsyncValidateOrFn, FormValidateOrFn, StandardSchemaV1 } from "@tanstack/vue-form"
|
|
3
|
+
import { type IsUnion } from "effect-app/utils"
|
|
3
4
|
|
|
4
5
|
export type OmegaFieldInternalApi<From extends Record<PropertyKey, any>, TName extends DeepKeys<From>> = FieldApi<
|
|
5
6
|
/* in out TParentData*/ From,
|
|
@@ -60,10 +61,13 @@ export type VuetifyInputProps<From extends Record<PropertyKey, any>, TName exten
|
|
|
60
61
|
// Utility type to extract _tag literal values from a discriminated union
|
|
61
62
|
// For a union like { _tag: "A", ... } | { _tag: "B", ... }, this returns "A" | "B"
|
|
62
63
|
// For nullable unions like { _tag: "A" } | { _tag: "B" } | null, this still returns "A" | "B" (excluding null)
|
|
63
|
-
export type ExtractTagValue<
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
export type ExtractTagValue<
|
|
65
|
+
From extends Record<PropertyKey, any>,
|
|
66
|
+
TName extends DeepKeys<From> | undefined
|
|
67
|
+
> = IsUnion<TName> extends true ? From extends { _tag: infer Tag } ? Tag : never
|
|
68
|
+
: DeepValue<From, TName> extends infer U ? U extends { _tag: infer Tag } ? Tag
|
|
66
69
|
: never
|
|
70
|
+
: never
|
|
67
71
|
|
|
68
72
|
// Utility type to extract a specific branch from a discriminated union based on _tag value
|
|
69
73
|
// For union { _tag: "A", foo: string } | { _tag: "B", bar: number } and Tag="A", returns { _tag: "A", foo: string }
|
|
@@ -72,16 +76,21 @@ export type ExtractUnionBranch<T, Tag> = T extends { _tag: Tag } ? T
|
|
|
72
76
|
|
|
73
77
|
// Option type for TaggedUnion component with strongly-typed value
|
|
74
78
|
// The value can be either one of the _tag values OR null (for the placeholder)
|
|
75
|
-
export type TaggedUnionOption<From extends Record<PropertyKey, any>, TName extends DeepKeys<From
|
|
79
|
+
export type TaggedUnionOption<From extends Record<PropertyKey, any>, TName extends DeepKeys<From> | undefined> = {
|
|
76
80
|
readonly title: string
|
|
77
81
|
readonly value: ExtractTagValue<From, TName> | null
|
|
78
82
|
}
|
|
79
83
|
|
|
80
84
|
// Options array must ALWAYS start with a null option (placeholder), followed by the actual options
|
|
81
|
-
export type TaggedUnionOptionsArray<
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
+
export type TaggedUnionOptionsArray<
|
|
86
|
+
From extends Record<PropertyKey, any>,
|
|
87
|
+
TName extends DeepKeys<From> | undefined
|
|
88
|
+
> =
|
|
89
|
+
| readonly [
|
|
90
|
+
{ readonly title: string; readonly value: null },
|
|
91
|
+
...ReadonlyArray<{ readonly title: string; readonly value: ExtractTagValue<From, TName> }>
|
|
92
|
+
]
|
|
93
|
+
| ReadonlyArray<{ readonly title: string; readonly value: ExtractTagValue<From, TName> }>
|
|
85
94
|
|
|
86
95
|
// Props for TaggedUnion component
|
|
87
96
|
export type TaggedUnionProps<From extends Record<PropertyKey, any>, TName extends DeepKeys<From>> = {
|
|
@@ -695,6 +695,58 @@ const flattenMeta = <From, To>(
|
|
|
695
695
|
return flattenMeta(S.make(ast.from))
|
|
696
696
|
}
|
|
697
697
|
|
|
698
|
+
// Handle root-level Union types (discriminated unions)
|
|
699
|
+
if (ast._tag === "Union") {
|
|
700
|
+
const unionAst = ast as any
|
|
701
|
+
const types = unionAst.types || []
|
|
702
|
+
|
|
703
|
+
// Filter out null/undefined types and unwrap transformations
|
|
704
|
+
const nonNullTypes = types
|
|
705
|
+
.filter((t: any) => t._tag !== "UndefinedKeyword" && t !== S.Null.ast)
|
|
706
|
+
.map(getTransformationFrom)
|
|
707
|
+
|
|
708
|
+
// Check if this is a discriminated union (all members are structs)
|
|
709
|
+
const allStructs = nonNullTypes.every((t: any) => t._tag === "TypeLiteral" && "propertySignatures" in t)
|
|
710
|
+
|
|
711
|
+
if (allStructs && nonNullTypes.length > 0) {
|
|
712
|
+
// Extract discriminator values from each union member
|
|
713
|
+
const discriminatorValues: any[] = []
|
|
714
|
+
|
|
715
|
+
// Merge metadata from all union members
|
|
716
|
+
for (const memberType of nonNullTypes) {
|
|
717
|
+
if ("propertySignatures" in memberType) {
|
|
718
|
+
// Find the discriminator field (usually _tag)
|
|
719
|
+
const tagProp = memberType.propertySignatures.find(
|
|
720
|
+
(p: any) => p.name.toString() === "_tag"
|
|
721
|
+
)
|
|
722
|
+
|
|
723
|
+
if (tagProp && S.AST.isLiteral(tagProp.type)) {
|
|
724
|
+
discriminatorValues.push(tagProp.type.literal)
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// Create metadata for this member's properties
|
|
728
|
+
const memberMeta = createMeta<To>({
|
|
729
|
+
propertySignatures: memberType.propertySignatures
|
|
730
|
+
})
|
|
731
|
+
|
|
732
|
+
// Merge into result
|
|
733
|
+
Object.assign(result, memberMeta)
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// Create metadata for the discriminator field
|
|
738
|
+
if (discriminatorValues.length > 0) {
|
|
739
|
+
result["_tag" as DeepKeys<To>] = {
|
|
740
|
+
type: "select",
|
|
741
|
+
members: discriminatorValues,
|
|
742
|
+
required: true
|
|
743
|
+
} as FieldMeta
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
return result
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
|
|
698
750
|
if ("propertySignatures" in ast) {
|
|
699
751
|
const meta = createMeta<To>({
|
|
700
752
|
propertySignatures: ast.propertySignatures
|
|
@@ -4,59 +4,43 @@
|
|
|
4
4
|
generic="
|
|
5
5
|
From extends Record<PropertyKey, any>,
|
|
6
6
|
To extends Record<PropertyKey, any>,
|
|
7
|
-
Name extends DeepKeys<From>
|
|
7
|
+
Name extends DeepKeys<From> | undefined = DeepKeys<From>
|
|
8
8
|
"
|
|
9
9
|
>
|
|
10
|
-
import { type DeepKeys
|
|
11
|
-
import {
|
|
12
|
-
import { type TaggedUnionOption, type TaggedUnionOptionsArray } from "./InputProps"
|
|
10
|
+
import { type DeepKeys } from "@tanstack/vue-form"
|
|
11
|
+
import { type TaggedUnionOption } from "./InputProps"
|
|
13
12
|
import { type FieldPath } from "./OmegaFormStuff"
|
|
14
13
|
import OmegaTaggedUnionInternal from "./OmegaTaggedUnionInternal.vue"
|
|
15
14
|
import { type useOmegaForm } from "./useOmegaForm"
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
name
|
|
16
|
+
defineProps<{
|
|
17
|
+
name?: Name
|
|
19
18
|
form: ReturnType<typeof useOmegaForm<From, To>>
|
|
20
19
|
type?: "select" | "radio"
|
|
21
|
-
options:
|
|
20
|
+
options: TaggedUnionOption<From, Name>[]
|
|
22
21
|
label?: string
|
|
23
22
|
}>()
|
|
24
|
-
|
|
25
|
-
// Initialize the union field on mount
|
|
26
|
-
onMounted(() => {
|
|
27
|
-
const currentValue = props.form.getFieldValue(props.name)
|
|
28
|
-
const meta = props.form.meta[props.name as keyof typeof props.form.meta]
|
|
29
|
-
|
|
30
|
-
if (currentValue === undefined) {
|
|
31
|
-
if (meta?.nullableOrUndefined === "null" || !meta?.required) {
|
|
32
|
-
// Initialize to null for nullable/optional unions
|
|
33
|
-
props.form.setFieldValue(props.name, null as DeepValue<From, Name>)
|
|
34
|
-
} else {
|
|
35
|
-
// For required unions, initialize with first non-null option
|
|
36
|
-
const firstOption = props.options.find((opt) => opt.value !== null)
|
|
37
|
-
if (firstOption && firstOption.value) {
|
|
38
|
-
props.form.setFieldValue(props.name, {
|
|
39
|
-
_tag: firstOption.value
|
|
40
|
-
} as DeepValue<From, Name>)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
23
|
</script>
|
|
46
24
|
|
|
47
25
|
<template>
|
|
48
|
-
<form.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
26
|
+
<form.Field :name="(name ? `${name}._tag` : '_tag') as any">
|
|
27
|
+
<template #default="inputProps">
|
|
28
|
+
<slot
|
|
29
|
+
name="OmegaCustomInput"
|
|
30
|
+
v-bind="inputProps"
|
|
31
|
+
>
|
|
32
|
+
<form.Input
|
|
33
|
+
:name="(name ? `${name}._tag` : '_tag') as FieldPath<From>"
|
|
34
|
+
:label="label"
|
|
35
|
+
:type="type ?? 'select'"
|
|
36
|
+
:options="options"
|
|
37
|
+
/>
|
|
38
|
+
</slot>
|
|
39
|
+
<slot />
|
|
57
40
|
<OmegaTaggedUnionInternal
|
|
58
|
-
:field="field as any"
|
|
59
|
-
:state="state.value"
|
|
41
|
+
:field="inputProps.field as any"
|
|
42
|
+
:state="inputProps.state.value"
|
|
43
|
+
:name="name"
|
|
60
44
|
>
|
|
61
45
|
<template
|
|
62
46
|
v-for="(_, slotname) in $slots"
|
|
@@ -68,6 +52,10 @@ onMounted(() => {
|
|
|
68
52
|
/>
|
|
69
53
|
</template>
|
|
70
54
|
</OmegaTaggedUnionInternal>
|
|
55
|
+
<slot
|
|
56
|
+
v-if="inputProps.state.value"
|
|
57
|
+
name="OmegaCommon"
|
|
58
|
+
/>
|
|
71
59
|
</template>
|
|
72
60
|
</form.Field>
|
|
73
61
|
</template>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<slot
|
|
3
|
-
v-if="state
|
|
4
|
-
:name="state
|
|
3
|
+
v-if="state"
|
|
4
|
+
:name="`${name ? `${name}.` : ''}${state}`"
|
|
5
5
|
v-bind="{ field, state }"
|
|
6
6
|
/>
|
|
7
7
|
</template>
|
|
@@ -22,10 +22,11 @@ import { type OmegaFieldInternalApi } from "./InputProps"
|
|
|
22
22
|
const props = defineProps<{
|
|
23
23
|
state: DeepValue<From, Name>
|
|
24
24
|
field: OmegaFieldInternalApi<From, Name>
|
|
25
|
+
name?: DeepKeys<From>
|
|
25
26
|
}>()
|
|
26
27
|
|
|
27
28
|
// Watch for _tag changes
|
|
28
|
-
watch(() => props.state
|
|
29
|
+
watch(() => props.state, (newTag, oldTag) => {
|
|
29
30
|
if (newTag === null) {
|
|
30
31
|
props.field.setValue(null as DeepValue<From, Name>)
|
|
31
32
|
}
|