@mulmoclaude/collection-plugin 0.5.9 → 0.5.11

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/vue.cjs CHANGED
@@ -84,6 +84,7 @@ var i18n = (0, vue_i18n.createI18n)({
84
84
  chat: "Chat",
85
85
  refreshFeed: "Refresh",
86
86
  refreshFailed: "Refresh failed: {error}",
87
+ refreshDispatched: "Refresh started in the background.",
87
88
  feedChatSeed: "The \"{slug}\" feed is defined by the schema at `feeds/{slug}/schema.json` and its records live in `{dataPath}/` (one `<id>.json` per record). Using that schema and data, respond to this request: {message}",
88
89
  feedsTitle: "Data-source feeds",
89
90
  feedsEmpty: "No feeds registered yet.",
@@ -187,6 +188,7 @@ var i18n = (0, vue_i18n.createI18n)({
187
188
  chat: "チャット",
188
189
  refreshFeed: "更新",
189
190
  refreshFailed: "更新に失敗しました: {error}",
191
+ refreshDispatched: "バックグラウンドで更新を開始しました。",
190
192
  feedChatSeed: "フィード「{slug}」はスキーマ `feeds/{slug}/schema.json` で定義され、レコードは `{dataPath}/`(1 レコードにつき `<id>.json` 1 ファイル)に保存されています。このスキーマとデータを使って、次のリクエストに応えてください: {message}",
191
193
  feedsTitle: "データソースフィード",
192
194
  feedsEmpty: "登録されたフィードはありません。",
@@ -290,6 +292,7 @@ var i18n = (0, vue_i18n.createI18n)({
290
292
  chat: "对话",
291
293
  refreshFeed: "刷新",
292
294
  refreshFailed: "刷新失败:{error}",
295
+ refreshDispatched: "已在后台开始刷新。",
293
296
  feedChatSeed: "订阅源“{slug}”由 schema `feeds/{slug}/schema.json` 定义,其记录保存在 `{dataPath}/`(每条记录一个 `<id>.json` 文件)。请使用该 schema 和数据来响应以下请求:{message}",
294
297
  feedsTitle: "数据源订阅",
295
298
  feedsEmpty: "尚未注册任何订阅源。",
@@ -393,6 +396,7 @@ var i18n = (0, vue_i18n.createI18n)({
393
396
  chat: "채팅",
394
397
  refreshFeed: "새로고침",
395
398
  refreshFailed: "새로고침 실패: {error}",
399
+ refreshDispatched: "백그라운드에서 새로고침을 시작했습니다.",
396
400
  feedChatSeed: "“{slug}” 피드는 스키마 `feeds/{slug}/schema.json`로 정의되며, 레코드는 `{dataPath}/`(레코드당 `<id>.json` 파일 하나)에 저장됩니다. 이 스키마와 데이터를 사용하여 다음 요청에 응답하세요: {message}",
397
401
  feedsTitle: "데이터 소스 피드",
398
402
  feedsEmpty: "등록된 피드가 없습니다.",
@@ -496,6 +500,7 @@ var i18n = (0, vue_i18n.createI18n)({
496
500
  chat: "Chat",
497
501
  refreshFeed: "Actualizar",
498
502
  refreshFailed: "Error al actualizar: {error}",
503
+ refreshDispatched: "Actualización iniciada en segundo plano.",
499
504
  feedChatSeed: "El feed «{slug}» está definido por el esquema `feeds/{slug}/schema.json` y sus registros se guardan en `{dataPath}/` (un archivo `<id>.json` por registro). Usa ese esquema y esos datos para responder a esta solicitud: {message}",
500
505
  feedsTitle: "Fuentes de datos",
501
506
  feedsEmpty: "Aún no hay fuentes registradas.",
@@ -599,6 +604,7 @@ var i18n = (0, vue_i18n.createI18n)({
599
604
  chat: "Chat",
600
605
  refreshFeed: "Atualizar",
601
606
  refreshFailed: "Falha ao atualizar: {error}",
607
+ refreshDispatched: "Atualização iniciada em segundo plano.",
602
608
  feedChatSeed: "O feed \"{slug}\" é definido pelo esquema `feeds/{slug}/schema.json` e seus registros ficam em `{dataPath}/` (um arquivo `<id>.json` por registro). Use esse esquema e esses dados para responder a esta solicitação: {message}",
603
609
  feedsTitle: "Feeds de dados",
604
610
  feedsEmpty: "Nenhum feed registrado ainda.",
@@ -702,6 +708,7 @@ var i18n = (0, vue_i18n.createI18n)({
702
708
  chat: "Discussion",
703
709
  refreshFeed: "Actualiser",
704
710
  refreshFailed: "Échec de l'actualisation : {error}",
711
+ refreshDispatched: "Actualisation lancée en arrière-plan.",
705
712
  feedChatSeed: "Le flux « {slug} » est défini par le schéma `feeds/{slug}/schema.json` et ses enregistrements se trouvent dans `{dataPath}/` (un fichier `<id>.json` par enregistrement). Utilise ce schéma et ces données pour répondre à cette demande : {message}",
706
713
  feedsTitle: "Flux de données",
707
714
  feedsEmpty: "Aucun flux enregistré pour le moment.",
@@ -805,6 +812,7 @@ var i18n = (0, vue_i18n.createI18n)({
805
812
  chat: "Chat",
806
813
  refreshFeed: "Aktualisieren",
807
814
  refreshFailed: "Aktualisierung fehlgeschlagen: {error}",
815
+ refreshDispatched: "Aktualisierung im Hintergrund gestartet.",
808
816
  feedChatSeed: "Der Feed {slug} ist durch das Schema `feeds/{slug}/schema.json` definiert und seine Datensätze liegen in `{dataPath}/` (eine `<id>.json`-Datei pro Datensatz). Nutze dieses Schema und diese Daten, um auf die folgende Anfrage zu antworten: {message}",
809
817
  feedsTitle: "Datenquellen-Feeds",
810
818
  feedsEmpty: "Noch keine Feeds registriert.",
@@ -1266,7 +1274,7 @@ var CollectionDayView_default = /* @__PURE__ */ (0, vue.defineComponent)({
1266
1274
  return `${String(hour).padStart(2, "0")}:00`;
1267
1275
  }
1268
1276
  const labelField = (0, vue.computed)(() => (0, _mulmoclaude_core_collection.labelFieldFor)(props.schema));
1269
- const CHIP_SKIP_TYPES = new Set([
1277
+ const CHIP_SKIP_TYPES = /* @__PURE__ */ new Set([
1270
1278
  "date",
1271
1279
  "datetime",
1272
1280
  "table",
@@ -1930,7 +1938,7 @@ var _hoisted_74$1 = ["disabled"];
1930
1938
  //#region src/vue/components/CollectionRecordPanel.vue
1931
1939
  var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
1932
1940
  __name: "CollectionRecordPanel",
1933
- props: /* @__PURE__ */ (0, vue.mergeModels)({
1941
+ props: /*@__PURE__*/ (0, vue.mergeModels)({
1934
1942
  collection: {},
1935
1943
  viewing: {},
1936
1944
  saving: { type: Boolean },
@@ -1948,7 +1956,7 @@ var CollectionRecordPanel_default = /* @__PURE__ */ (0, vue.defineComponent)({
1948
1956
  "editing": { required: true },
1949
1957
  "editingModifiers": {}
1950
1958
  }),
1951
- emits: /* @__PURE__ */ (0, vue.mergeModels)([
1959
+ emits: /*@__PURE__*/ (0, vue.mergeModels)([
1952
1960
  "submit",
1953
1961
  "cancel",
1954
1962
  "edit",
@@ -2451,7 +2459,7 @@ var _hoisted_3$4 = {
2451
2459
  var _hoisted_4$4 = ["title", "srcdoc"];
2452
2460
  var REMINT_LEAD_MS = 6e4;
2453
2461
  var MIN_REMINT_DELAY_MS = 1e4;
2454
- var CollectionCustomView_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({
2462
+ var CollectionCustomView_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ (0, vue.defineComponent)({
2455
2463
  __name: "CollectionCustomView",
2456
2464
  props: {
2457
2465
  slug: {},
@@ -2580,7 +2588,7 @@ var _plugin_vue_export_helper_default = (sfc, props) => {
2580
2588
  };
2581
2589
  //#endregion
2582
2590
  //#region src/vue/components/CollectionCustomView.vue
2583
- var CollectionCustomView_default = /* @__PURE__ */ _plugin_vue_export_helper_default(CollectionCustomView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-aa6e6c2d"]]);
2591
+ var CollectionCustomView_default = /*#__PURE__*/ _plugin_vue_export_helper_default(CollectionCustomView_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-aa6e6c2d"]]);
2584
2592
  //#endregion
2585
2593
  //#region src/vue/useCollectionRendering.ts
2586
2594
  function stepForFieldType(type) {
@@ -2636,7 +2644,7 @@ function useCollectionRendering(collection, locale) {
2636
2644
  async function loadLinkedCollections(schema, expectedSlug) {
2637
2645
  const refTargets = new Set(uniqueRefTargets(schema));
2638
2646
  const embedTargets = new Set(uniqueEmbedTargets(schema));
2639
- const allTargets = [...new Set([...refTargets, ...embedTargets])];
2647
+ const allTargets = [.../* @__PURE__ */ new Set([...refTargets, ...embedTargets])];
2640
2648
  if (allTargets.length === 0) return;
2641
2649
  const binding = collectionUi();
2642
2650
  const results = await Promise.all(allTargets.map(async (target) => {
@@ -2841,6 +2849,24 @@ function useCollectionRendering(collection, locale) {
2841
2849
  }
2842
2850
  //#endregion
2843
2851
  //#region src/vue/collectionViewMode.ts
2852
+ /** Build the `custom:<id>` selector key for a custom view. */
2853
+ function customViewKey(viewId) {
2854
+ return `custom:${viewId}`;
2855
+ }
2856
+ /** Every view mode a schema can render, in selector order: `table`
2857
+ * always, `calendar` when a `date`/`datetime` field exists, `kanban`
2858
+ * when an `enum` field exists, then each declared custom view. Mirrors
2859
+ * the field-derived gating inside `CollectionView` (hasCalendar /
2860
+ * hasKanban / customViews) so callers outside that component — e.g. the
2861
+ * dashboard's per-tile view picker — offer exactly the same choices. */
2862
+ function applicableViewModes(schema) {
2863
+ const modes = ["table"];
2864
+ const fields = Object.values(schema.fields);
2865
+ if (fields.some((field) => field.type === "date" || field.type === "datetime")) modes.push("calendar");
2866
+ if (fields.some((field) => field.type === "enum")) modes.push("kanban");
2867
+ for (const view of schema.views ?? []) modes.push(customViewKey(view.id));
2868
+ return modes;
2869
+ }
2844
2870
  var STORAGE_KEY = "collection_view_modes";
2845
2871
  var SORT_STORAGE_KEY = "collection_sorts";
2846
2872
  var BUILT_IN_MODES = [
@@ -2909,7 +2935,10 @@ function writeCollectionSort(slug, sort) {
2909
2935
  //#endregion
2910
2936
  //#region src/vue/components/CollectionView.vue?vue&type=script&setup=true&lang.ts
2911
2937
  var _hoisted_1$4 = { class: "h-full flex flex-col bg-slate-50/30" };
2912
- var _hoisted_2$3 = { class: "flex items-center gap-3 px-6 py-2 border-b border-slate-200 bg-white" };
2938
+ var _hoisted_2$3 = {
2939
+ key: 0,
2940
+ class: "flex items-center gap-3 px-6 py-2 border-b border-slate-200 bg-white"
2941
+ };
2913
2942
  var _hoisted_3$3 = ["title", "aria-label"];
2914
2943
  var _hoisted_4$3 = {
2915
2944
  key: 1,
@@ -2936,186 +2965,192 @@ var _hoisted_12$2 = {
2936
2965
  var _hoisted_13$2 = ["title", "aria-label"];
2937
2966
  var _hoisted_14$2 = ["title", "aria-label"];
2938
2967
  var _hoisted_15$2 = {
2939
- key: 0,
2968
+ key: 1,
2969
+ class: "mx-6 mt-2 rounded-lg border border-indigo-200 bg-indigo-50/60 px-4 py-2 text-sm text-indigo-800 flex items-center gap-2",
2970
+ "data-testid": "collections-refresh-note"
2971
+ };
2972
+ var _hoisted_16$1 = { class: "flex-1" };
2973
+ var _hoisted_17$1 = {
2974
+ key: 2,
2940
2975
  class: "px-6 py-3 bg-white border-b border-slate-100 flex items-center justify-between gap-4"
2941
2976
  };
2942
- var _hoisted_16$1 = {
2977
+ var _hoisted_18$1 = {
2943
2978
  key: 0,
2944
2979
  class: "relative flex-1 max-w-md"
2945
2980
  };
2946
- var _hoisted_17$1 = ["placeholder", "aria-label"];
2947
- var _hoisted_18$1 = ["aria-label"];
2948
- var _hoisted_19$1 = { class: "flex items-center gap-2" };
2981
+ var _hoisted_19$1 = ["placeholder", "aria-label"];
2949
2982
  var _hoisted_20$1 = ["aria-label"];
2950
- var _hoisted_21$1 = ["aria-pressed"];
2951
- var _hoisted_22$1 = ["aria-pressed"];
2983
+ var _hoisted_21$1 = { class: "flex items-center gap-2" };
2984
+ var _hoisted_22$1 = ["aria-label"];
2952
2985
  var _hoisted_23$1 = ["aria-pressed"];
2953
- var _hoisted_24 = [
2986
+ var _hoisted_24 = ["aria-pressed"];
2987
+ var _hoisted_25 = ["aria-pressed"];
2988
+ var _hoisted_26 = [
2954
2989
  "aria-pressed",
2955
2990
  "data-testid",
2956
2991
  "onClick"
2957
2992
  ];
2958
- var _hoisted_25 = { class: "material-icons text-sm" };
2959
- var _hoisted_26 = ["title", "aria-label"];
2960
- var _hoisted_27 = ["title", "aria-label"];
2961
- var _hoisted_28 = ["value", "aria-label"];
2962
- var _hoisted_29 = ["value"];
2993
+ var _hoisted_27 = { class: "material-icons text-sm" };
2994
+ var _hoisted_28 = ["title", "aria-label"];
2995
+ var _hoisted_29 = ["title", "aria-label"];
2963
2996
  var _hoisted_30 = ["value", "aria-label"];
2964
2997
  var _hoisted_31 = ["value"];
2965
- var _hoisted_32 = {
2998
+ var _hoisted_32 = ["value", "aria-label"];
2999
+ var _hoisted_33 = ["value"];
3000
+ var _hoisted_34 = {
2966
3001
  key: 3,
2967
3002
  class: "text-[10px] text-slate-400 font-bold uppercase tracking-wider select-none"
2968
3003
  };
2969
- var _hoisted_33 = {
2970
- key: 1,
3004
+ var _hoisted_35 = {
3005
+ key: 3,
2971
3006
  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",
2972
3007
  "data-testid": "collections-data-issues"
2973
3008
  };
2974
- var _hoisted_34 = { class: "flex-1" };
2975
- var _hoisted_35 = { class: "flex-1 overflow-auto" };
2976
- var _hoisted_36 = {
3009
+ var _hoisted_36 = { class: "flex-1" };
3010
+ var _hoisted_37 = { class: "flex-1 overflow-auto" };
3011
+ var _hoisted_38 = {
2977
3012
  key: 0,
2978
3013
  class: "flex flex-col items-center justify-center py-20 text-sm text-slate-500 gap-3"
2979
3014
  };
2980
- var _hoisted_37 = {
3015
+ var _hoisted_39 = {
2981
3016
  key: 1,
2982
3017
  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"
2983
3018
  };
2984
- var _hoisted_38 = { key: 2 };
2985
- var _hoisted_39 = {
3019
+ var _hoisted_40 = { key: 2 };
3020
+ var _hoisted_41 = {
2986
3021
  key: 3,
2987
3022
  class: "p-4"
2988
3023
  };
2989
- var _hoisted_40 = {
3024
+ var _hoisted_42 = {
2990
3025
  key: 4,
2991
3026
  class: "h-full flex flex-col"
2992
3027
  };
2993
- var _hoisted_41 = {
3028
+ var _hoisted_43 = {
2994
3029
  key: 0,
2995
3030
  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",
2996
3031
  "data-testid": "collections-inline-error"
2997
3032
  };
2998
- var _hoisted_42 = { class: "flex-1" };
2999
- var _hoisted_43 = ["aria-label"];
3000
- var _hoisted_44 = { class: "flex-1 min-h-0 px-3 py-2" };
3001
- var _hoisted_45 = {
3033
+ var _hoisted_44 = { class: "flex-1" };
3034
+ var _hoisted_45 = ["aria-label"];
3035
+ var _hoisted_46 = { class: "flex-1 min-h-0 px-3 py-2" };
3036
+ var _hoisted_47 = {
3002
3037
  key: 5,
3003
3038
  class: "h-full",
3004
3039
  "data-testid": "collection-custom-view-body"
3005
3040
  };
3006
- var _hoisted_46 = {
3041
+ var _hoisted_48 = {
3007
3042
  key: 6,
3008
3043
  class: "flex flex-col items-center justify-center py-20 text-sm text-slate-400 gap-2"
3009
3044
  };
3010
- var _hoisted_47 = { class: "font-semibold text-slate-600" };
3011
- var _hoisted_48 = {
3045
+ var _hoisted_49 = { class: "font-semibold text-slate-600" };
3046
+ var _hoisted_50 = {
3012
3047
  key: 7,
3013
3048
  class: "flex flex-col items-center justify-center py-20 text-sm text-slate-400 gap-2"
3014
3049
  };
3015
- var _hoisted_49 = { class: "font-semibold text-slate-600" };
3016
- var _hoisted_50 = {
3050
+ var _hoisted_51 = { class: "font-semibold text-slate-600" };
3051
+ var _hoisted_52 = {
3017
3052
  key: 8,
3018
3053
  class: "overflow-x-auto [container-type:inline-size]"
3019
3054
  };
3020
- var _hoisted_51 = {
3055
+ var _hoisted_53 = {
3021
3056
  key: 0,
3022
3057
  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",
3023
3058
  "data-testid": "collections-inline-error"
3024
3059
  };
3025
- var _hoisted_52 = { class: "flex-1" };
3026
- var _hoisted_53 = ["aria-label"];
3027
- var _hoisted_54 = { class: "min-w-full text-xs" };
3028
- var _hoisted_55 = { class: "bg-slate-50 border-b border-slate-200" };
3029
- var _hoisted_56 = ["aria-sort"];
3030
- var _hoisted_57 = { class: "flex items-center gap-1" };
3031
- var _hoisted_58 = ["title"];
3032
- var _hoisted_59 = [
3060
+ var _hoisted_54 = { class: "flex-1" };
3061
+ var _hoisted_55 = ["aria-label"];
3062
+ var _hoisted_56 = { class: "min-w-full text-xs" };
3063
+ var _hoisted_57 = { class: "bg-slate-50 border-b border-slate-200" };
3064
+ var _hoisted_58 = ["aria-sort"];
3065
+ var _hoisted_59 = { class: "flex items-center gap-1" };
3066
+ var _hoisted_60 = ["title"];
3067
+ var _hoisted_61 = [
3033
3068
  "data-testid",
3034
3069
  "aria-label",
3035
3070
  "onClick",
3036
3071
  "onPointerenter"
3037
3072
  ];
3038
- var _hoisted_60 = { class: "material-icons text-base align-middle" };
3039
- var _hoisted_61 = { class: "divide-y divide-slate-100 bg-white" };
3040
- var _hoisted_62 = [
3073
+ var _hoisted_62 = { class: "material-icons text-base align-middle" };
3074
+ var _hoisted_63 = { class: "divide-y divide-slate-100 bg-white" };
3075
+ var _hoisted_64 = [
3041
3076
  "aria-label",
3042
3077
  "data-testid",
3043
3078
  "onClick",
3044
3079
  "onKeydown"
3045
3080
  ];
3046
- var _hoisted_63 = [
3081
+ var _hoisted_65 = [
3047
3082
  "checked",
3048
3083
  "disabled",
3049
3084
  "data-testid",
3050
3085
  "aria-label",
3051
3086
  "onChange"
3052
3087
  ];
3053
- var _hoisted_64 = [
3088
+ var _hoisted_66 = [
3054
3089
  "checked",
3055
3090
  "disabled",
3056
3091
  "data-testid",
3057
3092
  "aria-label",
3058
3093
  "onChange"
3059
3094
  ];
3060
- var _hoisted_65 = {
3095
+ var _hoisted_67 = {
3061
3096
  key: 2,
3062
3097
  class: "block truncate"
3063
3098
  };
3064
- var _hoisted_66 = [
3099
+ var _hoisted_68 = [
3065
3100
  "href",
3066
3101
  "tabindex",
3067
3102
  "data-testid",
3068
3103
  "onClick",
3069
3104
  "onKeydown"
3070
3105
  ];
3071
- var _hoisted_67 = [
3106
+ var _hoisted_69 = [
3072
3107
  "value",
3073
3108
  "disabled",
3074
3109
  "data-testid",
3075
3110
  "aria-label",
3076
3111
  "onChange"
3077
3112
  ];
3078
- var _hoisted_68 = {
3113
+ var _hoisted_70 = {
3079
3114
  key: 0,
3080
3115
  value: ""
3081
3116
  };
3082
- var _hoisted_69 = ["value"];
3083
- var _hoisted_70 = {
3117
+ var _hoisted_71 = ["value"];
3118
+ var _hoisted_72 = {
3084
3119
  key: 4,
3085
3120
  class: "block truncate tabular-nums font-semibold text-slate-900"
3086
3121
  };
3087
- var _hoisted_71 = {
3122
+ var _hoisted_73 = {
3088
3123
  key: 5,
3089
3124
  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"
3090
3125
  };
3091
- var _hoisted_72 = {
3126
+ var _hoisted_74 = {
3092
3127
  key: 6,
3093
3128
  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"
3094
3129
  };
3095
- var _hoisted_73 = ["href", "data-testid"];
3096
- var _hoisted_74 = ["href", "data-testid"];
3097
- var _hoisted_75 = [
3130
+ var _hoisted_75 = ["href", "data-testid"];
3131
+ var _hoisted_76 = ["href", "data-testid"];
3132
+ var _hoisted_77 = [
3098
3133
  "href",
3099
3134
  "data-testid",
3100
3135
  "onClick"
3101
3136
  ];
3102
- var _hoisted_76 = {
3137
+ var _hoisted_78 = {
3103
3138
  key: 10,
3104
3139
  class: "block truncate text-slate-600"
3105
3140
  };
3106
- var _hoisted_77 = { class: "bg-white rounded-2xl shadow-2xl w-full max-w-xl flex flex-col border border-slate-200 overflow-hidden" };
3107
- var _hoisted_78 = { class: "px-6 py-4 border-b border-slate-100 flex items-center gap-3 bg-slate-50/50" };
3108
- var _hoisted_79 = { class: "flex-1" };
3109
- var _hoisted_80 = {
3141
+ var _hoisted_79 = { class: "bg-white rounded-2xl shadow-2xl w-full max-w-xl flex flex-col border border-slate-200 overflow-hidden" };
3142
+ var _hoisted_80 = { class: "px-6 py-4 border-b border-slate-100 flex items-center gap-3 bg-slate-50/50" };
3143
+ var _hoisted_81 = { class: "flex-1" };
3144
+ var _hoisted_82 = {
3110
3145
  id: "collections-chat-title",
3111
3146
  class: "text-sm font-bold text-slate-800 uppercase tracking-wide"
3112
3147
  };
3113
- var _hoisted_81 = { class: "text-xs text-slate-400 font-semibold" };
3114
- var _hoisted_82 = ["aria-label"];
3115
- var _hoisted_83 = { class: "px-6 py-5" };
3116
- var _hoisted_84 = ["placeholder", "onKeydown"];
3117
- var _hoisted_85 = { class: "px-6 py-3.5 border-t border-slate-100 flex items-center justify-end gap-2 bg-slate-50/50" };
3118
- var _hoisted_86 = ["disabled"];
3148
+ var _hoisted_83 = { class: "text-xs text-slate-400 font-semibold" };
3149
+ var _hoisted_84 = ["aria-label"];
3150
+ var _hoisted_85 = { class: "px-6 py-5" };
3151
+ var _hoisted_86 = ["placeholder", "onKeydown"];
3152
+ var _hoisted_87 = { class: "px-6 py-3.5 border-t border-slate-100 flex items-center justify-end gap-2 bg-slate-50/50" };
3153
+ var _hoisted_88 = ["disabled"];
3119
3154
  /** `slug` / `selected` are supplied only in EMBEDDED mode (the
3120
3155
  * `presentCollection` chat card mounts this component and drives both
3121
3156
  * from the tool result). In standalone route mode (the
@@ -3137,7 +3172,10 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3137
3172
  sendTextMessage: { type: Function },
3138
3173
  initialView: {},
3139
3174
  initialAnchorField: {},
3140
- initialGroupField: {}
3175
+ initialGroupField: {},
3176
+ hideViewToggle: { type: Boolean },
3177
+ hideHeader: { type: Boolean },
3178
+ hideSearch: { type: Boolean }
3141
3179
  },
3142
3180
  emits: ["select", "viewStateChange"],
3143
3181
  setup(__props, { emit: __emit }) {
@@ -3175,6 +3213,11 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3175
3213
  });
3176
3214
  /** True while a feed collection's manual refresh is in flight. */
3177
3215
  const refreshing = (0, vue.ref)(false);
3216
+ /** Transient note shown after an agent-ingest Refresh dispatches a background
3217
+ * worker (records update asynchronously, so there's nothing to show inline).
3218
+ * Auto-clears; `refreshNoteTimer` cancels a pending clear on re-trigger. */
3219
+ const refreshNote = (0, vue.ref)(null);
3220
+ let refreshNoteTimer;
3178
3221
  /** Slug already auto-refreshed on first open — prevents a reload loop
3179
3222
  * (the auto-refresh reloads the view, which would re-trigger otherwise). */
3180
3223
  const autoRefreshedSlug = (0, vue.ref)(null);
@@ -3357,7 +3400,21 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3357
3400
  return;
3358
3401
  }
3359
3402
  await loadCollection(current.slug);
3360
- if (result.data.errors.length > 0) inlineError.value = t("collectionsView.refreshFailed", { error: result.data.errors.join("; ") });
3403
+ if (result.data.errors.length > 0) {
3404
+ inlineError.value = t("collectionsView.refreshFailed", { error: result.data.errors.join("; ") });
3405
+ return;
3406
+ }
3407
+ if (result.data.dispatched) if (result.data.chatId && cui.navigate) cui.navigate(`/chat/${result.data.chatId}`);
3408
+ else showRefreshNote(t("collectionsView.refreshDispatched"));
3409
+ }
3410
+ /** Show a transient refresh note, replacing any pending auto-clear. */
3411
+ function showRefreshNote(message) {
3412
+ refreshNote.value = message;
3413
+ if (refreshNoteTimer !== void 0) clearTimeout(refreshNoteTimer);
3414
+ refreshNoteTimer = setTimeout(() => {
3415
+ refreshNote.value = null;
3416
+ refreshNoteTimer = void 0;
3417
+ }, 6e3);
3361
3418
  }
3362
3419
  /** Collection-level header actions. No `when` predicate (no record). */
3363
3420
  const collectionActions = (0, vue.computed)(() => collection.value?.schema.collectionActions ?? []);
@@ -3450,11 +3507,11 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3450
3507
  * (`feeds/<slug>/schema.json` and `<dataPath>/`) and let it act on the
3451
3508
  * request directly. */
3452
3509
  function buildChatSeed(slug, message, itemId) {
3453
- const schema = collection.value?.schema;
3454
- if (!schema?.ingest) return itemId ? `/${slug} id=${itemId} ${message}` : `/${slug} ${message}`;
3510
+ const current = collection.value;
3511
+ if (current?.source !== "feed") return itemId ? `/${slug} id=${itemId} ${message}` : `/${slug} ${message}`;
3455
3512
  return t("collectionsView.feedChatSeed", {
3456
3513
  slug,
3457
- dataPath: schema.dataPath ?? `data/feeds/${slug}`,
3514
+ dataPath: current.schema.dataPath ?? `data/feeds/${slug}`,
3458
3515
  message: itemId ? `(for record \`${itemId}\`) ${message}` : message
3459
3516
  });
3460
3517
  }
@@ -3538,7 +3595,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3538
3595
  function maybeAutoRefreshFeed(slug) {
3539
3596
  if (embedded.value) return;
3540
3597
  const current = collection.value;
3541
- if (current?.slug !== slug || !current.schema.ingest) return;
3598
+ if (current?.slug !== slug || current.source !== "feed") return;
3542
3599
  if (items.value.length > 0 || autoRefreshedSlug.value === slug) return;
3543
3600
  autoRefreshedSlug.value = slug;
3544
3601
  refreshFeed();
@@ -3562,7 +3619,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3562
3619
  if (!current) return false;
3563
3620
  return current.source === "project" && !current.slug.startsWith("mc-");
3564
3621
  });
3565
- const isFeed = (0, vue.computed)(() => Boolean(collection.value?.schema.ingest));
3622
+ const isFeed = (0, vue.computed)(() => collection.value?.source === "feed");
3566
3623
  const canDeleteFeed = (0, vue.computed)(() => isFeed.value && !embedded.value);
3567
3624
  const isFeedRoute = (0, vue.computed)(() => !embedded.value && cui.isFeedRoute());
3568
3625
  /** The view to open with: the embedded card's restored `initialView` if
@@ -3625,7 +3682,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3625
3682
  function addCustomView() {
3626
3683
  const current = collection.value;
3627
3684
  if (!current) return;
3628
- const base = current.schema.ingest ? `feeds/${current.slug}` : `data/skills/${current.slug}`;
3685
+ const base = current.source === "feed" ? `feeds/${current.slug}` : `data/skills/${current.slug}`;
3629
3686
  const prompt = t("collectionsView.addViewPrompt", {
3630
3687
  title: current.title,
3631
3688
  base
@@ -3683,10 +3740,6 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
3683
3740
  function setCustomView(viewId) {
3684
3741
  view.value = `custom:${viewId}`;
3685
3742
  }
3686
- /** Selector-key for a custom view, for active-state comparison in the template. */
3687
- function customViewKey(viewId) {
3688
- return `custom:${viewId}`;
3689
- }
3690
3743
  /** A short, slug-safe id not already used by a loaded record. Collisions
3691
3744
  * are astronomically unlikely (32 bits), but we still re-roll a few
3692
3745
  * times against the in-memory set before giving up and using the last
@@ -4164,6 +4217,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4164
4217
  changeUnsub?.();
4165
4218
  changeUnsub = null;
4166
4219
  clearLiveRefreshTimer();
4220
+ if (refreshNoteTimer !== void 0) clearTimeout(refreshNoteTimer);
4167
4221
  });
4168
4222
  (0, vue.watch)([
4169
4223
  activeView,
@@ -4189,7 +4243,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4189
4243
  });
4190
4244
  return (_ctx, _cache) => {
4191
4245
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1$4, [
4192
- (0, vue.createElementVNode)("header", _hoisted_2$3, [
4246
+ !__props.hideHeader ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("header", _hoisted_2$3, [
4193
4247
  !embedded.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4194
4248
  key: 0,
4195
4249
  type: "button",
@@ -4263,25 +4317,26 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4263
4317
  "data-testid": "feeds-delete",
4264
4318
  onClick: confirmFeedDelete
4265
4319
  }, [..._cache[27] || (_cache[27] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "delete_forever", -1)])], 8, _hoisted_14$2)) : (0, vue.createCommentVNode)("", true)
4266
- ]),
4267
- collection.value && (items.value.length > 0 || hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_15$2, [items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_16$1, [
4268
- _cache[29] || (_cache[29] = (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)),
4320
+ ])) : (0, vue.createCommentVNode)("", true),
4321
+ refreshNote.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_15$2, [_cache[28] || (_cache[28] = (0, vue.createElementVNode)("span", { class: "material-icons text-base text-indigo-600" }, "hourglass_top", -1)), (0, vue.createElementVNode)("span", _hoisted_16$1, (0, vue.toDisplayString)(refreshNote.value), 1)])) : (0, vue.createCommentVNode)("", true),
4322
+ 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_17$1, [!__props.hideSearch && items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_18$1, [
4323
+ _cache[30] || (_cache[30] = (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)),
4269
4324
  (0, vue.withDirectives)((0, vue.createElementVNode)("input", {
4270
4325
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
4271
4326
  type: "text",
4272
4327
  placeholder: (0, vue.unref)(t)("collectionsView.searchPlaceholder"),
4273
4328
  "aria-label": (0, vue.unref)(t)("collectionsView.searchPlaceholder"),
4274
4329
  class: "w-full bg-slate-50 border border-slate-200/80 rounded-xl pl-9 pr-8 py-1.5 text-xs placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 focus:bg-white transition-all font-medium"
4275
- }, null, 8, _hoisted_17$1), [[vue.vModelText, searchQuery.value]]),
4330
+ }, null, 8, _hoisted_19$1), [[vue.vModelText, searchQuery.value]]),
4276
4331
  searchQuery.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4277
4332
  key: 0,
4278
4333
  type: "button",
4279
4334
  "aria-label": (0, vue.unref)(t)("collectionsView.clearSearch"),
4280
4335
  class: "absolute inset-y-0 right-0 flex items-center pr-2.5 text-slate-400 hover:text-slate-600",
4281
4336
  onClick: _cache[1] || (_cache[1] = ($event) => searchQuery.value = "")
4282
- }, [..._cache[28] || (_cache[28] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_18$1)) : (0, vue.createCommentVNode)("", true)
4283
- ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_19$1, [
4284
- hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
4337
+ }, [..._cache[29] || (_cache[29] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "close", -1)])], 8, _hoisted_20$1)) : (0, vue.createCommentVNode)("", true)
4338
+ ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_21$1, [
4339
+ !__props.hideViewToggle && (hasCalendar.value || hasKanban.value || hasCustomViews.value || canAddCustomView.value) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
4285
4340
  key: 0,
4286
4341
  class: "flex gap-0.5",
4287
4342
  role: "group",
@@ -4293,7 +4348,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4293
4348
  "aria-pressed": activeView.value === "table",
4294
4349
  "data-testid": "collection-view-toggle-table",
4295
4350
  onClick: _cache[2] || (_cache[2] = ($event) => setView("table"))
4296
- }, [_cache[30] || (_cache[30] = (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_21$1),
4351
+ }, [_cache[31] || (_cache[31] = (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_23$1),
4297
4352
  hasCalendar.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4298
4353
  key: 0,
4299
4354
  type: "button",
@@ -4301,7 +4356,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4301
4356
  "aria-pressed": activeView.value === "calendar",
4302
4357
  "data-testid": "collection-view-toggle-calendar",
4303
4358
  onClick: _cache[3] || (_cache[3] = ($event) => setView("calendar"))
4304
- }, [_cache[31] || (_cache[31] = (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_22$1)) : (0, vue.createCommentVNode)("", true),
4359
+ }, [_cache[32] || (_cache[32] = (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_24)) : (0, vue.createCommentVNode)("", true),
4305
4360
  hasKanban.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4306
4361
  key: 1,
4307
4362
  type: "button",
@@ -4309,16 +4364,16 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4309
4364
  "aria-pressed": activeView.value === "kanban",
4310
4365
  "data-testid": "collection-view-toggle-kanban",
4311
4366
  onClick: _cache[4] || (_cache[4] = ($event) => setView("kanban"))
4312
- }, [_cache[32] || (_cache[32] = (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_23$1)) : (0, vue.createCommentVNode)("", true),
4367
+ }, [_cache[33] || (_cache[33] = (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_25)) : (0, vue.createCommentVNode)("", true),
4313
4368
  ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(customViews.value, (cv) => {
4314
4369
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4315
4370
  key: cv.id,
4316
4371
  type: "button",
4317
- class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === customViewKey(cv.id) ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
4318
- "aria-pressed": activeView.value === customViewKey(cv.id),
4372
+ class: (0, vue.normalizeClass)(["h-8 px-2.5 flex items-center gap-1 rounded text-xs font-bold transition-colors", activeView.value === (0, vue.unref)(customViewKey)(cv.id) ? "bg-indigo-600 text-white" : "bg-white text-slate-500 border border-slate-200 hover:bg-slate-50"]),
4373
+ "aria-pressed": activeView.value === (0, vue.unref)(customViewKey)(cv.id),
4319
4374
  "data-testid": `collection-view-custom-${cv.id}`,
4320
4375
  onClick: ($event) => setCustomView(cv.id)
4321
- }, [(0, vue.createElementVNode)("span", _hoisted_25, (0, vue.toDisplayString)(cv.icon || "dashboard_customize"), 1), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(cv.label), 1)], 10, _hoisted_24);
4376
+ }, [(0, vue.createElementVNode)("span", _hoisted_27, (0, vue.toDisplayString)(cv.icon || "dashboard_customize"), 1), (0, vue.createElementVNode)("span", null, (0, vue.toDisplayString)(cv.label), 1)], 10, _hoisted_26);
4322
4377
  }), 128)),
4323
4378
  canAddCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4324
4379
  key: 2,
@@ -4328,7 +4383,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4328
4383
  "aria-label": (0, vue.unref)(t)("collectionsView.addView"),
4329
4384
  "data-testid": "collection-view-add",
4330
4385
  onClick: addCustomView
4331
- }, [..._cache[33] || (_cache[33] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "add", -1)])], 8, _hoisted_26)) : (0, vue.createCommentVNode)("", true),
4386
+ }, [..._cache[34] || (_cache[34] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "add", -1)])], 8, _hoisted_28)) : (0, vue.createCommentVNode)("", true),
4332
4387
  canConfigureViews.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4333
4388
  key: 3,
4334
4389
  type: "button",
@@ -4337,8 +4392,8 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4337
4392
  "aria-label": (0, vue.unref)(t)("collectionsView.config.open"),
4338
4393
  "data-testid": "collection-config-open",
4339
4394
  onClick: _cache[5] || (_cache[5] = ($event) => configOpen.value = true)
4340
- }, [..._cache[34] || (_cache[34] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "settings", -1)])], 8, _hoisted_27)) : (0, vue.createCommentVNode)("", true)
4341
- ], 8, _hoisted_20$1)) : (0, vue.createCommentVNode)("", true),
4395
+ }, [..._cache[35] || (_cache[35] = [(0, vue.createElementVNode)("span", { class: "material-icons text-sm" }, "settings", -1)])], 8, _hoisted_29)) : (0, vue.createCommentVNode)("", true)
4396
+ ], 8, _hoisted_22$1)) : (0, vue.createCommentVNode)("", true),
4342
4397
  calendarActive.value && dateFields.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
4343
4398
  key: 1,
4344
4399
  value: calendarAnchorField.value,
@@ -4350,8 +4405,8 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4350
4405
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
4351
4406
  key,
4352
4407
  value: key
4353
- }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_29);
4354
- }), 128))], 40, _hoisted_28)) : (0, vue.createCommentVNode)("", true),
4408
+ }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_31);
4409
+ }), 128))], 40, _hoisted_30)) : (0, vue.createCommentVNode)("", true),
4355
4410
  kanbanActive.value && enumFields.value.length > 1 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
4356
4411
  key: 2,
4357
4412
  value: kanbanGroupField.value,
@@ -4363,24 +4418,24 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4363
4418
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
4364
4419
  key,
4365
4420
  value: key
4366
- }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_31);
4367
- }), 128))], 40, _hoisted_30)) : (0, vue.createCommentVNode)("", true),
4368
- items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_32, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.searchSummary", {
4421
+ }, (0, vue.toDisplayString)(collection.value?.schema.fields[key]?.label ?? key), 9, _hoisted_33);
4422
+ }), 128))], 40, _hoisted_32)) : (0, vue.createCommentVNode)("", true),
4423
+ items.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_34, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.searchSummary", {
4369
4424
  shown: filteredItems.value.length,
4370
4425
  total: items.value.length
4371
4426
  })), 1)) : (0, vue.createCommentVNode)("", true)
4372
4427
  ])])) : (0, vue.createCommentVNode)("", true),
4373
- collection.value && dataIssues.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_33, [
4374
- _cache[36] || (_cache[36] = (0, vue.createElementVNode)("span", { class: "material-icons text-amber-600" }, "warning", -1)),
4375
- (0, vue.createElementVNode)("span", _hoisted_34, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.dataIssuesDetected", { count: dataIssues.value.length })), 1),
4428
+ collection.value && dataIssues.value.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_35, [
4429
+ _cache[37] || (_cache[37] = (0, vue.createElementVNode)("span", { class: "material-icons text-amber-600" }, "warning", -1)),
4430
+ (0, vue.createElementVNode)("span", _hoisted_36, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.dataIssuesDetected", { count: dataIssues.value.length })), 1),
4376
4431
  (0, vue.createElementVNode)("button", {
4377
4432
  type: "button",
4378
4433
  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",
4379
4434
  "data-testid": "collections-repair",
4380
4435
  onClick: repairCollection
4381
- }, [_cache[35] || (_cache[35] = (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)])
4436
+ }, [_cache[36] || (_cache[36] = (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)])
4382
4437
  ])) : (0, vue.createCommentVNode)("", true),
4383
- (0, vue.createElementVNode)("div", _hoisted_35, [loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_36, [_cache[37] || (_cache[37] = (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_37, [_cache[38] || (_cache[38] = (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_38)) : calendarActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_39, [(0, vue.createVNode)(CollectionCalendarView_default, {
4438
+ (0, vue.createElementVNode)("div", _hoisted_37, [loading.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_38, [_cache[38] || (_cache[38] = (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_39, [_cache[39] || (_cache[39] = (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_40)) : calendarActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_41, [(0, vue.createVNode)(CollectionCalendarView_default, {
4384
4439
  schema: collection.value.schema,
4385
4440
  items: filteredItems.value,
4386
4441
  "anchor-field": calendarAnchorField.value,
@@ -4465,16 +4520,16 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4465
4520
  "selected",
4466
4521
  "can-create",
4467
4522
  "show-detail"
4468
- ])) : (0, vue.createCommentVNode)("", true)])) : kanbanActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_40, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_41, [
4469
- _cache[40] || (_cache[40] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
4470
- (0, vue.createElementVNode)("span", _hoisted_42, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
4523
+ ])) : (0, vue.createCommentVNode)("", true)])) : kanbanActive.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_42, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_43, [
4524
+ _cache[41] || (_cache[41] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
4525
+ (0, vue.createElementVNode)("span", _hoisted_44, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
4471
4526
  (0, vue.createElementVNode)("button", {
4472
4527
  type: "button",
4473
4528
  class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
4474
4529
  "aria-label": (0, vue.unref)(t)("common.close"),
4475
4530
  onClick: _cache[10] || (_cache[10] = ($event) => inlineError.value = null)
4476
- }, [..._cache[39] || (_cache[39] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_43)
4477
- ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_44, [(0, vue.createVNode)(CollectionKanbanView_default, {
4531
+ }, [..._cache[40] || (_cache[40] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_45)
4532
+ ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("div", _hoisted_46, [(0, vue.createVNode)(CollectionKanbanView_default, {
4478
4533
  schema: collection.value.schema,
4479
4534
  items: filteredItems.value,
4480
4535
  "group-field": kanbanGroupField.value,
@@ -4488,37 +4543,37 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4488
4543
  "group-field",
4489
4544
  "selected",
4490
4545
  "notified"
4491
- ])])])) : activeCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_45, [(0, vue.createVNode)(CollectionCustomView_default, {
4546
+ ])])])) : activeCustomView.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_47, [(0, vue.createVNode)(CollectionCustomView_default, {
4492
4547
  slug: collection.value.slug,
4493
4548
  view: activeCustomView.value,
4494
4549
  onOpenItem: onCustomViewOpenItem,
4495
4550
  onStartChat: onCustomViewStartChat
4496
- }, null, 8, ["slug", "view"])])) : items.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_46, [_cache[41] || (_cache[41] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "folder_open", -1)), (0, vue.createElementVNode)("p", _hoisted_47, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.itemsEmpty")), 1)])) : filteredItems.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_48, [
4497
- _cache[42] || (_cache[42] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "search_off", -1)),
4498
- (0, vue.createElementVNode)("p", _hoisted_49, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.noMatchingItems")), 1),
4551
+ }, null, 8, ["slug", "view"])])) : items.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_48, [_cache[42] || (_cache[42] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "folder_open", -1)), (0, vue.createElementVNode)("p", _hoisted_49, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.itemsEmpty")), 1)])) : filteredItems.value.length === 0 && editing.value?.mode !== "create" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_50, [
4552
+ _cache[43] || (_cache[43] = (0, vue.createElementVNode)("span", { class: "material-icons text-4xl text-slate-300" }, "search_off", -1)),
4553
+ (0, vue.createElementVNode)("p", _hoisted_51, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.noMatchingItems")), 1),
4499
4554
  (0, vue.createElementVNode)("button", {
4500
4555
  type: "button",
4501
4556
  class: "text-xs text-indigo-600 font-semibold hover:underline",
4502
4557
  onClick: _cache[11] || (_cache[11] = ($event) => searchQuery.value = "")
4503
4558
  }, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.clearSearch")), 1)
4504
- ])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_50, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_51, [
4505
- _cache[44] || (_cache[44] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
4506
- (0, vue.createElementVNode)("span", _hoisted_52, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
4559
+ ])) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_52, [inlineError.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_53, [
4560
+ _cache[45] || (_cache[45] = (0, vue.createElementVNode)("span", { class: "material-icons text-red-600" }, "error", -1)),
4561
+ (0, vue.createElementVNode)("span", _hoisted_54, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.inlineSaveFailed", { error: inlineError.value })), 1),
4507
4562
  (0, vue.createElementVNode)("button", {
4508
4563
  type: "button",
4509
4564
  class: "h-8 w-8 flex items-center justify-center rounded text-red-600 hover:bg-red-100",
4510
4565
  "aria-label": (0, vue.unref)(t)("common.close"),
4511
4566
  onClick: _cache[12] || (_cache[12] = ($event) => inlineError.value = null)
4512
- }, [..._cache[43] || (_cache[43] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_53)
4513
- ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("table", _hoisted_54, [(0, vue.createElementVNode)("thead", null, [(0, vue.createElementVNode)("tr", _hoisted_55, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(listColumnFields.value, ([key, field]) => {
4567
+ }, [..._cache[44] || (_cache[44] = [(0, vue.createElementVNode)("span", { class: "material-icons text-base" }, "close", -1)])], 8, _hoisted_55)
4568
+ ])) : (0, vue.createCommentVNode)("", true), (0, vue.createElementVNode)("table", _hoisted_56, [(0, vue.createElementVNode)("thead", null, [(0, vue.createElementVNode)("tr", _hoisted_57, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(listColumnFields.value, ([key, field]) => {
4514
4569
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("th", {
4515
4570
  key,
4516
4571
  "aria-sort": (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? sortAriaValue(key) : void 0,
4517
4572
  class: "px-5 py-3 font-bold text-slate-500 text-left uppercase tracking-wider whitespace-nowrap"
4518
- }, [(0, vue.createElementVNode)("div", _hoisted_57, [(0, vue.createElementVNode)("span", {
4573
+ }, [(0, vue.createElementVNode)("div", _hoisted_59, [(0, vue.createElementVNode)("span", {
4519
4574
  class: "truncate max-w-[14rem]",
4520
4575
  title: field.label
4521
- }, (0, vue.toDisplayString)(field.label), 9, _hoisted_58), (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4576
+ }, (0, vue.toDisplayString)(field.label), 9, _hoisted_60), (0, vue.unref)(_mulmoclaude_core_collection.isSortableField)(field) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
4522
4577
  key: 0,
4523
4578
  type: "button",
4524
4579
  class: (0, vue.normalizeClass)(["inline-flex items-center justify-center rounded p-0.5 -my-1 leading-none transition-colors", sortButtonClass(key)]),
@@ -4527,8 +4582,8 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4527
4582
  onClick: (0, vue.withModifiers)(($event) => cycleSort(key), ["stop"]),
4528
4583
  onPointerenter: ($event) => hoveredSortKey.value = key,
4529
4584
  onPointerleave: _cache[13] || (_cache[13] = ($event) => hoveredSortKey.value = null)
4530
- }, [(0, vue.createElementVNode)("span", _hoisted_60, (0, vue.toDisplayString)(sortIconName(key)), 1)], 42, _hoisted_59)) : (0, vue.createCommentVNode)("", true)])], 8, _hoisted_56);
4531
- }), 128))])]), (0, vue.createElementVNode)("tbody", _hoisted_61, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(sortedItems.value, (item) => {
4585
+ }, [(0, vue.createElementVNode)("span", _hoisted_62, (0, vue.toDisplayString)(sortIconName(key)), 1)], 42, _hoisted_61)) : (0, vue.createCommentVNode)("", true)])], 8, _hoisted_58);
4586
+ }), 128))])]), (0, vue.createElementVNode)("tbody", _hoisted_63, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)(sortedItems.value, (item) => {
4532
4587
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("tr", {
4533
4588
  key: String(item[collection.value.schema.primaryKey] ?? ""),
4534
4589
  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" : ""]),
@@ -4552,7 +4607,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4552
4607
  "aria-label": field.label,
4553
4608
  onClick: _cache[14] || (_cache[14] = (0, vue.withModifiers)(() => {}, ["stop"])),
4554
4609
  onChange: ($event) => commitToggle(item, field)
4555
- }, null, 40, _hoisted_63)) : field.type === "boolean" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("input", {
4610
+ }, null, 40, _hoisted_65)) : field.type === "boolean" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("input", {
4556
4611
  key: 1,
4557
4612
  type: "checkbox",
4558
4613
  checked: item[key] === true,
@@ -4562,7 +4617,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4562
4617
  "aria-label": field.label,
4563
4618
  onClick: _cache[15] || (_cache[15] = (0, vue.withModifiers)(() => {}, ["stop"])),
4564
4619
  onChange: ($event) => commitInlineEdit(item, String(key), field, $event.target.checked)
4565
- }, null, 40, _hoisted_64)) : field.type === "ref" && field.to && typeof item[key] === "string" && item[key] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_65, [(0, vue.createElementVNode)("a", {
4620
+ }, null, 40, _hoisted_66)) : field.type === "ref" && field.to && typeof item[key] === "string" && item[key] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_67, [(0, vue.createElementVNode)("a", {
4566
4621
  href: (0, vue.unref)(cui).recordHref?.(field.to, String(item[key])),
4567
4622
  tabindex: (0, vue.unref)(cui).recordHref?.(field.to, String(item[key])) ? void 0 : 0,
4568
4623
  role: "link",
@@ -4570,7 +4625,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4570
4625
  "data-testid": `collections-ref-link-${key}-${item[key]}`,
4571
4626
  onClick: ($event) => (0, vue.unref)(activateRefLink)($event, field.to, String(item[key]), true),
4572
4627
  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"])]
4573
- }, (0, vue.toDisplayString)((0, vue.unref)(refDisplay)(field.to, String(item[key]))), 41, _hoisted_66)])) : field.type === "enum" && Array.isArray(field.values) && field.values.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
4628
+ }, (0, vue.toDisplayString)((0, vue.unref)(refDisplay)(field.to, String(item[key]))), 41, _hoisted_68)])) : field.type === "enum" && Array.isArray(field.values) && field.values.length > 0 ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("select", {
4574
4629
  key: 3,
4575
4630
  value: item[key] == null ? "" : String(item[key]),
4576
4631
  disabled: isRowInlineSaving(item),
@@ -4579,12 +4634,12 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4579
4634
  "aria-label": field.label,
4580
4635
  onClick: _cache[16] || (_cache[16] = (0, vue.withModifiers)(() => {}, ["stop"])),
4581
4636
  onChange: ($event) => commitInlineEdit(item, String(key), field, $event.target.value)
4582
- }, [showEnumPlaceholder(item, String(key)) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("option", _hoisted_68, (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) => {
4637
+ }, [showEnumPlaceholder(item, String(key)) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("option", _hoisted_70, (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) => {
4583
4638
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("option", {
4584
4639
  key: value,
4585
4640
  value
4586
- }, (0, vue.toDisplayString)(value), 9, _hoisted_69);
4587
- }), 128))], 42, _hoisted_67)) : field.type === "money" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_70, (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_71, [_cache[45] || (_cache[45] = (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_72, (0, vue.toDisplayString)((0, vue.unref)(derivedDisplay)(field, (0, vue.unref)(evaluateDerivedAgainstItem)(field, String(key), item), item)), 1)) : field.type !== "file" && (0, vue.unref)(isExternalUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
4641
+ }, (0, vue.toDisplayString)(value), 9, _hoisted_71);
4642
+ }), 128))], 42, _hoisted_69)) : field.type === "money" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_72, (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_73, [_cache[46] || (_cache[46] = (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_74, (0, vue.toDisplayString)((0, vue.unref)(derivedDisplay)(field, (0, vue.unref)(evaluateDerivedAgainstItem)(field, String(key), item), item)), 1)) : field.type !== "file" && (0, vue.unref)(isExternalUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
4588
4643
  key: 7,
4589
4644
  href: String(item[key]),
4590
4645
  target: "_blank",
@@ -4592,7 +4647,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4592
4647
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
4593
4648
  "data-testid": `collections-url-link-${key}-${item[collection.value.schema.primaryKey]}`,
4594
4649
  onClick: _cache[17] || (_cache[17] = (0, vue.withModifiers)(() => {}, ["stop"]))
4595
- }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_73)) : field.type === "file" && (0, vue.unref)(artifactUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
4650
+ }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_75)) : field.type === "file" && (0, vue.unref)(artifactUrl)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
4596
4651
  key: 8,
4597
4652
  href: (0, vue.unref)(artifactUrl)(item[key]) ?? void 0,
4598
4653
  target: "_blank",
@@ -4600,17 +4655,17 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4600
4655
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
4601
4656
  "data-testid": `collections-file-link-${key}-${item[collection.value.schema.primaryKey]}`,
4602
4657
  onClick: _cache[18] || (_cache[18] = (0, vue.withModifiers)(() => {}, ["stop"]))
4603
- }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_74)) : field.type === "file" && (0, vue.unref)(fileRoutePath)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
4658
+ }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_76)) : field.type === "file" && (0, vue.unref)(fileRoutePath)(item[key]) ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("a", {
4604
4659
  key: 9,
4605
4660
  href: (0, vue.unref)(fileRoutePath)(item[key]) ?? void 0,
4606
4661
  class: "block truncate text-blue-600 hover:text-blue-800 hover:underline font-semibold",
4607
4662
  "data-testid": `collections-file-link-${key}-${item[collection.value.schema.primaryKey]}`,
4608
4663
  onClick: ($event) => (0, vue.unref)(activatePathLink)($event, (0, vue.unref)(fileRoutePath)(item[key]) ?? "", true)
4609
- }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_75)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_76, (0, vue.toDisplayString)((0, vue.unref)(formatCell)(item[key], field.type)), 1))], 64)) : (0, vue.createCommentVNode)("", true)]);
4610
- }), 128))], 42, _hoisted_62);
4664
+ }, (0, vue.toDisplayString)(String(item[key])), 9, _hoisted_77)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_78, (0, vue.toDisplayString)((0, vue.unref)(formatCell)(item[key], field.type)), 1))], 64)) : (0, vue.createCommentVNode)("", true)]);
4665
+ }), 128))], 42, _hoisted_64);
4611
4666
  }), 128))])])]))]),
4612
4667
  collection.value && (viewing.value || editing.value) && !(calendarActive.value && openDay.value) ? ((0, vue.openBlock)(), (0, vue.createBlock)(CollectionRecordModal_default, {
4613
- key: 2,
4668
+ key: 4,
4614
4669
  onClose: closeRecordModal
4615
4670
  }, {
4616
4671
  default: (0, vue.withCtx)(() => [(0, vue.createVNode)(CollectionRecordPanel_default, {
@@ -4655,7 +4710,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4655
4710
  _: 1
4656
4711
  })) : (0, vue.createCommentVNode)("", true),
4657
4712
  configOpen.value && collection.value ? ((0, vue.openBlock)(), (0, vue.createBlock)(CollectionViewConfigModal_default, {
4658
- key: 3,
4713
+ key: 5,
4659
4714
  slug: collection.value.slug,
4660
4715
  title: collection.value.title,
4661
4716
  views: customViews.value,
@@ -4667,7 +4722,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4667
4722
  "views"
4668
4723
  ])) : (0, vue.createCommentVNode)("", true),
4669
4724
  chatOpen.value && collection.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
4670
- key: 4,
4725
+ key: 6,
4671
4726
  class: "fixed inset-0 z-30 flex items-center justify-center bg-slate-900/60 backdrop-blur-sm p-4 transition-all duration-300",
4672
4727
  role: "dialog",
4673
4728
  "aria-modal": "true",
@@ -4675,19 +4730,19 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4675
4730
  "data-testid": "collections-chat-modal",
4676
4731
  onClick: (0, vue.withModifiers)(closeChat, ["self"]),
4677
4732
  onKeydown: (0, vue.withKeys)(closeChat, ["esc"])
4678
- }, [(0, vue.createElementVNode)("div", _hoisted_77, [
4679
- (0, vue.createElementVNode)("header", _hoisted_78, [
4680
- _cache[47] || (_cache[47] = (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)),
4681
- (0, vue.createElementVNode)("div", _hoisted_79, [(0, vue.createElementVNode)("h2", _hoisted_80, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatTitle")), 1), (0, vue.createElementVNode)("span", _hoisted_81, (0, vue.toDisplayString)(collection.value.title), 1)]),
4733
+ }, [(0, vue.createElementVNode)("div", _hoisted_79, [
4734
+ (0, vue.createElementVNode)("header", _hoisted_80, [
4735
+ _cache[48] || (_cache[48] = (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)),
4736
+ (0, vue.createElementVNode)("div", _hoisted_81, [(0, vue.createElementVNode)("h2", _hoisted_82, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatTitle")), 1), (0, vue.createElementVNode)("span", _hoisted_83, (0, vue.toDisplayString)(collection.value.title), 1)]),
4682
4737
  (0, vue.createElementVNode)("button", {
4683
4738
  type: "button",
4684
4739
  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",
4685
4740
  "aria-label": (0, vue.unref)(t)("common.close"),
4686
4741
  "data-testid": "collections-chat-close",
4687
4742
  onClick: closeChat
4688
- }, [..._cache[46] || (_cache[46] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_82)
4743
+ }, [..._cache[47] || (_cache[47] = [(0, vue.createElementVNode)("span", { class: "material-icons text-lg" }, "close", -1)])], 8, _hoisted_84)
4689
4744
  ]),
4690
- (0, vue.createElementVNode)("div", _hoisted_83, [(0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
4745
+ (0, vue.createElementVNode)("div", _hoisted_85, [(0, vue.withDirectives)((0, vue.createElementVNode)("textarea", {
4691
4746
  ref_key: "chatInputEl",
4692
4747
  ref: chatInputEl,
4693
4748
  "onUpdate:modelValue": _cache[22] || (_cache[22] = ($event) => chatMessage.value = $event),
@@ -4696,8 +4751,8 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4696
4751
  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",
4697
4752
  "data-testid": "collections-chat-input",
4698
4753
  onKeydown: [(0, vue.withKeys)((0, vue.withModifiers)(submitChat, ["meta"]), ["enter"]), (0, vue.withKeys)((0, vue.withModifiers)(submitChat, ["ctrl"]), ["enter"])]
4699
- }, null, 40, _hoisted_84), [[vue.vModelText, chatMessage.value]])]),
4700
- (0, vue.createElementVNode)("footer", _hoisted_85, [(0, vue.createElementVNode)("button", {
4754
+ }, null, 40, _hoisted_86), [[vue.vModelText, chatMessage.value]])]),
4755
+ (0, vue.createElementVNode)("footer", _hoisted_87, [(0, vue.createElementVNode)("button", {
4701
4756
  type: "button",
4702
4757
  class: "h-8 px-2.5 rounded text-xs font-bold text-slate-500 hover:bg-slate-200/50 transition-colors",
4703
4758
  "data-testid": "collections-chat-cancel",
@@ -4708,7 +4763,7 @@ var CollectionView_default = /* @__PURE__ */ (0, vue.defineComponent)({
4708
4763
  disabled: !chatMessage.value.trim(),
4709
4764
  "data-testid": "collections-chat-send",
4710
4765
  onClick: submitChat
4711
- }, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatStart")), 9, _hoisted_86)])
4766
+ }, (0, vue.toDisplayString)((0, vue.unref)(t)("collectionsView.chatStart")), 9, _hoisted_88)])
4712
4767
  ])], 32)) : (0, vue.createCommentVNode)("", true)
4713
4768
  ]);
4714
4769
  };
@@ -5153,8 +5208,10 @@ exports.CollectionsIndexView = CollectionsIndexView_default;
5153
5208
  exports.FeedsView = FeedsView_default;
5154
5209
  exports.PresentCollectionPreview = Preview_default;
5155
5210
  exports.PresentCollectionView = View_default;
5211
+ exports.applicableViewModes = applicableViewModes;
5156
5212
  exports.collectionUi = collectionUi;
5157
5213
  exports.configureCollectionUi = configureCollectionUi;
5214
+ exports.customViewKey = customViewKey;
5158
5215
  exports.plugin = plugin;
5159
5216
  exports.readCollectionSort = readCollectionSort;
5160
5217
  exports.readCollectionViewMode = readCollectionViewMode;