@mulmoclaude/collection-plugin 0.13.0 → 0.13.2
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/style.css +13 -4
- package/dist/vue/components/CollectionView.vue.d.ts.map +1 -1
- package/dist/vue/lang/en.d.ts +1 -1
- package/dist/vue/lang/index.d.ts +1 -1
- package/dist/vue.cjs +269 -187
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.js +269 -187
- package/dist/vue.js.map +1 -1
- package/package.json +3 -3
package/dist/vue.cjs
CHANGED
|
@@ -114,7 +114,7 @@ var i18n = (0, vue_i18n.createI18n)({
|
|
|
114
114
|
searchSummary: "Showing {shown} of {total}",
|
|
115
115
|
noMatchingItems: "No matching items",
|
|
116
116
|
clearSearch: "Clear search",
|
|
117
|
-
|
|
117
|
+
flagFilterButton: "Filters",
|
|
118
118
|
flagFilterAll: "Filter by {label}",
|
|
119
119
|
flagFilterHide: "Hiding {label}",
|
|
120
120
|
flagFilterOnly: "Only {label}",
|
|
@@ -262,7 +262,7 @@ var i18n = (0, vue_i18n.createI18n)({
|
|
|
262
262
|
searchSummary: "{total} 件中 {shown} 件を表示",
|
|
263
263
|
noMatchingItems: "一致する項目がありません",
|
|
264
264
|
clearSearch: "検索をクリア",
|
|
265
|
-
|
|
265
|
+
flagFilterButton: "絞り込み",
|
|
266
266
|
flagFilterAll: "{label} で絞り込む",
|
|
267
267
|
flagFilterHide: "{label} を非表示中",
|
|
268
268
|
flagFilterOnly: "{label} のみ表示中",
|
|
@@ -410,7 +410,7 @@ var i18n = (0, vue_i18n.createI18n)({
|
|
|
410
410
|
searchSummary: "显示 {total} 条中的 {shown} 条",
|
|
411
411
|
noMatchingItems: "没有匹配的项目",
|
|
412
412
|
clearSearch: "清除搜索",
|
|
413
|
-
|
|
413
|
+
flagFilterButton: "筛选",
|
|
414
414
|
flagFilterAll: "按{label}筛选",
|
|
415
415
|
flagFilterHide: "已隐藏{label}",
|
|
416
416
|
flagFilterOnly: "仅显示{label}",
|
|
@@ -558,7 +558,7 @@ var i18n = (0, vue_i18n.createI18n)({
|
|
|
558
558
|
searchSummary: "{total}개 중 {shown}개 표시",
|
|
559
559
|
noMatchingItems: "일치하는 항목이 없습니다",
|
|
560
560
|
clearSearch: "검색 지우기",
|
|
561
|
-
|
|
561
|
+
flagFilterButton: "필터",
|
|
562
562
|
flagFilterAll: "{label}(으)로 필터",
|
|
563
563
|
flagFilterHide: "{label} 숨김",
|
|
564
564
|
flagFilterOnly: "{label}만 표시",
|
|
@@ -706,7 +706,7 @@ var i18n = (0, vue_i18n.createI18n)({
|
|
|
706
706
|
searchSummary: "Mostrando {shown} de {total}",
|
|
707
707
|
noMatchingItems: "No hay elementos coincidentes",
|
|
708
708
|
clearSearch: "Borrar búsqueda",
|
|
709
|
-
|
|
709
|
+
flagFilterButton: "Filtros",
|
|
710
710
|
flagFilterAll: "Filtrar por {label}",
|
|
711
711
|
flagFilterHide: "Ocultando {label}",
|
|
712
712
|
flagFilterOnly: "Solo {label}",
|
|
@@ -854,7 +854,7 @@ var i18n = (0, vue_i18n.createI18n)({
|
|
|
854
854
|
searchSummary: "Mostrando {shown} de {total}",
|
|
855
855
|
noMatchingItems: "Nenhum item correspondente",
|
|
856
856
|
clearSearch: "Limpar busca",
|
|
857
|
-
|
|
857
|
+
flagFilterButton: "Filtros",
|
|
858
858
|
flagFilterAll: "Filtrar por {label}",
|
|
859
859
|
flagFilterHide: "Ocultando {label}",
|
|
860
860
|
flagFilterOnly: "Somente {label}",
|
|
@@ -1002,7 +1002,7 @@ var i18n = (0, vue_i18n.createI18n)({
|
|
|
1002
1002
|
searchSummary: "Affichage de {shown} sur {total}",
|
|
1003
1003
|
noMatchingItems: "Aucun élément correspondant",
|
|
1004
1004
|
clearSearch: "Effacer la recherche",
|
|
1005
|
-
|
|
1005
|
+
flagFilterButton: "Filtres",
|
|
1006
1006
|
flagFilterAll: "Filtrer par {label}",
|
|
1007
1007
|
flagFilterHide: "{label} masqué",
|
|
1008
1008
|
flagFilterOnly: "Uniquement {label}",
|
|
@@ -1150,7 +1150,7 @@ var i18n = (0, vue_i18n.createI18n)({
|
|
|
1150
1150
|
searchSummary: "{shown} von {total} werden angezeigt",
|
|
1151
1151
|
noMatchingItems: "Keine passenden Einträge",
|
|
1152
1152
|
clearSearch: "Suche zurücksetzen",
|
|
1153
|
-
|
|
1153
|
+
flagFilterButton: "Filter",
|
|
1154
1154
|
flagFilterAll: "Nach {label} filtern",
|
|
1155
1155
|
flagFilterHide: "{label} ausgeblendet",
|
|
1156
1156
|
flagFilterOnly: "Nur {label}",
|
|
@@ -4043,199 +4043,201 @@ var _hoisted_21$3 = {
|
|
|
4043
4043
|
var _hoisted_22$3 = ["placeholder", "aria-label"];
|
|
4044
4044
|
var _hoisted_23$2 = ["aria-label"];
|
|
4045
4045
|
var _hoisted_24$1 = { class: "flex items-center gap-2" };
|
|
4046
|
-
var _hoisted_25$1 = ["aria-label"];
|
|
4047
|
-
var _hoisted_26$1 =
|
|
4046
|
+
var _hoisted_25$1 = ["aria-label", "aria-expanded"];
|
|
4047
|
+
var _hoisted_26$1 = {
|
|
4048
|
+
key: 0,
|
|
4049
|
+
class: "min-w-4 h-4 px-1 flex items-center justify-center rounded-full bg-indigo-600 text-white text-[10px] font-bold"
|
|
4050
|
+
};
|
|
4051
|
+
var _hoisted_27$1 = ["aria-label"];
|
|
4052
|
+
var _hoisted_28 = [
|
|
4048
4053
|
"title",
|
|
4049
4054
|
"aria-label",
|
|
4050
4055
|
"aria-pressed",
|
|
4051
4056
|
"data-testid",
|
|
4052
4057
|
"onClick"
|
|
4053
4058
|
];
|
|
4054
|
-
var
|
|
4055
|
-
|
|
4056
|
-
"aria-hidden": "true"
|
|
4057
|
-
};
|
|
4058
|
-
var _hoisted_28 = ["aria-label"];
|
|
4059
|
-
var _hoisted_29 = ["aria-pressed"];
|
|
4060
|
-
var _hoisted_30 = ["aria-pressed"];
|
|
4059
|
+
var _hoisted_29 = { class: "flex-1 text-left" };
|
|
4060
|
+
var _hoisted_30 = ["aria-label"];
|
|
4061
4061
|
var _hoisted_31 = ["aria-pressed"];
|
|
4062
|
-
var _hoisted_32 = [
|
|
4062
|
+
var _hoisted_32 = ["aria-pressed"];
|
|
4063
|
+
var _hoisted_33 = ["aria-pressed"];
|
|
4064
|
+
var _hoisted_34 = [
|
|
4063
4065
|
"aria-pressed",
|
|
4064
4066
|
"data-testid",
|
|
4065
4067
|
"onClick"
|
|
4066
4068
|
];
|
|
4067
|
-
var
|
|
4068
|
-
var
|
|
4069
|
+
var _hoisted_35 = { class: "material-icons text-sm" };
|
|
4070
|
+
var _hoisted_36 = [
|
|
4069
4071
|
"title",
|
|
4070
4072
|
"aria-label",
|
|
4071
4073
|
"aria-expanded"
|
|
4072
4074
|
];
|
|
4073
|
-
var
|
|
4075
|
+
var _hoisted_37 = {
|
|
4074
4076
|
key: 0,
|
|
4075
4077
|
class: "absolute left-0 top-full mt-1 z-20 min-w-max rounded border border-slate-200 bg-white shadow-lg py-1",
|
|
4076
4078
|
"data-testid": "collection-view-add-menu"
|
|
4077
4079
|
};
|
|
4078
|
-
var
|
|
4079
|
-
var _hoisted_37 = ["value", "aria-label"];
|
|
4080
|
-
var _hoisted_38 = ["value"];
|
|
4080
|
+
var _hoisted_38 = ["title", "aria-label"];
|
|
4081
4081
|
var _hoisted_39 = ["value", "aria-label"];
|
|
4082
4082
|
var _hoisted_40 = ["value"];
|
|
4083
|
-
var _hoisted_41 =
|
|
4083
|
+
var _hoisted_41 = ["value", "aria-label"];
|
|
4084
|
+
var _hoisted_42 = ["value"];
|
|
4085
|
+
var _hoisted_43 = {
|
|
4084
4086
|
key: 4,
|
|
4085
4087
|
class: "text-[10px] text-slate-400 font-bold uppercase tracking-wider select-none"
|
|
4086
4088
|
};
|
|
4087
|
-
var
|
|
4089
|
+
var _hoisted_44 = {
|
|
4088
4090
|
key: 3,
|
|
4089
4091
|
class: "mx-6 mt-4 rounded-xl border border-amber-200 bg-amber-50/60 p-4 text-sm text-amber-900 shadow-sm flex items-center gap-3",
|
|
4090
4092
|
"data-testid": "collections-data-issues"
|
|
4091
4093
|
};
|
|
4092
|
-
var
|
|
4093
|
-
var
|
|
4094
|
-
var
|
|
4094
|
+
var _hoisted_45 = { class: "flex-1" };
|
|
4095
|
+
var _hoisted_46 = { class: "flex-1 overflow-auto" };
|
|
4096
|
+
var _hoisted_47 = {
|
|
4095
4097
|
key: 0,
|
|
4096
4098
|
class: "flex flex-col items-center justify-center py-20 text-sm text-slate-500 gap-3"
|
|
4097
4099
|
};
|
|
4098
|
-
var
|
|
4100
|
+
var _hoisted_48 = {
|
|
4099
4101
|
key: 1,
|
|
4100
4102
|
class: "m-6 rounded-xl border border-red-200 bg-red-50/50 p-4 text-sm text-red-800 shadow-sm flex items-center gap-3"
|
|
4101
4103
|
};
|
|
4102
|
-
var
|
|
4103
|
-
var
|
|
4104
|
+
var _hoisted_49 = { key: 2 };
|
|
4105
|
+
var _hoisted_50 = {
|
|
4104
4106
|
key: 3,
|
|
4105
4107
|
class: "p-4"
|
|
4106
4108
|
};
|
|
4107
|
-
var
|
|
4109
|
+
var _hoisted_51 = {
|
|
4108
4110
|
key: 4,
|
|
4109
4111
|
class: "h-full flex flex-col"
|
|
4110
4112
|
};
|
|
4111
|
-
var
|
|
4113
|
+
var _hoisted_52 = {
|
|
4112
4114
|
key: 0,
|
|
4113
4115
|
class: "m-3 mb-0 rounded-xl border border-red-200 bg-red-50/50 p-4 text-sm text-red-800 shadow-sm flex items-center gap-3",
|
|
4114
4116
|
"data-testid": "collections-inline-error"
|
|
4115
4117
|
};
|
|
4116
|
-
var
|
|
4117
|
-
var
|
|
4118
|
-
var
|
|
4119
|
-
var
|
|
4118
|
+
var _hoisted_53 = { class: "flex-1" };
|
|
4119
|
+
var _hoisted_54 = ["aria-label"];
|
|
4120
|
+
var _hoisted_55 = { class: "flex-1 min-h-0 px-3 py-2" };
|
|
4121
|
+
var _hoisted_56 = {
|
|
4120
4122
|
key: 5,
|
|
4121
4123
|
class: "h-full",
|
|
4122
4124
|
"data-testid": "collection-custom-view-body"
|
|
4123
4125
|
};
|
|
4124
|
-
var
|
|
4126
|
+
var _hoisted_57 = {
|
|
4125
4127
|
key: 6,
|
|
4126
4128
|
class: "flex flex-col items-center justify-center py-20 text-sm text-slate-400 gap-2"
|
|
4127
4129
|
};
|
|
4128
|
-
var
|
|
4129
|
-
var
|
|
4130
|
+
var _hoisted_58 = { class: "font-semibold text-slate-600" };
|
|
4131
|
+
var _hoisted_59 = {
|
|
4130
4132
|
key: 7,
|
|
4131
4133
|
class: "flex flex-col items-center justify-center py-20 text-sm text-slate-400 gap-2"
|
|
4132
4134
|
};
|
|
4133
|
-
var
|
|
4134
|
-
var
|
|
4135
|
+
var _hoisted_60 = { class: "font-semibold text-slate-600" };
|
|
4136
|
+
var _hoisted_61 = {
|
|
4135
4137
|
key: 8,
|
|
4136
4138
|
class: "overflow-x-auto [container-type:inline-size]"
|
|
4137
4139
|
};
|
|
4138
|
-
var
|
|
4140
|
+
var _hoisted_62 = {
|
|
4139
4141
|
key: 0,
|
|
4140
4142
|
class: "m-4 rounded-xl border border-red-200 bg-red-50/50 p-4 text-sm text-red-800 shadow-sm flex items-center gap-3",
|
|
4141
4143
|
"data-testid": "collections-inline-error"
|
|
4142
4144
|
};
|
|
4143
|
-
var
|
|
4144
|
-
var
|
|
4145
|
-
var
|
|
4146
|
-
var
|
|
4147
|
-
var
|
|
4148
|
-
var
|
|
4149
|
-
var
|
|
4150
|
-
var
|
|
4145
|
+
var _hoisted_63 = { class: "flex-1" };
|
|
4146
|
+
var _hoisted_64 = ["aria-label"];
|
|
4147
|
+
var _hoisted_65 = { class: "min-w-full text-xs" };
|
|
4148
|
+
var _hoisted_66 = { class: "bg-slate-50 border-b border-slate-200" };
|
|
4149
|
+
var _hoisted_67 = ["aria-sort"];
|
|
4150
|
+
var _hoisted_68 = { class: "flex items-center gap-1" };
|
|
4151
|
+
var _hoisted_69 = ["title"];
|
|
4152
|
+
var _hoisted_70 = [
|
|
4151
4153
|
"data-testid",
|
|
4152
4154
|
"aria-label",
|
|
4153
4155
|
"onClick",
|
|
4154
4156
|
"onPointerenter"
|
|
4155
4157
|
];
|
|
4156
|
-
var
|
|
4157
|
-
var
|
|
4158
|
-
var
|
|
4158
|
+
var _hoisted_71 = { class: "material-icons text-base align-middle" };
|
|
4159
|
+
var _hoisted_72 = { class: "divide-y divide-slate-100 bg-white" };
|
|
4160
|
+
var _hoisted_73 = [
|
|
4159
4161
|
"aria-label",
|
|
4160
4162
|
"data-testid",
|
|
4161
4163
|
"onClick",
|
|
4162
4164
|
"onKeydown"
|
|
4163
4165
|
];
|
|
4164
|
-
var
|
|
4166
|
+
var _hoisted_74 = [
|
|
4165
4167
|
"checked",
|
|
4166
4168
|
"disabled",
|
|
4167
4169
|
"data-testid",
|
|
4168
4170
|
"aria-label",
|
|
4169
4171
|
"onChange"
|
|
4170
4172
|
];
|
|
4171
|
-
var
|
|
4173
|
+
var _hoisted_75 = [
|
|
4172
4174
|
"checked",
|
|
4173
4175
|
"disabled",
|
|
4174
4176
|
"data-testid",
|
|
4175
4177
|
"aria-label",
|
|
4176
4178
|
"onChange"
|
|
4177
4179
|
];
|
|
4178
|
-
var
|
|
4179
|
-
var
|
|
4180
|
+
var _hoisted_76 = ["data-testid", "aria-label"];
|
|
4181
|
+
var _hoisted_77 = {
|
|
4180
4182
|
key: 3,
|
|
4181
4183
|
class: "block truncate"
|
|
4182
4184
|
};
|
|
4183
|
-
var
|
|
4185
|
+
var _hoisted_78 = [
|
|
4184
4186
|
"href",
|
|
4185
4187
|
"tabindex",
|
|
4186
4188
|
"data-testid",
|
|
4187
4189
|
"onClick",
|
|
4188
4190
|
"onKeydown"
|
|
4189
4191
|
];
|
|
4190
|
-
var
|
|
4192
|
+
var _hoisted_79 = [
|
|
4191
4193
|
"value",
|
|
4192
4194
|
"disabled",
|
|
4193
4195
|
"data-testid",
|
|
4194
4196
|
"aria-label",
|
|
4195
4197
|
"onChange"
|
|
4196
4198
|
];
|
|
4197
|
-
var
|
|
4199
|
+
var _hoisted_80 = {
|
|
4198
4200
|
key: 0,
|
|
4199
4201
|
value: ""
|
|
4200
4202
|
};
|
|
4201
|
-
var
|
|
4202
|
-
var
|
|
4203
|
+
var _hoisted_81 = ["value"];
|
|
4204
|
+
var _hoisted_82 = {
|
|
4203
4205
|
key: 5,
|
|
4204
4206
|
class: "block truncate tabular-nums font-semibold text-slate-900"
|
|
4205
4207
|
};
|
|
4206
|
-
var
|
|
4208
|
+
var _hoisted_83 = {
|
|
4207
4209
|
key: 6,
|
|
4208
4210
|
class: "inline-flex items-center gap-1 px-2 py-0.5 rounded-lg text-[10px] font-bold bg-slate-100 text-slate-600 border border-slate-200/40"
|
|
4209
4211
|
};
|
|
4210
|
-
var
|
|
4212
|
+
var _hoisted_84 = {
|
|
4211
4213
|
key: 7,
|
|
4212
4214
|
class: "inline-block truncate tabular-nums font-bold text-indigo-900 bg-indigo-50/50 px-1.5 py-0.5 rounded border border-indigo-100/50"
|
|
4213
4215
|
};
|
|
4214
|
-
var
|
|
4215
|
-
var
|
|
4216
|
-
var
|
|
4217
|
-
var
|
|
4216
|
+
var _hoisted_85 = ["data-testid"];
|
|
4217
|
+
var _hoisted_86 = ["href", "data-testid"];
|
|
4218
|
+
var _hoisted_87 = ["href", "data-testid"];
|
|
4219
|
+
var _hoisted_88 = [
|
|
4218
4220
|
"href",
|
|
4219
4221
|
"data-testid",
|
|
4220
4222
|
"onClick"
|
|
4221
4223
|
];
|
|
4222
|
-
var
|
|
4224
|
+
var _hoisted_89 = {
|
|
4223
4225
|
key: 12,
|
|
4224
4226
|
class: "block truncate text-slate-600"
|
|
4225
4227
|
};
|
|
4226
|
-
var
|
|
4227
|
-
var
|
|
4228
|
-
var
|
|
4229
|
-
var
|
|
4228
|
+
var _hoisted_90 = { class: "bg-white rounded-2xl shadow-2xl w-full max-w-xl flex flex-col border border-slate-200 overflow-hidden" };
|
|
4229
|
+
var _hoisted_91 = { class: "px-6 py-4 border-b border-slate-100 flex items-center gap-3 bg-slate-50/50" };
|
|
4230
|
+
var _hoisted_92 = { class: "flex-1" };
|
|
4231
|
+
var _hoisted_93 = {
|
|
4230
4232
|
id: "collections-chat-title",
|
|
4231
4233
|
class: "text-sm font-bold text-slate-800 uppercase tracking-wide"
|
|
4232
4234
|
};
|
|
4233
|
-
var
|
|
4234
|
-
var
|
|
4235
|
-
var
|
|
4236
|
-
var
|
|
4237
|
-
var
|
|
4238
|
-
var
|
|
4235
|
+
var _hoisted_94 = { class: "text-xs text-slate-400 font-semibold" };
|
|
4236
|
+
var _hoisted_95 = ["aria-label"];
|
|
4237
|
+
var _hoisted_96 = { class: "px-6 py-5" };
|
|
4238
|
+
var _hoisted_97 = ["placeholder", "onKeydown"];
|
|
4239
|
+
var _hoisted_98 = { class: "px-6 py-3.5 border-t border-slate-100 flex items-center justify-end gap-2 bg-slate-50/50" };
|
|
4240
|
+
var _hoisted_99 = ["disabled"];
|
|
4239
4241
|
/** `slug` / `selected` are supplied only in EMBEDDED mode (the
|
|
4240
4242
|
* `presentCollection` chat card mounts this component and drives both
|
|
4241
4243
|
* from the tool result). In standalone route mode (the
|
|
@@ -4247,6 +4249,10 @@ var _hoisted_97 = ["disabled"];
|
|
|
4247
4249
|
* actions send into the current session instead of spawning a new
|
|
4248
4250
|
* chat (see `runAction` / `submitChat`). */
|
|
4249
4251
|
var COMPLETION_CHIP_KEY = "__completion";
|
|
4252
|
+
/** The field types that earn a filter-menu entry: declared predicates
|
|
4253
|
+
* (`flag`) plus the fields that ARE a predicate already — a stored
|
|
4254
|
+
* `boolean` and a `toggle`'s projected on/off state. Enums stay out:
|
|
4255
|
+
* they need a value picker, and kanban already slices by enum. */
|
|
4250
4256
|
var LIVE_REFRESH_DEBOUNCE_MS = 150;
|
|
4251
4257
|
//#endregion
|
|
4252
4258
|
//#region src/vue/components/CollectionView.vue
|
|
@@ -4382,14 +4388,34 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
4382
4388
|
return slug ? readCollectionFlagFilters(slug) : {};
|
|
4383
4389
|
}
|
|
4384
4390
|
const flagFilters = (0, vue.ref)(storedFlagFiltersFor(activeSlug.value));
|
|
4391
|
+
const CHIP_FIELD_TYPES = /* @__PURE__ */ new Set([
|
|
4392
|
+
"flag",
|
|
4393
|
+
"boolean",
|
|
4394
|
+
"toggle"
|
|
4395
|
+
]);
|
|
4396
|
+
/** True when an existing FIELD chip already expresses the legacy
|
|
4397
|
+
* completion predicate exactly, so a synthesized "done" chip would be a
|
|
4398
|
+
* duplicate: a boolean `completionField` (done ⇔ `"true"` ⇔ the
|
|
4399
|
+
* boolean's own chip), or a `toggle` projecting the `completionField`
|
|
4400
|
+
* whose `onValue` is the single done value (the todos-schema shape:
|
|
4401
|
+
* toggle "Done" on `status` + `completionDoneValues: ["done"]`). A
|
|
4402
|
+
* superset pair (extra done values) still synthesizes — no field chip
|
|
4403
|
+
* covers it. */
|
|
4404
|
+
function completionCoveredByFieldChip(schema) {
|
|
4405
|
+
const { completionField, completionDoneValues } = schema;
|
|
4406
|
+
if (completionDoneValues?.length !== 1) return false;
|
|
4407
|
+
const [doneValue] = completionDoneValues;
|
|
4408
|
+
if (schema.fields[completionField ?? ""]?.type === "boolean") return doneValue === "true";
|
|
4409
|
+
return Object.values(schema.fields).some((field) => field.type === "toggle" && field.field === completionField && field.onValue === doneValue);
|
|
4410
|
+
}
|
|
4385
4411
|
const flagChips = (0, vue.computed)(() => {
|
|
4386
4412
|
const schema = collection.value?.schema;
|
|
4387
4413
|
if (!schema) return [];
|
|
4388
|
-
const chips = Object.entries(schema.fields).filter(([, field]) => field.type
|
|
4414
|
+
const chips = Object.entries(schema.fields).filter(([, field]) => CHIP_FIELD_TYPES.has(field.type)).map(([key, field]) => ({
|
|
4389
4415
|
key,
|
|
4390
4416
|
label: field.label ?? key
|
|
4391
4417
|
}));
|
|
4392
|
-
if (schema.completionField && schema.completionDoneValues && schema.fields[schema.completionField]?.type !== "flag" && schema.fields[COMPLETION_CHIP_KEY] === void 0) chips.push({
|
|
4418
|
+
if (schema.completionField && schema.completionDoneValues && schema.fields[schema.completionField]?.type !== "flag" && !completionCoveredByFieldChip(schema) && schema.fields[COMPLETION_CHIP_KEY] === void 0) chips.push({
|
|
4393
4419
|
key: COMPLETION_CHIP_KEY,
|
|
4394
4420
|
label: t("collectionsView.flagDoneChip"),
|
|
4395
4421
|
synthetic: true
|
|
@@ -4412,11 +4438,16 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
4412
4438
|
return render.deriveRecord(item)[key] === true;
|
|
4413
4439
|
}
|
|
4414
4440
|
/** The chip's boolean for one row — `itemIsDone` for the synthesized
|
|
4415
|
-
* completion chip, the
|
|
4441
|
+
* completion chip, the stored/projected value for `boolean`/`toggle`
|
|
4442
|
+
* fields, the computed flag value otherwise. */
|
|
4416
4443
|
function chipMatches(chip, item) {
|
|
4417
4444
|
const schema = collection.value?.schema;
|
|
4418
4445
|
if (!schema) return false;
|
|
4419
|
-
|
|
4446
|
+
if (chip.synthetic) return (0, _mulmoclaude_core_collection.itemIsDone)(schema, item);
|
|
4447
|
+
const field = schema.fields[chip.key];
|
|
4448
|
+
if (field?.type === "toggle") return toggleChecked(item, field);
|
|
4449
|
+
if (field?.type === "boolean") return item[chip.key] === true;
|
|
4450
|
+
return flagValueOf(chip.key, item);
|
|
4420
4451
|
}
|
|
4421
4452
|
/** `filteredItems` further narrowed by every ACTIVE chip (AND). Consumed
|
|
4422
4453
|
* only by the table (sortedItems / count summary / empty state). */
|
|
@@ -4436,15 +4467,41 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
4436
4467
|
} : rest;
|
|
4437
4468
|
}
|
|
4438
4469
|
function flagChipIcon(key) {
|
|
4470
|
+
return flagFilterMode(key) === "only" ? "check_box" : "check_box_outline_blank";
|
|
4471
|
+
}
|
|
4472
|
+
function flagChipIconClass(key) {
|
|
4439
4473
|
const mode = flagFilterMode(key);
|
|
4440
|
-
|
|
4474
|
+
if (mode === "hide") return "text-slate-600";
|
|
4475
|
+
if (mode === "only") return "text-indigo-600";
|
|
4476
|
+
return "text-slate-300";
|
|
4441
4477
|
}
|
|
4442
4478
|
function flagChipClass(key) {
|
|
4443
4479
|
const mode = flagFilterMode(key);
|
|
4444
|
-
if (mode === "hide") return "bg-slate-
|
|
4445
|
-
if (mode === "only") return "bg-indigo-
|
|
4446
|
-
return "
|
|
4447
|
-
}
|
|
4480
|
+
if (mode === "hide") return "bg-slate-100 text-slate-700";
|
|
4481
|
+
if (mode === "only") return "bg-indigo-50 text-indigo-700";
|
|
4482
|
+
return "text-slate-500";
|
|
4483
|
+
}
|
|
4484
|
+
/** How many chips currently filter (badge on the menu trigger). */
|
|
4485
|
+
const activeFlagFilterCount = (0, vue.computed)(() => flagChips.value.filter((chip) => flagFilterMode(chip.key) !== void 0).length);
|
|
4486
|
+
const filterMenuOpen = (0, vue.ref)(false);
|
|
4487
|
+
const filterMenuRef = (0, vue.ref)(null);
|
|
4488
|
+
/** Shadow-DOM-safe "did this event land inside the element?". A document-level
|
|
4489
|
+
* listener sees `event.target` retargeted to the shadow HOST when the
|
|
4490
|
+
* component is mounted in a shadow root (MulmoTerminal's PluginFrame), so
|
|
4491
|
+
* `element.contains()` is always false there and the menu closes on the
|
|
4492
|
+
* mousedown before the inner button's click can fire. `composedPath()` still
|
|
4493
|
+
* lists the element for open shadow trees — and in the light DOM too, so both
|
|
4494
|
+
* hosts share this one test. */
|
|
4495
|
+
function eventInsideElement(event, element) {
|
|
4496
|
+
return element !== null && event.composedPath().includes(element);
|
|
4497
|
+
}
|
|
4498
|
+
function closeFilterMenuOnOutsideClick(event) {
|
|
4499
|
+
if (!eventInsideElement(event, filterMenuRef.value)) filterMenuOpen.value = false;
|
|
4500
|
+
}
|
|
4501
|
+
(0, vue.watch)(filterMenuOpen, (open) => {
|
|
4502
|
+
if (open) document.addEventListener("mousedown", closeFilterMenuOnOutsideClick);
|
|
4503
|
+
else document.removeEventListener("mousedown", closeFilterMenuOnOutsideClick);
|
|
4504
|
+
});
|
|
4448
4505
|
function flagChipTitle(chip) {
|
|
4449
4506
|
const mode = flagFilterMode(chip.key);
|
|
4450
4507
|
if (mode === "hide") return t("collectionsView.flagFilterHide", { label: chip.label });
|
|
@@ -4968,7 +5025,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
4968
5025
|
addMenuOpen.value = !addMenuOpen.value;
|
|
4969
5026
|
}
|
|
4970
5027
|
function closeAddMenuOnOutsideClick(event) {
|
|
4971
|
-
if (!addMenuRef.value
|
|
5028
|
+
if (!eventInsideElement(event, addMenuRef.value)) addMenuOpen.value = false;
|
|
4972
5029
|
}
|
|
4973
5030
|
(0, vue.watch)(addMenuOpen, (open) => {
|
|
4974
5031
|
if (open) document.addEventListener("mousedown", closeAddMenuOnOutsideClick);
|
|
@@ -5463,6 +5520,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5463
5520
|
anchorOverride.value = null;
|
|
5464
5521
|
kanbanOverride.value = null;
|
|
5465
5522
|
addMenuOpen.value = false;
|
|
5523
|
+
filterMenuOpen.value = false;
|
|
5466
5524
|
sortState.value = storedSortFor(slug);
|
|
5467
5525
|
flagFilters.value = storedFlagFiltersFor(slug);
|
|
5468
5526
|
}
|
|
@@ -5513,6 +5571,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5513
5571
|
clearLiveRefreshTimer();
|
|
5514
5572
|
if (refreshNoteTimer !== void 0) clearTimeout(refreshNoteTimer);
|
|
5515
5573
|
document.removeEventListener("mousedown", closeAddMenuOnOutsideClick);
|
|
5574
|
+
document.removeEventListener("mousedown", closeFilterMenuOnOutsideClick);
|
|
5516
5575
|
});
|
|
5517
5576
|
(0, vue.watch)([
|
|
5518
5577
|
activeView,
|
|
@@ -5549,9 +5608,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5549
5608
|
"aria-label": (0, vue.unref)(t)("collectionsView.backToIndex"),
|
|
5550
5609
|
"data-testid": "collections-back",
|
|
5551
5610
|
onClick: goBack
|
|
5552
|
-
}, [..._cache[
|
|
5611
|
+
}, [..._cache[28] || (_cache[28] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "arrow_back", -1)])], 8, _hoisted_3$5)) : (0, vue.createCommentVNode)("", true),
|
|
5553
5612
|
collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_4$5, [(0, vue.createElementVNode)("span", _hoisted_5$5, (0, vue.toDisplayString)(collection.value.icon), 1)])) : (0, vue.createCommentVNode)("", true),
|
|
5554
|
-
(0, vue.createElementVNode)("div", _hoisted_6$4, [(0, vue.createElementVNode)("h1", _hoisted_7$4, (0, vue.toDisplayString)(collection.value?.title ?? (0, vue.unref)(t)("collectionsView.title")), 1), collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_8$4, [(0, vue.createTextVNode)((0, vue.toDisplayString)(collection.value.slug) + " ", 1), isReadOnly.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [(0, vue.createElementVNode)("span", _hoisted_9$4, [_cache[
|
|
5613
|
+
(0, vue.createElementVNode)("div", _hoisted_6$4, [(0, vue.createElementVNode)("h1", _hoisted_7$4, (0, vue.toDisplayString)(collection.value?.title ?? (0, vue.unref)(t)("collectionsView.title")), 1), collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_8$4, [(0, vue.createTextVNode)((0, vue.toDisplayString)(collection.value.slug) + " ", 1), isReadOnly.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [(0, vue.createElementVNode)("span", _hoisted_9$4, [_cache[29] || (_cache[29] = (0, vue.createElementVNode)("span", { class: "material-icons text-[11px]" }, "lock", -1)), (0, vue.createTextVNode)(" " + (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.readonlyChip")), 1)]), dataSourceRoute.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
|
|
5555
5614
|
key: 0,
|
|
5556
5615
|
href: dataSourceRoute.value ?? void 0,
|
|
5557
5616
|
class: "ml-1 normal-case tracking-normal font-mono font-normal text-slate-500 hover:text-indigo-700 hover:underline",
|
|
@@ -5584,7 +5643,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5584
5643
|
class: "h-8 px-2.5 flex items-center gap-1 rounded border border-indigo-200 bg-white hover:bg-indigo-50 text-indigo-600 font-bold text-xs transition-colors",
|
|
5585
5644
|
"data-testid": "collections-chat",
|
|
5586
5645
|
onClick: openChat
|
|
5587
|
-
}, [_cache[
|
|
5646
|
+
}, [_cache[30] || (_cache[30] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "forum", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chat")), 1)])) : (0, vue.createCommentVNode)("", true),
|
|
5588
5647
|
((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(collectionActions.value, (action) => {
|
|
5589
5648
|
return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
5590
5649
|
key: action.id,
|
|
@@ -5601,7 +5660,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5601
5660
|
class: "h-8 px-2.5 flex items-center gap-1 rounded bg-indigo-600 hover:bg-indigo-700 text-white font-bold text-xs transition-colors shadow-sm",
|
|
5602
5661
|
"data-testid": "collections-add-item",
|
|
5603
5662
|
onClick: openCreate
|
|
5604
|
-
}, [_cache[
|
|
5663
|
+
}, [_cache[31] || (_cache[31] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "add", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("common.add")), 1)])) : (0, vue.createCommentVNode)("", true),
|
|
5605
5664
|
canDeleteCollection.value && !embedded.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
5606
5665
|
key: 6,
|
|
5607
5666
|
type: "button",
|
|
@@ -5610,7 +5669,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5610
5669
|
"aria-label": (0, vue.unref)(t)("collectionsView.deleteCollection"),
|
|
5611
5670
|
"data-testid": "collections-delete",
|
|
5612
5671
|
onClick: confirmCollectionDelete
|
|
5613
|
-
}, [..._cache[
|
|
5672
|
+
}, [..._cache[32] || (_cache[32] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "delete_forever", -1)])], 8, _hoisted_16$4)) : (0, vue.createCommentVNode)("", true),
|
|
5614
5673
|
canDeleteFeed.value && !embedded.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
5615
5674
|
key: 7,
|
|
5616
5675
|
type: "button",
|
|
@@ -5619,11 +5678,11 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5619
5678
|
"aria-label": (0, vue.unref)(t)("collectionsView.deleteFeed"),
|
|
5620
5679
|
"data-testid": "feeds-delete",
|
|
5621
5680
|
onClick: confirmFeedDelete
|
|
5622
|
-
}, [..._cache[
|
|
5681
|
+
}, [..._cache[33] || (_cache[33] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "delete_forever", -1)])], 8, _hoisted_17$4)) : (0, vue.createCommentVNode)("", true)
|
|
5623
5682
|
])) : (0, vue.createCommentVNode)("", true),
|
|
5624
|
-
refreshNote.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_18$4, [_cache[
|
|
5683
|
+
refreshNote.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_18$4, [_cache[34] || (_cache[34] = (0, vue.createElementVNode)("span", { class: "material-icons text-base text-indigo-600" }, "hourglass_top", -1)), (0, vue.createElementVNode)("span", _hoisted_19$3, (0, vue.toDisplayString)(refreshNote.value), 1)])) : (0, vue.createCommentVNode)("", true),
|
|
5625
5684
|
collection.value && (!__props.hideSearch && items.value.length > 0 || !__props.hideViewToggle && (hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value)) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_20$3, [!__props.hideSearch && items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_21$3, [
|
|
5626
|
-
_cache[
|
|
5685
|
+
_cache[36] || (_cache[36] = (0, vue.createElementVNode)("span", { class: "absolute inset-y-0 left-0 flex items-center pl-3 text-slate-400 pointer-events-none" }, [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "search")], -1)),
|
|
5627
5686
|
(0, vue.withDirectives)((0, vue.createElementVNode)("input", {
|
|
5628
5687
|
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => searchQuery.value = $event),
|
|
5629
5688
|
type: "text",
|
|
@@ -5637,25 +5696,48 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5637
5696
|
"aria-label": (0, vue.unref)(t)("collectionsView.clearSearch"),
|
|
5638
5697
|
class: "absolute inset-y-0 right-0 flex items-center pr-2.5 text-slate-400 hover:text-slate-600",
|
|
5639
5698
|
onClick: _cache[2] || (_cache[2] = ($event) => searchQuery.value = "")
|
|
5640
|
-
}, [..._cache[
|
|
5699
|
+
}, [..._cache[35] || (_cache[35] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_23$2)) : (0, vue.createCommentVNode)("", true)
|
|
5641
5700
|
])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_24$1, [
|
|
5642
5701
|
activeView.value === "table" && flagChips.value.length > 0 && items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
|
|
5643
5702
|
key: 0,
|
|
5644
|
-
|
|
5703
|
+
ref_key: "filterMenuRef",
|
|
5704
|
+
ref: filterMenuRef,
|
|
5705
|
+
class: "relative"
|
|
5706
|
+
}, [(0, vue.createElementVNode)("button", {
|
|
5707
|
+
type: "button",
|
|
5708
|
+
class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded-full text-xs font-medium transition-colors", activeFlagFilterCount.value > 0 ? "bg-indigo-50 text-indigo-700 border border-indigo-300" : "bg-transparent text-slate-500 border border-dashed border-slate-300 hover:bg-slate-50"]),
|
|
5709
|
+
"aria-label": (0, vue.unref)(t)("collectionsView.flagFilterButton"),
|
|
5710
|
+
"aria-expanded": filterMenuOpen.value,
|
|
5711
|
+
"data-testid": "collections-filter-menu",
|
|
5712
|
+
onClick: _cache[3] || (_cache[3] = ($event) => filterMenuOpen.value = !filterMenuOpen.value)
|
|
5713
|
+
}, [
|
|
5714
|
+
_cache[37] || (_cache[37] = (0, vue.createElementVNode)("span", {
|
|
5715
|
+
class: "material-icons text-sm",
|
|
5716
|
+
"aria-hidden": "true"
|
|
5717
|
+
}, "filter_alt", -1)),
|
|
5718
|
+
(0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.flagFilterButton")), 1),
|
|
5719
|
+
activeFlagFilterCount.value > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_26$1, (0, vue.toDisplayString)(activeFlagFilterCount.value), 1)) : (0, vue.createCommentVNode)("", true)
|
|
5720
|
+
], 10, _hoisted_25$1), filterMenuOpen.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
|
|
5721
|
+
key: 0,
|
|
5722
|
+
class: "absolute left-0 top-full mt-1 z-20 min-w-max rounded border border-slate-200 bg-white shadow-lg py-1",
|
|
5645
5723
|
role: "group",
|
|
5646
|
-
"aria-label": (0, vue.unref)(t)("collectionsView.
|
|
5724
|
+
"aria-label": (0, vue.unref)(t)("collectionsView.flagFilterButton"),
|
|
5725
|
+
"data-testid": "collections-filter-menu-panel"
|
|
5647
5726
|
}, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(flagChips.value, (chip) => {
|
|
5648
5727
|
return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
5649
5728
|
key: chip.key,
|
|
5650
5729
|
type: "button",
|
|
5651
|
-
class: (0, vue.normalizeClass)(["h-8 px-
|
|
5730
|
+
class: (0, vue.normalizeClass)(["w-full h-8 px-3 flex items-center gap-2 text-xs font-medium transition-colors hover:bg-slate-50", flagChipClass(chip.key)]),
|
|
5652
5731
|
title: flagChipTitle(chip),
|
|
5653
5732
|
"aria-label": flagChipTitle(chip),
|
|
5654
5733
|
"aria-pressed": flagFilterMode(chip.key) !== void 0,
|
|
5655
5734
|
"data-testid": `collections-flag-chip-${chip.key}`,
|
|
5656
5735
|
onClick: ($event) => cycleFlagFilter(chip.key)
|
|
5657
|
-
}, [(0, vue.createElementVNode)("span",
|
|
5658
|
-
|
|
5736
|
+
}, [(0, vue.createElementVNode)("span", {
|
|
5737
|
+
class: (0, vue.normalizeClass)(["material-icons text-sm", flagChipIconClass(chip.key)]),
|
|
5738
|
+
"aria-hidden": "true"
|
|
5739
|
+
}, (0, vue.toDisplayString)(flagChipIcon(chip.key)), 3), (0, vue.createElementVNode)("span", _hoisted_29, (0, vue.toDisplayString)(chip.label), 1)], 10, _hoisted_28);
|
|
5740
|
+
}), 128))], 8, _hoisted_27$1)) : (0, vue.createCommentVNode)("", true)], 512)) : (0, vue.createCommentVNode)("", true),
|
|
5659
5741
|
!__props.hideViewToggle && (hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
|
|
5660
5742
|
key: 1,
|
|
5661
5743
|
class: "flex gap-0.5",
|
|
@@ -5667,24 +5749,24 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5667
5749
|
class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === "table" ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
|
|
5668
5750
|
"aria-pressed": activeView.value === "table",
|
|
5669
5751
|
"data-testid": "collection-view-toggle-table",
|
|
5670
|
-
onClick: _cache[
|
|
5671
|
-
}, [_cache[
|
|
5752
|
+
onClick: _cache[4] || (_cache[4] = ($event) => setView("table"))
|
|
5753
|
+
}, [_cache[38] || (_cache[38] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "table_rows", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.viewTable")), 1)], 10, _hoisted_31),
|
|
5672
5754
|
hasCalendar.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
5673
5755
|
key: 0,
|
|
5674
5756
|
type: "button",
|
|
5675
5757
|
class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === "calendar" ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
|
|
5676
5758
|
"aria-pressed": activeView.value === "calendar",
|
|
5677
5759
|
"data-testid": "collection-view-toggle-calendar",
|
|
5678
|
-
onClick: _cache[
|
|
5679
|
-
}, [_cache[
|
|
5760
|
+
onClick: _cache[5] || (_cache[5] = ($event) => setView("calendar"))
|
|
5761
|
+
}, [_cache[39] || (_cache[39] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "calendar_month", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.viewCalendar")), 1)], 10, _hoisted_32)) : (0, vue.createCommentVNode)("", true),
|
|
5680
5762
|
hasKanban.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
5681
5763
|
key: 1,
|
|
5682
5764
|
type: "button",
|
|
5683
5765
|
class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === "kanban" ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
|
|
5684
5766
|
"aria-pressed": activeView.value === "kanban",
|
|
5685
5767
|
"data-testid": "collection-view-toggle-kanban",
|
|
5686
|
-
onClick: _cache[
|
|
5687
|
-
}, [_cache[
|
|
5768
|
+
onClick: _cache[6] || (_cache[6] = ($event) => setView("kanban"))
|
|
5769
|
+
}, [_cache[40] || (_cache[40] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "view_kanban", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.viewKanban")), 1)], 10, _hoisted_33)) : (0, vue.createCommentVNode)("", true),
|
|
5688
5770
|
((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(customViews.value, (cv) => {
|
|
5689
5771
|
return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
5690
5772
|
key: cv.id,
|
|
@@ -5693,7 +5775,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5693
5775
|
"aria-pressed": activeView.value === (0, vue.unref)(customViewKey)(cv.id),
|
|
5694
5776
|
"data-testid": `collection-view-custom-${cv.id}`,
|
|
5695
5777
|
onClick: ($event) => setCustomView(cv.id)
|
|
5696
|
-
}, [(0, vue.createElementVNode)("span",
|
|
5778
|
+
}, [(0, vue.createElementVNode)("span", _hoisted_35, (0, vue.toDisplayString)(cv.icon || (cv.target === "mobile" ? "smartphone" : "dashboard_customize")), 1), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(cv.label), 1)], 10, _hoisted_34);
|
|
5697
5779
|
}), 128)),
|
|
5698
5780
|
canAddCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
|
|
5699
5781
|
key: 2,
|
|
@@ -5708,17 +5790,17 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5708
5790
|
"aria-expanded": addMenuOpen.value,
|
|
5709
5791
|
"data-testid": "collection-view-add",
|
|
5710
5792
|
onClick: onAddViewClick
|
|
5711
|
-
}, [..._cache[
|
|
5793
|
+
}, [..._cache[41] || (_cache[41] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "add", -1)])], 8, _hoisted_36), addMenuOpen.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_37, [(0, vue.createElementVNode)("button", {
|
|
5712
5794
|
type: "button",
|
|
5713
5795
|
class: "w-full h-8 px-3 flex items-center gap-2 text-xs font-bold text-slate-600 hover:bg-slate-50",
|
|
5714
5796
|
"data-testid": "collection-view-add-desktop",
|
|
5715
|
-
onClick: _cache[
|
|
5716
|
-
}, [_cache[
|
|
5797
|
+
onClick: _cache[7] || (_cache[7] = ($event) => addCustomView("desktop"))
|
|
5798
|
+
}, [_cache[42] || (_cache[42] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "dashboard_customize", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.addViewDesktop")), 1)]), (0, vue.createElementVNode)("button", {
|
|
5717
5799
|
type: "button",
|
|
5718
5800
|
class: "w-full h-8 px-3 flex items-center gap-2 text-xs font-bold text-slate-600 hover:bg-slate-50",
|
|
5719
5801
|
"data-testid": "collection-view-add-mobile",
|
|
5720
|
-
onClick: _cache[
|
|
5721
|
-
}, [_cache[
|
|
5802
|
+
onClick: _cache[8] || (_cache[8] = ($event) => addCustomView("mobile"))
|
|
5803
|
+
}, [_cache[43] || (_cache[43] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "smartphone", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.addViewMobile")), 1)])])) : (0, vue.createCommentVNode)("", true)], 512)) : (0, vue.createCommentVNode)("", true),
|
|
5722
5804
|
canConfigureViews.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
5723
5805
|
key: 3,
|
|
5724
5806
|
type: "button",
|
|
@@ -5726,51 +5808,51 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5726
5808
|
title: (0, vue.unref)(t)("collectionsView.config.open"),
|
|
5727
5809
|
"aria-label": (0, vue.unref)(t)("collectionsView.config.open"),
|
|
5728
5810
|
"data-testid": "collection-config-open",
|
|
5729
|
-
onClick: _cache[
|
|
5730
|
-
}, [..._cache[
|
|
5731
|
-
], 8,
|
|
5811
|
+
onClick: _cache[9] || (_cache[9] = ($event) => configOpen.value = true)
|
|
5812
|
+
}, [..._cache[44] || (_cache[44] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "settings", -1)])], 8, _hoisted_38)) : (0, vue.createCommentVNode)("", true)
|
|
5813
|
+
], 8, _hoisted_30)) : (0, vue.createCommentVNode)("", true),
|
|
5732
5814
|
calendarActive.value && dateFields.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
|
|
5733
5815
|
key: 2,
|
|
5734
5816
|
value: calendarAnchorField.value,
|
|
5735
5817
|
class: "h-8 px-2 rounded border border-slate-200 bg-white text-xs font-semibold text-slate-600 focus:outline-none focus:border-indigo-500 cursor-pointer",
|
|
5736
5818
|
"aria-label": (0, vue.unref)(t)("collectionsView.calendarFieldLabel"),
|
|
5737
5819
|
"data-testid": "collection-calendar-field",
|
|
5738
|
-
onChange: _cache[
|
|
5820
|
+
onChange: _cache[10] || (_cache[10] = ($event) => anchorOverride.value = $event.target.value)
|
|
5739
5821
|
}, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(dateFields.value, (key) => {
|
|
5740
5822
|
return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
|
|
5741
5823
|
key,
|
|
5742
5824
|
value: key
|
|
5743
|
-
}, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9,
|
|
5744
|
-
}), 128))], 40,
|
|
5825
|
+
}, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_40);
|
|
5826
|
+
}), 128))], 40, _hoisted_39)) : (0, vue.createCommentVNode)("", true),
|
|
5745
5827
|
kanbanActive.value && enumFields.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
|
|
5746
5828
|
key: 3,
|
|
5747
5829
|
value: kanbanGroupField.value,
|
|
5748
5830
|
class: "h-8 px-2 rounded border border-slate-200 bg-white text-xs font-semibold text-slate-600 focus:outline-none focus:border-indigo-500 cursor-pointer",
|
|
5749
5831
|
"aria-label": (0, vue.unref)(t)("collectionsView.kanbanFieldLabel"),
|
|
5750
5832
|
"data-testid": "collection-kanban-field",
|
|
5751
|
-
onChange: _cache[
|
|
5833
|
+
onChange: _cache[11] || (_cache[11] = ($event) => kanbanOverride.value = $event.target.value)
|
|
5752
5834
|
}, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(enumFields.value, (key) => {
|
|
5753
5835
|
return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
|
|
5754
5836
|
key,
|
|
5755
5837
|
value: key
|
|
5756
|
-
}, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9,
|
|
5757
|
-
}), 128))], 40,
|
|
5758
|
-
items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div",
|
|
5838
|
+
}, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_42);
|
|
5839
|
+
}), 128))], 40, _hoisted_41)) : (0, vue.createCommentVNode)("", true),
|
|
5840
|
+
items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_43, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.searchSummary", {
|
|
5759
5841
|
shown: activeView.value === "table" ? tableFilteredItems.value.length : filteredItems.value.length,
|
|
5760
5842
|
total: items.value.length
|
|
5761
5843
|
})), 1)) : (0, vue.createCommentVNode)("", true)
|
|
5762
5844
|
])])) : (0, vue.createCommentVNode)("", true),
|
|
5763
|
-
collection.value && dataIssues.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div",
|
|
5764
|
-
_cache[
|
|
5765
|
-
(0, vue.createElementVNode)("span",
|
|
5845
|
+
collection.value && dataIssues.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_44, [
|
|
5846
|
+
_cache[46] || (_cache[46] = (0, vue.createElementVNode)("span", { class: "material-icons text-amber-600" }, "warning", -1)),
|
|
5847
|
+
(0, vue.createElementVNode)("span", _hoisted_45, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.dataIssuesDetected", { count: dataIssues.value.length })), 1),
|
|
5766
5848
|
(0, vue.createElementVNode)("button", {
|
|
5767
5849
|
type: "button",
|
|
5768
5850
|
class: "h-8 px-2.5 flex items-center gap-1 rounded border border-amber-300 bg-white hover:bg-amber-100 text-amber-700 font-bold text-xs transition-colors",
|
|
5769
5851
|
"data-testid": "collections-repair",
|
|
5770
5852
|
onClick: repairCollection
|
|
5771
|
-
}, [_cache[
|
|
5853
|
+
}, [_cache[45] || (_cache[45] = (0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "build", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.repair")), 1)])
|
|
5772
5854
|
])) : (0, vue.createCommentVNode)("", true),
|
|
5773
|
-
(0, vue.createElementVNode)("div",
|
|
5855
|
+
(0, vue.createElementVNode)("div", _hoisted_46, [loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_47, [_cache[47] || (_cache[47] = (0, vue.createElementVNode)("div", { class: "h-8 w-8 border-2 border-indigo-600/20 border-t-indigo-600 rounded-full animate-spin" }, null, -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)((0, vue.unref)(t)("common.loading")), 1)])) : loadError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_48, [_cache[48] || (_cache[48] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(loadError.value === "not-found" ? (0, vue.unref)(t)("collectionsView.notFound") : `${(0, vue.unref)(t)("collectionsView.loadFailed")}: ${loadError.value}`), 1)])) : !collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_49)) : calendarActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_50, [(0, vue.createVNode)(CollectionCalendarView_default, {
|
|
5774
5856
|
schema: collection.value.schema,
|
|
5775
5857
|
items: filteredItems.value,
|
|
5776
5858
|
"anchor-field": calendarAnchorField.value,
|
|
@@ -5806,7 +5888,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5806
5888
|
}, {
|
|
5807
5889
|
detail: (0, vue.withCtx)(() => [(0, vue.createVNode)(CollectionRecordPanel_default, {
|
|
5808
5890
|
editing: editing.value,
|
|
5809
|
-
"onUpdate:editing": _cache[
|
|
5891
|
+
"onUpdate:editing": _cache[12] || (_cache[12] = ($event) => editing.value = $event),
|
|
5810
5892
|
collection: collection.value,
|
|
5811
5893
|
viewing: viewing.value,
|
|
5812
5894
|
saving: saving.value,
|
|
@@ -5826,7 +5908,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5826
5908
|
onCancel: cancelEditor,
|
|
5827
5909
|
onEdit: editFromView,
|
|
5828
5910
|
onClose: onDayClose,
|
|
5829
|
-
onDelete: _cache[
|
|
5911
|
+
onDelete: _cache[13] || (_cache[13] = ($event) => viewing.value && confirmDelete(viewing.value)),
|
|
5830
5912
|
onRunAction: runAction,
|
|
5831
5913
|
onItemChat
|
|
5832
5914
|
}, null, 8, [
|
|
@@ -5859,16 +5941,16 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5859
5941
|
"selected",
|
|
5860
5942
|
"can-create",
|
|
5861
5943
|
"show-detail"
|
|
5862
|
-
])) : (0, vue.createCommentVNode)("", true)])) : kanbanActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div",
|
|
5863
|
-
_cache[
|
|
5864
|
-
(0, vue.createElementVNode)("span",
|
|
5944
|
+
])) : (0, vue.createCommentVNode)("", true)])) : kanbanActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_51, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_52, [
|
|
5945
|
+
_cache[50] || (_cache[50] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
|
|
5946
|
+
(0, vue.createElementVNode)("span", _hoisted_53, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
|
|
5865
5947
|
(0, vue.createElementVNode)("button", {
|
|
5866
5948
|
type: "button",
|
|
5867
5949
|
class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
|
|
5868
5950
|
"aria-label": (0, vue.unref)(t)("common.close"),
|
|
5869
|
-
onClick: _cache[
|
|
5870
|
-
}, [..._cache[
|
|
5871
|
-
])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div",
|
|
5951
|
+
onClick: _cache[14] || (_cache[14] = ($event) => inlineError.value = null)
|
|
5952
|
+
}, [..._cache[49] || (_cache[49] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_54)
|
|
5953
|
+
])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_55, [(0, vue.createVNode)(CollectionKanbanView_default, {
|
|
5872
5954
|
schema: collection.value.schema,
|
|
5873
5955
|
items: filteredItems.value,
|
|
5874
5956
|
"group-field": kanbanGroupField.value,
|
|
@@ -5884,7 +5966,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5884
5966
|
"selected",
|
|
5885
5967
|
"notified",
|
|
5886
5968
|
"readonly"
|
|
5887
|
-
])])])) : activeCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div",
|
|
5969
|
+
])])])) : activeCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_56, [activeCustomView.value.target === "mobile" ? ((0, vue.openBlock)(), (0, vue.createBlock)(CollectionRemoteViewPreview_default, {
|
|
5888
5970
|
key: 0,
|
|
5889
5971
|
slug: collection.value.slug,
|
|
5890
5972
|
view: activeCustomView.value,
|
|
@@ -5895,32 +5977,32 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5895
5977
|
view: activeCustomView.value,
|
|
5896
5978
|
onOpenItem: onCustomViewOpenItem,
|
|
5897
5979
|
onStartChat: onCustomViewStartChat
|
|
5898
|
-
}, null, 8, ["slug", "view"]))])) : items.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div",
|
|
5899
|
-
_cache[
|
|
5900
|
-
(0, vue.createElementVNode)("p",
|
|
5980
|
+
}, null, 8, ["slug", "view"]))])) : items.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_57, [_cache[51] || (_cache[51] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "folder_open", -1)), (0, vue.createElementVNode)("p", _hoisted_58, (0, vue.toDisplayString)((0, vue.unref)(t)(isReadOnly.value ? "collectionsView.itemsEmptyReadonly" : "collectionsView.itemsEmpty")), 1)])) : tableFilteredItems.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_59, [
|
|
5981
|
+
_cache[52] || (_cache[52] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "search_off", -1)),
|
|
5982
|
+
(0, vue.createElementVNode)("p", _hoisted_60, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.noMatchingItems")), 1),
|
|
5901
5983
|
(0, vue.createElementVNode)("button", {
|
|
5902
5984
|
type: "button",
|
|
5903
5985
|
class: "text-xs text-indigo-600 font-semibold hover:underline",
|
|
5904
|
-
onClick: _cache[
|
|
5986
|
+
onClick: _cache[15] || (_cache[15] = ($event) => (searchQuery.value = "", flagFilters.value = {}))
|
|
5905
5987
|
}, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.clearSearch")), 1)
|
|
5906
|
-
])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div",
|
|
5907
|
-
_cache[
|
|
5908
|
-
(0, vue.createElementVNode)("span",
|
|
5988
|
+
])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_61, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_62, [
|
|
5989
|
+
_cache[54] || (_cache[54] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
|
|
5990
|
+
(0, vue.createElementVNode)("span", _hoisted_63, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
|
|
5909
5991
|
(0, vue.createElementVNode)("button", {
|
|
5910
5992
|
type: "button",
|
|
5911
5993
|
class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
|
|
5912
5994
|
"aria-label": (0, vue.unref)(t)("common.close"),
|
|
5913
|
-
onClick: _cache[
|
|
5914
|
-
}, [..._cache[
|
|
5915
|
-
])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("table",
|
|
5995
|
+
onClick: _cache[16] || (_cache[16] = ($event) => inlineError.value = null)
|
|
5996
|
+
}, [..._cache[53] || (_cache[53] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_64)
|
|
5997
|
+
])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("table", _hoisted_65, [(0, vue.createElementVNode)("thead", null, [(0, vue.createElementVNode)("tr", _hoisted_66, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(listColumnFields.value, ([key, field]) => {
|
|
5916
5998
|
return (0, vue.openBlock)(), (0, vue.createElementBlock)("th", {
|
|
5917
5999
|
key,
|
|
5918
6000
|
"aria-sort": (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? sortAriaValue(key) : void 0,
|
|
5919
6001
|
class: "px-5 py-3 font-bold text-slate-500 text-left uppercase tracking-wider whitespace-nowrap"
|
|
5920
|
-
}, [(0, vue.createElementVNode)("div",
|
|
6002
|
+
}, [(0, vue.createElementVNode)("div", _hoisted_68, [(0, vue.createElementVNode)("span", {
|
|
5921
6003
|
class: "truncate max-w-[14rem]",
|
|
5922
6004
|
title: field.label
|
|
5923
|
-
}, (0, vue.toDisplayString)(field.label), 9,
|
|
6005
|
+
}, (0, vue.toDisplayString)(field.label), 9, _hoisted_69), (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
|
|
5924
6006
|
key: 0,
|
|
5925
6007
|
type: "button",
|
|
5926
6008
|
class: (0, vue.normalizeClass)(["inline-flex items-center justify-center rounded p-0.5 -my-1 leading-none transition-colors", sortButtonClass(key)]),
|
|
@@ -5928,9 +6010,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5928
6010
|
"aria-label": (0, vue.unref)(t)("collectionsView.sortBy", { field: field.label }),
|
|
5929
6011
|
onClick: (0, vue.withModifiers)(($event) => cycleSort(key), ["stop"]),
|
|
5930
6012
|
onPointerenter: ($event) => hoveredSortKey.value = key,
|
|
5931
|
-
onPointerleave: _cache[
|
|
5932
|
-
}, [(0, vue.createElementVNode)("span",
|
|
5933
|
-
}), 128))])]), (0, vue.createElementVNode)("tbody",
|
|
6013
|
+
onPointerleave: _cache[17] || (_cache[17] = ($event) => hoveredSortKey.value = null)
|
|
6014
|
+
}, [(0, vue.createElementVNode)("span", _hoisted_71, (0, vue.toDisplayString)(sortIconName(key)), 1)], 42, _hoisted_70)) : (0, vue.createCommentVNode)("", true)])], 8, _hoisted_67);
|
|
6015
|
+
}), 128))])]), (0, vue.createElementVNode)("tbody", _hoisted_72, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(sortedItems.value, (item) => {
|
|
5934
6016
|
return (0, vue.openBlock)(), (0, vue.createElementBlock)("tr", {
|
|
5935
6017
|
key: String(item[collection.value.schema.primaryKey] ?? ""),
|
|
5936
6018
|
class: (0, vue.normalizeClass)(["hover:bg-slate-50/70 cursor-pointer transition-colors focus:outline-none focus:bg-indigo-50/30", isRowOpen(item) || isEditingRow(item) ? "bg-indigo-50/40" : ""]),
|
|
@@ -5952,9 +6034,9 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5952
6034
|
class: "h-5 w-5 rounded border-slate-300 text-indigo-600 focus:ring-indigo-500/20 cursor-pointer align-middle disabled:opacity-50 disabled:cursor-not-allowed",
|
|
5953
6035
|
"data-testid": `collections-inline-toggle-${key}-${item[collection.value.schema.primaryKey]}`,
|
|
5954
6036
|
"aria-label": field.label,
|
|
5955
|
-
onClick: _cache[
|
|
6037
|
+
onClick: _cache[18] || (_cache[18] = (0, vue.withModifiers)(() => {}, ["stop"])),
|
|
5956
6038
|
onChange: ($event) => commitToggle(item, field)
|
|
5957
|
-
}, null, 40,
|
|
6039
|
+
}, null, 40, _hoisted_74)) : field.type === "boolean" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("input", {
|
|
5958
6040
|
key: 1,
|
|
5959
6041
|
type: "checkbox",
|
|
5960
6042
|
checked: item[key] === true,
|
|
@@ -5962,15 +6044,15 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5962
6044
|
class: "h-5 w-5 rounded border-slate-300 text-indigo-600 focus:ring-indigo-500/20 cursor-pointer align-middle disabled:opacity-50 disabled:cursor-not-allowed",
|
|
5963
6045
|
"data-testid": `collections-inline-bool-${key}-${item[collection.value.schema.primaryKey]}`,
|
|
5964
6046
|
"aria-label": field.label,
|
|
5965
|
-
onClick: _cache[
|
|
6047
|
+
onClick: _cache[19] || (_cache[19] = (0, vue.withModifiers)(() => {}, ["stop"])),
|
|
5966
6048
|
onChange: ($event) => commitInlineEdit(item, String(key), field, $event.target.checked)
|
|
5967
|
-
}, null, 40,
|
|
6049
|
+
}, null, 40, _hoisted_75)) : field.type === "flag" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", {
|
|
5968
6050
|
key: 2,
|
|
5969
6051
|
class: (0, vue.normalizeClass)(["material-icons text-lg align-middle", flagValueOf(String(key), item) ? "text-emerald-600" : "text-slate-300"]),
|
|
5970
6052
|
"data-testid": `collections-flag-${key}-${item[collection.value.schema.primaryKey]}`,
|
|
5971
6053
|
"aria-label": `${field.label}: ${(0, vue.unref)(t)(flagValueOf(String(key), item) ? "common.yes" : "common.no")}`,
|
|
5972
6054
|
role: "img"
|
|
5973
|
-
}, (0, vue.toDisplayString)(flagValueOf(String(key), item) ? "check_circle" : "radio_button_unchecked"), 11,
|
|
6055
|
+
}, (0, vue.toDisplayString)(flagValueOf(String(key), item) ? "check_circle" : "radio_button_unchecked"), 11, _hoisted_76)) : field.type === "ref" && field.to && typeof item[key] === "string" && item[key] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_77, [(0, vue.createElementVNode)("a", {
|
|
5974
6056
|
href: (0, vue.unref)(cui).recordHref?.(field.to, String(item[key])),
|
|
5975
6057
|
tabindex: (0, vue.unref)(cui).recordHref?.(field.to, String(item[key])) ? void 0 : 0,
|
|
5976
6058
|
role: "link",
|
|
@@ -5978,48 +6060,48 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
5978
6060
|
"data-testid": `collections-ref-link-${key}-${item[key]}`,
|
|
5979
6061
|
onClick: ($event) => (0, vue.unref)(activateRefLink)($event, field.to, String(item[key]), true),
|
|
5980
6062
|
onKeydown: [(0, vue.withKeys)(($event) => (0, vue.unref)(activateRefLink)($event, field.to, String(item[key]), true), ["enter"]), (0, vue.withKeys)(($event) => (0, vue.unref)(activateRefLink)($event, field.to, String(item[key]), true), ["space"])]
|
|
5981
|
-
}, (0, vue.toDisplayString)((0, vue.unref)(refDisplay)(field.to, String(item[key]))), 41,
|
|
6063
|
+
}, (0, vue.toDisplayString)((0, vue.unref)(refDisplay)(field.to, String(item[key]))), 41, _hoisted_78)])) : field.type === "enum" && Array.isArray(field.values) && field.values.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
|
|
5982
6064
|
key: 4,
|
|
5983
6065
|
value: item[key] == null ? "" : String(item[key]),
|
|
5984
6066
|
disabled: isReadOnly.value || isRowInlineSaving(item),
|
|
5985
6067
|
class: (0, vue.normalizeClass)(["rounded-lg border px-2 py-0.5 text-[11px] font-semibold focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20 focus:outline-none cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed", enumControlClass(String(key), item[key])]),
|
|
5986
6068
|
"data-testid": `collections-inline-enum-${key}-${item[collection.value.schema.primaryKey]}`,
|
|
5987
6069
|
"aria-label": field.label,
|
|
5988
|
-
onClick: _cache[
|
|
6070
|
+
onClick: _cache[20] || (_cache[20] = (0, vue.withModifiers)(() => {}, ["stop"])),
|
|
5989
6071
|
onChange: ($event) => commitInlineEdit(item, String(key), field, $event.target.value)
|
|
5990
|
-
}, [showEnumPlaceholder(item, String(key)) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("option",
|
|
6072
|
+
}, [showEnumPlaceholder(item, String(key)) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("option", _hoisted_80, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.selectPlaceholder")), 1)) : (0, vue.createCommentVNode)("", true), ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(field.values, (value) => {
|
|
5991
6073
|
return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
|
|
5992
6074
|
key: value,
|
|
5993
6075
|
value
|
|
5994
|
-
}, (0, vue.toDisplayString)(value), 9,
|
|
5995
|
-
}), 128))], 42,
|
|
6076
|
+
}, (0, vue.toDisplayString)(value), 9, _hoisted_81);
|
|
6077
|
+
}), 128))], 42, _hoisted_79)) : field.type === "money" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_82, (0, vue.toDisplayString)((0, vue.unref)(formatMoney)(item[key], (0, vue.unref)(resolveCurrency)(field, item), (0, vue.unref)(locale))), 1)) : field.type === "table" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_83, [_cache[55] || (_cache[55] = (0, vue.createElementVNode)("span", { class: "material-icons text-[11px]" }, "list", -1)), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(tableSummary(item[key])), 1)])) : field.type === "derived" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_84, (0, vue.toDisplayString)((0, vue.unref)(derivedDisplay)(field, (0, vue.unref)(evaluateDerivedAgainstItem)(field, String(key), item), item)), 1)) : field.type === "rollup" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", {
|
|
5996
6078
|
key: 8,
|
|
5997
6079
|
class: "inline-block truncate tabular-nums font-bold text-indigo-900 bg-indigo-50/50 px-1.5 py-0.5 rounded border border-indigo-100/50",
|
|
5998
6080
|
"data-testid": `collections-rollup-${key}-${item[collection.value.schema.primaryKey]}`
|
|
5999
|
-
}, (0, vue.toDisplayString)((0, vue.unref)(render).rollupDisplay(field, item)), 9,
|
|
6081
|
+
}, (0, vue.toDisplayString)((0, vue.unref)(render).rollupDisplay(field, item)), 9, _hoisted_85)) : field.type !== "file" && (0, vue.unref)(isExternalUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
|
|
6000
6082
|
key: 9,
|
|
6001
6083
|
href: String(item[key]),
|
|
6002
6084
|
target: "_blank",
|
|
6003
6085
|
rel: "noopener noreferrer",
|
|
6004
6086
|
class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
|
|
6005
6087
|
"data-testid": `collections-url-link-${key}-${item[collection.value.schema.primaryKey]}`,
|
|
6006
|
-
onClick: _cache[
|
|
6007
|
-
}, (0, vue.toDisplayString)(String(item[key])), 9,
|
|
6088
|
+
onClick: _cache[21] || (_cache[21] = (0, vue.withModifiers)(() => {}, ["stop"]))
|
|
6089
|
+
}, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_86)) : field.type === "file" && (0, vue.unref)(artifactUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
|
|
6008
6090
|
key: 10,
|
|
6009
6091
|
href: (0, vue.unref)(artifactUrl)(item[key]) ?? void 0,
|
|
6010
6092
|
target: "_blank",
|
|
6011
6093
|
rel: "noopener noreferrer",
|
|
6012
6094
|
class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
|
|
6013
6095
|
"data-testid": `collections-file-link-${key}-${item[collection.value.schema.primaryKey]}`,
|
|
6014
|
-
onClick: _cache[
|
|
6015
|
-
}, (0, vue.toDisplayString)(String(item[key])), 9,
|
|
6096
|
+
onClick: _cache[22] || (_cache[22] = (0, vue.withModifiers)(() => {}, ["stop"]))
|
|
6097
|
+
}, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_87)) : field.type === "file" && (0, vue.unref)(fileRoutePath)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
|
|
6016
6098
|
key: 11,
|
|
6017
6099
|
href: (0, vue.unref)(fileRoutePath)(item[key]) ?? void 0,
|
|
6018
6100
|
class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
|
|
6019
6101
|
"data-testid": `collections-file-link-${key}-${item[collection.value.schema.primaryKey]}`,
|
|
6020
6102
|
onClick: ($event) => (0, vue.unref)(activatePathLink)($event, (0, vue.unref)(fileRoutePath)(item[key]) ?? "", true)
|
|
6021
|
-
}, (0, vue.toDisplayString)(String(item[key])), 9,
|
|
6022
|
-
}), 128))], 42,
|
|
6103
|
+
}, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_88)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_89, (0, vue.toDisplayString)((0, vue.unref)(formatCell)(item[key], field.type)), 1))], 64)) : (0, vue.createCommentVNode)("", true)]);
|
|
6104
|
+
}), 128))], 42, _hoisted_73);
|
|
6023
6105
|
}), 128))])])]))]),
|
|
6024
6106
|
collection.value && (viewing.value || editing.value) && !(calendarActive.value && openDay.value) ? ((0, vue.openBlock)(), (0, vue.createBlock)(CollectionRecordModal_default, {
|
|
6025
6107
|
key: 4,
|
|
@@ -6027,7 +6109,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
6027
6109
|
}, {
|
|
6028
6110
|
default: (0, vue.withCtx)(() => [(0, vue.createVNode)(CollectionRecordPanel_default, {
|
|
6029
6111
|
editing: editing.value,
|
|
6030
|
-
"onUpdate:editing": _cache[
|
|
6112
|
+
"onUpdate:editing": _cache[23] || (_cache[23] = ($event) => editing.value = $event),
|
|
6031
6113
|
collection: collection.value,
|
|
6032
6114
|
viewing: viewing.value,
|
|
6033
6115
|
saving: saving.value,
|
|
@@ -6047,7 +6129,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
6047
6129
|
onCancel: cancelEditor,
|
|
6048
6130
|
onEdit: editFromView,
|
|
6049
6131
|
onClose: closeView,
|
|
6050
|
-
onDelete: _cache[
|
|
6132
|
+
onDelete: _cache[24] || (_cache[24] = ($event) => viewing.value && confirmDelete(viewing.value)),
|
|
6051
6133
|
onRunAction: runAction,
|
|
6052
6134
|
onItemChat
|
|
6053
6135
|
}, null, 8, [
|
|
@@ -6075,7 +6157,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
6075
6157
|
action: mutateModal.value.action,
|
|
6076
6158
|
pending: mutatePending.value,
|
|
6077
6159
|
error: mutateError.value,
|
|
6078
|
-
onClose: _cache[
|
|
6160
|
+
onClose: _cache[25] || (_cache[25] = ($event) => mutateModal.value = null),
|
|
6079
6161
|
onSubmit: submitMutateParams
|
|
6080
6162
|
}, null, 8, [
|
|
6081
6163
|
"action",
|
|
@@ -6088,7 +6170,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
6088
6170
|
title: collection.value.title,
|
|
6089
6171
|
views: customViews.value,
|
|
6090
6172
|
onChanged: onViewsChanged,
|
|
6091
|
-
onClose: _cache[
|
|
6173
|
+
onClose: _cache[26] || (_cache[26] = ($event) => configOpen.value = false)
|
|
6092
6174
|
}, null, 8, [
|
|
6093
6175
|
"slug",
|
|
6094
6176
|
"title",
|
|
@@ -6103,29 +6185,29 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
6103
6185
|
"data-testid": "collections-chat-modal",
|
|
6104
6186
|
onClick: (0, vue.withModifiers)(closeChat, ["self"]),
|
|
6105
6187
|
onKeydown: (0, vue.withKeys)(closeChat, ["esc"])
|
|
6106
|
-
}, [(0, vue.createElementVNode)("div",
|
|
6107
|
-
(0, vue.createElementVNode)("header",
|
|
6108
|
-
_cache[
|
|
6109
|
-
(0, vue.createElementVNode)("div",
|
|
6188
|
+
}, [(0, vue.createElementVNode)("div", _hoisted_90, [
|
|
6189
|
+
(0, vue.createElementVNode)("header", _hoisted_91, [
|
|
6190
|
+
_cache[57] || (_cache[57] = (0, vue.createElementVNode)("div", { class: "h-9 w-9 flex items-center justify-center rounded-xl bg-indigo-50 text-indigo-600 border border-indigo-100/50" }, [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "forum")], -1)),
|
|
6191
|
+
(0, vue.createElementVNode)("div", _hoisted_92, [(0, vue.createElementVNode)("h2", _hoisted_93, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatTitle")), 1), (0, vue.createElementVNode)("span", _hoisted_94, (0, vue.toDisplayString)(collection.value.title), 1)]),
|
|
6110
6192
|
(0, vue.createElementVNode)("button", {
|
|
6111
6193
|
type: "button",
|
|
6112
6194
|
class: "h-8 w-8 flex items-center justify-center rounded text-slate-400 hover:bg-slate-200/50 hover:text-slate-600 transition-colors",
|
|
6113
6195
|
"aria-label": (0, vue.unref)(t)("common.close"),
|
|
6114
6196
|
"data-testid": "collections-chat-close",
|
|
6115
6197
|
onClick: closeChat
|
|
6116
|
-
}, [..._cache[
|
|
6198
|
+
}, [..._cache[56] || (_cache[56] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_95)
|
|
6117
6199
|
]),
|
|
6118
|
-
(0, vue.createElementVNode)("div",
|
|
6200
|
+
(0, vue.createElementVNode)("div", _hoisted_96, [(0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
|
|
6119
6201
|
ref_key: "chatInputEl",
|
|
6120
6202
|
ref: chatInputEl,
|
|
6121
|
-
"onUpdate:modelValue": _cache[
|
|
6203
|
+
"onUpdate:modelValue": _cache[27] || (_cache[27] = ($event) => chatMessage.value = $event),
|
|
6122
6204
|
rows: "4",
|
|
6123
6205
|
placeholder: (0, vue.unref)(t)("collectionsView.chatPlaceholder"),
|
|
6124
6206
|
class: "w-full bg-slate-50 border border-slate-200/80 rounded-xl px-3 py-2.5 text-sm placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 focus:bg-white transition-all resize-none",
|
|
6125
6207
|
"data-testid": "collections-chat-input",
|
|
6126
6208
|
onKeydown: [(0, vue.withKeys)((0, vue.withModifiers)(submitChat, ["meta"]), ["enter"]), (0, vue.withKeys)((0, vue.withModifiers)(submitChat, ["ctrl"]), ["enter"])]
|
|
6127
|
-
}, null, 40,
|
|
6128
|
-
(0, vue.createElementVNode)("footer",
|
|
6209
|
+
}, null, 40, _hoisted_97), [[vue.vModelText, chatMessage.value]])]),
|
|
6210
|
+
(0, vue.createElementVNode)("footer", _hoisted_98, [(0, vue.createElementVNode)("button", {
|
|
6129
6211
|
type: "button",
|
|
6130
6212
|
class: "h-8 px-2.5 rounded text-xs font-bold text-slate-500 hover:bg-slate-200/50 transition-colors",
|
|
6131
6213
|
"data-testid": "collections-chat-cancel",
|
|
@@ -6136,7 +6218,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
|
6136
6218
|
disabled: !chatMessage.value.trim(),
|
|
6137
6219
|
"data-testid": "collections-chat-send",
|
|
6138
6220
|
onClick: submitChat
|
|
6139
|
-
}, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatStart")), 9,
|
|
6221
|
+
}, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatStart")), 9, _hoisted_99)])
|
|
6140
6222
|
])], 32)) : (0, vue.createCommentVNode)("", true)
|
|
6141
6223
|
]);
|
|
6142
6224
|
};
|