@micacms/editor-ui 0.6.0-rc.2 → 0.7.0
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/THIRD_PARTY_NOTICES.txt +39 -39
- package/dist/assets/ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js +2 -0
- package/dist/assets/ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js.map +1 -0
- package/dist/assets/ChangesView-Dp79M2fs.js +7 -0
- package/dist/assets/ChangesView-Dp79M2fs.js.map +1 -0
- package/dist/assets/CollectionView-D9VSxjMl.js +2 -0
- package/dist/assets/CollectionView-D9VSxjMl.js.map +1 -0
- package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js +2 -0
- package/dist/assets/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DaYRluZs.js.map → ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js.map} +1 -1
- package/dist/assets/DashboardView-BPyKR5J3.js +2 -0
- package/dist/assets/DashboardView-BPyKR5J3.js.map +1 -0
- package/dist/assets/DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js +2 -0
- package/dist/assets/DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js.map +1 -0
- package/dist/assets/EntryView-qKGxmd49.js +2 -0
- package/dist/assets/EntryView-qKGxmd49.js.map +1 -0
- package/dist/assets/{LoginView-BMcE8J5l.js → LoginView-C4FlLD5n.js} +2 -2
- package/dist/assets/{LoginView-BMcE8J5l.js.map → LoginView-C4FlLD5n.js.map} +1 -1
- package/dist/assets/MediaView-C0FP8j4J.js +2 -0
- package/dist/assets/MediaView-C0FP8j4J.js.map +1 -0
- package/dist/assets/NotFoundView-BXXcZp2U.js +2 -0
- package/dist/assets/{NotFoundView-BT-zH9Ky.js.map → NotFoundView-BXXcZp2U.js.map} +1 -1
- package/dist/assets/ObjectField-BFAmw-Bf.js +2 -0
- package/dist/assets/{ObjectField-BHoHeIbi.js.map → ObjectField-BFAmw-Bf.js.map} +1 -1
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js +7 -0
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js.map +1 -0
- package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js +7 -0
- package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js.map +1 -0
- package/dist/assets/RepeaterField-BA5zPM54.js +12 -0
- package/dist/assets/RepeaterField-BA5zPM54.js.map +1 -0
- package/dist/assets/SingletonView-rtsXuJ8F.js +2 -0
- package/dist/assets/SingletonView-rtsXuJ8F.js.map +1 -0
- package/dist/assets/{SystemView-AMhNiUgh.css → SystemView-BBJFvsrr.css} +1 -1
- package/dist/assets/SystemView-CBTTQvCI.js +3 -0
- package/dist/assets/SystemView-CBTTQvCI.js.map +1 -0
- package/dist/assets/arrow-right-CVMfMI8t.js +7 -0
- package/dist/assets/arrow-right-CVMfMI8t.js.map +1 -0
- package/dist/assets/arrow-up-D5CzEqmi.js +12 -0
- package/dist/assets/arrow-up-D5CzEqmi.js.map +1 -0
- package/dist/assets/chevron-down-Cn8dXqbz.js +7 -0
- package/dist/assets/chevron-down-Cn8dXqbz.js.map +1 -0
- package/dist/assets/format-CAimH9FV.js +2 -0
- package/dist/assets/format-CAimH9FV.js.map +1 -0
- package/dist/assets/index-C-WfCDd6.js +118 -0
- package/dist/assets/index-C-WfCDd6.js.map +1 -0
- package/dist/assets/index-CBGzi5Bh.css +1 -0
- package/dist/assets/useUnsavedChanges-CErjJu5S.js +201 -0
- package/dist/assets/useUnsavedChanges-CErjJu5S.js.map +1 -0
- package/dist/index.html +2 -2
- package/package.json +2 -2
- package/dist/assets/ChangesView-B37VddpZ.js +0 -7
- package/dist/assets/ChangesView-B37VddpZ.js.map +0 -1
- package/dist/assets/CollectionView-DMmV03BG.js +0 -2
- package/dist/assets/CollectionView-DMmV03BG.js.map +0 -1
- package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-DaYRluZs.js +0 -2
- package/dist/assets/DashboardView-CslqN0A1.js +0 -2
- package/dist/assets/DashboardView-CslqN0A1.js.map +0 -1
- package/dist/assets/EntryView-CpappvZe.js +0 -2
- package/dist/assets/EntryView-CpappvZe.js.map +0 -1
- package/dist/assets/MediaView-CN7asOkJ.js +0 -2
- package/dist/assets/MediaView-CN7asOkJ.js.map +0 -1
- package/dist/assets/NotFoundView-BT-zH9Ky.js +0 -2
- package/dist/assets/ObjectField-BHoHeIbi.js +0 -2
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-C3ip7WDx.js +0 -7
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-C3ip7WDx.js.map +0 -1
- package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-B276O7Z8.js +0 -7
- package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-B276O7Z8.js.map +0 -1
- package/dist/assets/RepeaterField-CgFHog9l.js +0 -12
- package/dist/assets/RepeaterField-CgFHog9l.js.map +0 -1
- package/dist/assets/SingletonView-BHtlstaz.js +0 -2
- package/dist/assets/SingletonView-BHtlstaz.js.map +0 -1
- package/dist/assets/SystemView-S-i2v0ly.js +0 -3
- package/dist/assets/SystemView-S-i2v0ly.js.map +0 -1
- package/dist/assets/arrow-right-DMhFU3-4.js +0 -7
- package/dist/assets/arrow-right-DMhFU3-4.js.map +0 -1
- package/dist/assets/arrow-up-DeNDcETx.js +0 -12
- package/dist/assets/arrow-up-DeNDcETx.js.map +0 -1
- package/dist/assets/chevron-down-D4nmRhPt.js +0 -7
- package/dist/assets/chevron-down-D4nmRhPt.js.map +0 -1
- package/dist/assets/format-CW--BYT5.js +0 -2
- package/dist/assets/format-CW--BYT5.js.map +0 -1
- package/dist/assets/index-BBFDilFH.js +0 -118
- package/dist/assets/index-BBFDilFH.js.map +0 -1
- package/dist/assets/index-BSYHt4Oa.css +0 -1
- package/dist/assets/useField-DcIPoU4r.js +0 -2
- package/dist/assets/useField-DcIPoU4r.js.map +0 -1
- package/dist/assets/useUnsavedChanges-C4vyxObi.js +0 -145
- package/dist/assets/useUnsavedChanges-C4vyxObi.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as D,o as E,q as P,c as n,i as p,w as g,a as l,s as A,b as m,e as v,t as r,v as U,x as q,F as w,j as V,f as b,r as k,m as G,g as o,k as C,n as B,A as F,p as H,y as I,l as J}from"./index-C-WfCDd6.js";import{_ as K}from"./PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js";import{_ as Q,P as W}from"./ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js";import{p as X}from"./format-CAimH9FV.js";import{A as Y,a as Z}from"./arrow-up-D5CzEqmi.js";const ee={class:"mx-auto max-w-5xl px-4 py-5 sm:px-6"},te={key:1,role:"status",class:"mb-3 text-sm text-muted"},se={class:"mb-3 flex flex-wrap items-center gap-2"},ae=["placeholder","aria-label"],le={class:"card overflow-hidden"},oe={key:0,class:"px-4 py-8 text-center text-sm text-muted"},ne={key:1,class:"px-4 py-12 text-center"},re={class:"text-sm font-medium"},ie={key:2,class:"w-full text-sm"},ce={class:"sr-only"},ue={class:"border-b border-line text-left text-xs text-muted"},de={key:0,scope:"col",class:"px-2 py-2"},me={class:"divide-y divide-line"},pe={class:"px-4 py-2.5"},ve={key:0,class:"ml-2 text-xs text-warning"},fe={class:"block font-mono text-xs text-muted"},he={key:0,class:"px-2 py-2.5"},ye={class:"flex justify-end gap-0.5"},_e=["disabled","onClick"],ge={class:"sr-only"},be=["disabled","onClick"],xe={class:"sr-only"},we={key:1,class:"p-8 text-center text-sm text-muted"},Ne=D({__name:"CollectionView",props:{collection:{}},setup(f){const h=f,R=I(),z=J(),j=H(),y=b(()=>{var i;const e=new Map;let s=0;for(const t of z.edits.value)((i=t.target)==null?void 0:i.kind)!=="entry"||t.target.collection!==h.collection||(t.state==="removed"?s+=1:e.set(t.target.slug,t.state));return{states:e,removed:s}}),u=k([]),L=k(!0),d=k(""),x=k(!1),a=b(()=>R.collection(h.collection)),O=b(()=>{const e=a.value;return e?e.listedFields.filter(s=>s!==e.titleField):[]}),$=b(()=>{const e=d.value.trim().toLowerCase();return e?u.value.filter(s=>s.title.toLowerCase().includes(e)||s.slug.includes(e)||S(s.data).includes(e)):u.value});function S(e){return typeof e=="string"?e.toLowerCase():typeof e=="number"?String(e):Array.isArray(e)?e.map(S).join(" "):e!==null&&typeof e=="object"?Object.values(e).map(S).join(" "):""}async function N(){L.value=!0;try{u.value=(await B.entries.list(h.collection)).items}catch(e){j.error(e instanceof F?e.message:"Could not load the entries.")}finally{L.value=!1}}E(N),P(()=>h.collection,N);async function T(e,s){const i=e+s;if(i<0||i>=u.value.length)return;const t=[...u.value];[t[e],t[i]]=[t[i],t[e]],u.value=t,x.value=!0;try{await B.entries.reorder(h.collection,t.map(c=>c.slug))}catch(c){j.error(c instanceof F?c.message:"Could not save the new order."),await N()}finally{x.value=!1}}const M=b(()=>{var e,s;return(((e=a.value)==null?void 0:e.sortable)??!1)&&!((s=a.value)!=null&&s.readOnly)&&!d.value});return(e,s)=>{const i=G("RouterLink");return a.value?(o(),n(w,{key:0},[p(K,{title:a.value.label,subtitle:a.value.description??`${u.value.length} ${u.value.length===1?"entry":"entries"}`},{default:g(()=>[a.value.readOnly?m("",!0):(o(),A(i,{key:0,to:{name:"entry-new",params:{collection:f.collection}},class:"btn-primary"},{default:g(()=>[p(C(W),{size:16,"aria-hidden":"true"}),v(" New "+r(a.value.labelSingular.toLowerCase()),1)]),_:1},8,["to"]))]),_:1},8,["title","subtitle"]),l("div",ee,[a.value.readOnly?(o(),A(Q,{key:0,reason:a.value.readOnly},null,8,["reason"])):m("",!0),y.value.removed>0?(o(),n("p",te,[v(r(y.value.removed)+" "+r(y.value.removed===1?"entry is":"entries are")+" removed, and still on the website until you ",1),p(i,{to:{name:"changes"},class:"underline"},{default:g(()=>[...s[1]||(s[1]=[v("publish",-1)])]),_:1}),s[2]||(s[2]=v(". ",-1))])):m("",!0),l("div",se,[U(l("input",{"onUpdate:modelValue":s[0]||(s[0]=t=>d.value=t),type:"search",placeholder:`Search ${a.value.label.toLowerCase()}…`,class:"input max-w-64","aria-label":`Search ${a.value.label}`},null,8,ae),[[q,d.value]])]),l("div",le,[L.value?(o(),n("p",oe,"Loading…")):$.value.length===0?(o(),n("div",ne,[l("p",re,r(d.value?`Nothing matches "${d.value}".`:`No ${a.value.label.toLowerCase()} yet.`),1),!d.value&&!a.value.readOnly?(o(),A(i,{key:0,to:{name:"entry-new",params:{collection:f.collection}},class:"btn-primary mt-4"},{default:g(()=>[v(" Create the first "+r(a.value.labelSingular.toLowerCase()),1)]),_:1},8,["to"])):m("",!0)])):(o(),n("table",ie,[l("caption",ce,r(a.value.label),1),l("thead",null,[l("tr",ue,[s[4]||(s[4]=l("th",{scope:"col",class:"px-4 py-2 font-medium"},"Title",-1)),(o(!0),n(w,null,V(O.value,t=>{var c;return o(),n("th",{key:t,scope:"col",class:"hidden px-4 py-2 font-medium md:table-cell"},r(((c=a.value.fields[t])==null?void 0:c.label)??t),1)}),128)),M.value?(o(),n("th",de,[...s[3]||(s[3]=[l("span",{class:"sr-only"},"Reorder",-1)])])):m("",!0)])]),l("tbody",me,[(o(!0),n(w,null,V($.value,(t,c)=>(o(),n("tr",{key:t.slug,class:"transition hover:bg-canvas"},[l("td",pe,[p(i,{to:{name:"entry",params:{collection:f.collection,slug:t.slug}},class:"font-medium hover:underline"},{default:g(()=>[v(r(t.title),1)]),_:2},1032,["to"]),y.value.states.has(t.slug)?(o(),n("span",ve,r(y.value.states.get(t.slug)==="new"?"New":"Changed")+" · not published ",1)):m("",!0),l("span",fe,"/"+r(t.slug),1)]),(o(!0),n(w,null,V(O.value,_=>(o(),n("td",{key:_,class:"hidden px-4 py-2.5 text-muted md:table-cell"},r(C(X)(t.data[_],a.value.fields[_])),1))),128)),M.value?(o(),n("td",he,[l("div",ye,[l("button",{type:"button",class:"btn-ghost px-1 py-0.5",disabled:c===0||x.value,onClick:_=>T(c,-1)},[p(C(Y),{size:16,"aria-hidden":"true"}),l("span",ge,'Move "'+r(t.title)+'" up',1)],8,_e),l("button",{type:"button",class:"btn-ghost px-1 py-0.5",disabled:c===$.value.length-1||x.value,onClick:_=>T(c,1)},[p(C(Z),{size:16,"aria-hidden":"true"}),l("span",xe,'Move "'+r(t.title)+'" down',1)],8,be)])])):m("",!0)]))),128))])]))])])],64)):(o(),n("div",we,' There is no collection called "'+r(f.collection)+'". ',1))}}});export{Ne as default};
|
|
2
|
+
//# sourceMappingURL=CollectionView-D9VSxjMl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollectionView-D9VSxjMl.js","sources":["../../src/views/CollectionView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Collection overview: a filterable list of entries.\n * Columns come from fields marked `listed` in the model.\n *\n * A row says \"New\" or \"Changed\" while the entry has saved changes that are\n * not on the website yet; removed entries are counted above the list.\n */\n\nimport { computed, onMounted, ref, watch } from \"vue\";\nimport { ArrowDown, ArrowUp, Plus } from \"@lucide/vue\";\n\nimport { api, ApiError, type EntrySummary } from \"@/api\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport ReadOnlyNotice from \"@/components/ReadOnlyNotice.vue\";\nimport { previewValue } from \"@/lib/format\";\nimport { useSchema } from \"@/stores/schema\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst props = defineProps<{ collection: string }>();\n\nconst schema = useSchema();\nconst staging = useStaging();\nconst toast = useToast();\n\n/** Each entry's pending state, by slug, and the entries that publishing removes. */\nconst pendingStates = computed(() => {\n const states = new Map<string, \"new\" | \"changed\">();\n let removed = 0;\n for (const edit of staging.edits.value) {\n if (edit.target?.kind !== \"entry\" || edit.target.collection !== props.collection) continue;\n if (edit.state === \"removed\") removed += 1;\n else states.set(edit.target.slug, edit.state);\n }\n return { states, removed };\n});\n\nconst entries = ref<EntrySummary[]>([]);\nconst loading = ref(true);\nconst search = ref(\"\");\nconst reordering = ref(false);\n\nconst definition = computed(() => schema.collection(props.collection));\nconst columns = computed(() => {\n const def = definition.value;\n if (!def) return [];\n // The title already has its own column, so do not repeat it.\n return def.listedFields.filter((key) => key !== def.titleField);\n});\n\nconst matching = computed(() => {\n const term = search.value.trim().toLowerCase();\n if (!term) return entries.value;\n\n // In the browser: the whole collection is already here, and a round trip per\n // keystroke would only add latency.\n return entries.value.filter(\n (entry) =>\n entry.title.toLowerCase().includes(term) ||\n entry.slug.includes(term) ||\n searchableText(entry.data).includes(term),\n );\n});\n\n/** The values of an entry, without its field names: \"title\" must not match every entry. */\nfunction searchableText(value: unknown): string {\n if (typeof value === \"string\") return value.toLowerCase();\n if (typeof value === \"number\") return String(value);\n if (Array.isArray(value)) return value.map(searchableText).join(\" \");\n if (value !== null && typeof value === \"object\") return Object.values(value).map(searchableText).join(\" \");\n return \"\";\n}\n\nasync function load(): Promise<void> {\n loading.value = true;\n try {\n entries.value = (await api.entries.list(props.collection)).items;\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not load the entries.\");\n } finally {\n loading.value = false;\n }\n}\n\nonMounted(load);\nwatch(() => props.collection, load);\n\n/**\n * Manual ordering.\n *\n * The order is a `_order.json` file listing slugs, so moving one entry is a\n * one-line diff rather than a rewrite of every entry in the collection.\n */\nasync function move(index: number, direction: -1 | 1): Promise<void> {\n const target = index + direction;\n if (target < 0 || target >= entries.value.length) return;\n\n const next = [...entries.value];\n [next[index], next[target]] = [next[target]!, next[index]!];\n entries.value = next;\n\n reordering.value = true;\n try {\n await api.entries.reorder(\n props.collection,\n next.map((entry) => entry.slug),\n );\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not save the new order.\");\n await load();\n } finally {\n reordering.value = false;\n }\n}\n\n// Reordering a filtered list would move the wrong neighbours.\nconst canReorder = computed(\n () => (definition.value?.sortable ?? false) && !definition.value?.readOnly && !search.value,\n);\n</script>\n\n<template>\n <template v-if=\"definition\">\n <PageHeader\n :title=\"definition.label\"\n :subtitle=\"\n definition.description ??\n `${entries.length} ${entries.length === 1 ? 'entry' : 'entries'}`\n \"\n >\n <RouterLink v-if=\"!definition.readOnly\" :to=\"{ name: 'entry-new', params: { collection } }\" class=\"btn-primary\">\n <Plus :size=\"16\" aria-hidden=\"true\" />\n New {{ definition.labelSingular.toLowerCase() }}\n </RouterLink>\n </PageHeader>\n\n <div class=\"mx-auto max-w-5xl px-4 py-5 sm:px-6\">\n <ReadOnlyNotice v-if=\"definition.readOnly\" :reason=\"definition.readOnly\" />\n <p v-if=\"pendingStates.removed > 0\" role=\"status\" class=\"mb-3 text-sm text-muted\">\n {{ pendingStates.removed }} {{ pendingStates.removed === 1 ? \"entry is\" : \"entries are\" }} removed, and\n still on the website until you\n <RouterLink :to=\"{ name: 'changes' }\" class=\"underline\">publish</RouterLink>.\n </p>\n <div class=\"mb-3 flex flex-wrap items-center gap-2\">\n <input\n v-model=\"search\"\n type=\"search\"\n :placeholder=\"`Search ${definition.label.toLowerCase()}…`\"\n class=\"input max-w-64\"\n :aria-label=\"`Search ${definition.label}`\"\n />\n </div>\n\n <div class=\"card overflow-hidden\">\n <p v-if=\"loading\" class=\"px-4 py-8 text-center text-sm text-muted\">Loading…</p>\n\n <div v-else-if=\"matching.length === 0\" class=\"px-4 py-12 text-center\">\n <p class=\"text-sm font-medium\">\n {{ search ? `Nothing matches \"${search}\".` : `No ${definition.label.toLowerCase()} yet.` }}\n </p>\n <RouterLink\n v-if=\"!search && !definition.readOnly\"\n :to=\"{ name: 'entry-new', params: { collection } }\"\n class=\"btn-primary mt-4\"\n >\n Create the first {{ definition.labelSingular.toLowerCase() }}\n </RouterLink>\n </div>\n\n <table v-else class=\"w-full text-sm\">\n <caption class=\"sr-only\">{{ definition.label }}</caption>\n <thead>\n <tr class=\"border-b border-line text-left text-xs text-muted\">\n <th scope=\"col\" class=\"px-4 py-2 font-medium\">Title</th>\n <th\n v-for=\"column in columns\"\n :key=\"column\"\n scope=\"col\"\n class=\"hidden px-4 py-2 font-medium md:table-cell\"\n >\n {{ definition.fields[column]?.label ?? column }}\n </th>\n <th v-if=\"canReorder\" scope=\"col\" class=\"px-2 py-2\">\n <span class=\"sr-only\">Reorder</span>\n </th>\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-line\">\n <tr v-for=\"(entry, index) in matching\" :key=\"entry.slug\" class=\"transition hover:bg-canvas\">\n <td class=\"px-4 py-2.5\">\n <RouterLink\n :to=\"{ name: 'entry', params: { collection, slug: entry.slug } }\"\n class=\"font-medium hover:underline\"\n >\n {{ entry.title }}\n </RouterLink>\n <span v-if=\"pendingStates.states.has(entry.slug)\" class=\"ml-2 text-xs text-warning\">\n {{ pendingStates.states.get(entry.slug) === \"new\" ? \"New\" : \"Changed\" }} · not published\n </span>\n <span class=\"block font-mono text-xs text-muted\">/{{ entry.slug }}</span>\n </td>\n\n <td\n v-for=\"column in columns\"\n :key=\"column\"\n class=\"hidden px-4 py-2.5 text-muted md:table-cell\"\n >\n {{ previewValue(entry.data[column], definition.fields[column]) }}\n </td>\n\n <td v-if=\"canReorder\" class=\"px-2 py-2.5\">\n <div class=\"flex justify-end gap-0.5\">\n <button\n type=\"button\"\n class=\"btn-ghost px-1 py-0.5\"\n :disabled=\"index === 0 || reordering\"\n @click=\"move(index, -1)\"\n >\n <ArrowUp :size=\"16\" aria-hidden=\"true\" />\n <span class=\"sr-only\">Move \"{{ entry.title }}\" up</span>\n </button>\n <button\n type=\"button\"\n class=\"btn-ghost px-1 py-0.5\"\n :disabled=\"index === matching.length - 1 || reordering\"\n @click=\"move(index, 1)\"\n >\n <ArrowDown :size=\"16\" aria-hidden=\"true\" />\n <span class=\"sr-only\">Move \"{{ entry.title }}\" down</span>\n </button>\n </div>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </template>\n\n <div v-else class=\"p-8 text-center text-sm text-muted\">\n There is no collection called \"{{ collection }}\".\n </div>\n</template>\n"],"names":["props","__props","schema","useSchema","staging","useStaging","toast","useToast","pendingStates","computed","states","removed","edit","_a","entries","ref","loading","search","reordering","definition","columns","def","key","matching","term","entry","searchableText","value","load","api","error","ApiError","onMounted","watch","move","index","direction","target","next","canReorder","_b","_createElementBlock","_Fragment","_createVNode","PageHeader","_createBlock","_component_RouterLink","_unref","Plus","_createTextVNode","_toDisplayString","_createElementVNode","_hoisted_1","ReadOnlyNotice","_openBlock","_hoisted_2","_cache","_hoisted_3","$event","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_renderList","column","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","previewValue","_hoisted_17","_hoisted_18","ArrowUp","_hoisted_20","ArrowDown","_hoisted_22","_hoisted_23"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as k,q as g,s as v,T as p,c as x,B,a as l,t as d,I as C,E as h,b as w,r as u,g as b,D as E}from"./index-C-WfCDd6.js";const D={id:"confirm-title",class:"text-base font-semibold"},L={id:"confirm-body",class:"mt-2 text-sm text-muted"},T={class:"mt-5 flex justify-end gap-2"},$=["disabled"],K=["disabled"],q=k({__name:"ConfirmDialog",props:{open:{type:Boolean},title:{},confirmLabel:{default:"Confirm"},cancelLabel:{default:"Cancel"},destructive:{type:Boolean,default:!1},busy:{type:Boolean,default:!1}},emits:["confirm","cancel"],setup(t,{emit:m}){const r=t,s=m,i=u(null),f=u(null);let o=null;g(()=>r.open,async n=>{var e;if(!n){o==null||o.focus();return}o=document.activeElement,await E(),(e=f.value)==null||e.focus()});function y(n){if(n.key==="Escape"&&!r.busy&&s("cancel"),n.key!=="Tab"||!i.value)return;const e=i.value.querySelectorAll("button:not([disabled])"),a=e[0],c=e[e.length-1];!a||!c||(n.shiftKey&&document.activeElement===a?(n.preventDefault(),c.focus()):!n.shiftKey&&document.activeElement===c&&(n.preventDefault(),a.focus()))}return(n,e)=>(b(),v(p,{to:"body"},[t.open?(b(),x("div",{key:0,class:"fixed inset-0 z-50 grid place-items-center bg-ink/40 p-4",onClick:e[2]||(e[2]=B(a=>!t.busy&&s("cancel"),["self"])),onKeydown:y},[l("div",{ref_key:"panel",ref:i,role:"alertdialog","aria-modal":"true","aria-labelledby":"confirm-title","aria-describedby":"confirm-body",class:"w-full max-w-md rounded-xl border border-line bg-raised p-5 shadow-2xl"},[l("h2",D,d(t.title),1),l("div",L,[C(n.$slots,"default")]),l("div",T,[l("button",{ref_key:"cancelButton",ref:f,type:"button",class:"btn-secondary",disabled:t.busy,onClick:e[0]||(e[0]=a=>s("cancel"))},d(t.cancelLabel),9,$),l("button",{type:"button",class:h(t.destructive?"btn-danger":"btn-primary"),disabled:t.busy,onClick:e[1]||(e[1]=a=>s("confirm"))},d(t.busy?"Working…":t.confirmLabel),11,K)])],512)],32)):w("",!0)]))}});export{q as _};
|
|
2
|
+
//# sourceMappingURL=ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js","sources":["../../src/components/ConfirmDialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/** Confirmation dialog with focus handling and Escape-to-cancel. */\n\nimport { nextTick, ref, watch } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n open: boolean;\n title: string;\n confirmLabel?: string;\n cancelLabel?: string;\n destructive?: boolean;\n busy?: boolean;\n }>(),\n { confirmLabel: \"Confirm\", cancelLabel: \"Cancel\", destructive: false, busy: false },\n);\n\nconst emit = defineEmits<{ confirm: []; cancel: [] }>();\n\nconst panel = ref<HTMLElement | null>(null);\nconst cancelButton = ref<HTMLButtonElement | null>(null);\nlet previouslyFocused: HTMLElement | null = null;\n\nwatch(\n () => props.open,\n async (open) => {\n if (!open) {\n previouslyFocused?.focus();\n return;\n }\n previouslyFocused = document.activeElement as HTMLElement | null;\n await nextTick();\n // Focus the safe option, not the destructive one.\n cancelButton.value?.focus();\n },\n);\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\" && !props.busy) emit(\"cancel\");\n if (event.key !== \"Tab\" || !panel.value) return;\n\n const focusable = panel.value.querySelectorAll<HTMLElement>(\"button:not([disabled])\");\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) return;\n\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n}\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n v-if=\"open\"\n class=\"fixed inset-0 z-50 grid place-items-center bg-ink/40 p-4\"\n @click.self=\"!busy && emit('cancel')\"\n @keydown=\"onKeydown\"\n >\n <div\n ref=\"panel\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"confirm-title\"\n aria-describedby=\"confirm-body\"\n class=\"w-full max-w-md rounded-xl border border-line bg-raised p-5 shadow-2xl\"\n >\n <h2 id=\"confirm-title\" class=\"text-base font-semibold\">{{ title }}</h2>\n\n <div id=\"confirm-body\" class=\"mt-2 text-sm text-muted\">\n <slot />\n </div>\n\n <div class=\"mt-5 flex justify-end gap-2\">\n <button\n ref=\"cancelButton\"\n type=\"button\"\n class=\"btn-secondary\"\n :disabled=\"busy\"\n @click=\"emit('cancel')\"\n >\n {{ cancelLabel }}\n </button>\n <button\n type=\"button\"\n :class=\"destructive ? 'btn-danger' : 'btn-primary'\"\n :disabled=\"busy\"\n @click=\"emit('confirm')\"\n >\n {{ busy ? \"Working…\" : confirmLabel }}\n </button>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n"],"names":["props","__props","emit","__emit","panel","ref","cancelButton","previouslyFocused","watch","open","nextTick","_a","onKeydown","event","focusable","first","last","_createBlock","_Teleport","_createElementBlock","_cache","_withModifiers","$event","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","_renderSlot","_ctx","_hoisted_3","_hoisted_4","_hoisted_5"],"mappings":"0iBAKA,MAAMA,EAAQC,EAYRC,EAAOC,EAEPC,EAAQC,EAAwB,IAAI,EACpCC,EAAeD,EAA8B,IAAI,EACvD,IAAIE,EAAwC,KAE5CC,EACE,IAAMR,EAAM,KACZ,MAAOS,GAAS,OACd,GAAI,CAACA,EAAM,CACTF,GAAA,MAAAA,EAAmB,QACnB,MACF,CACAA,EAAoB,SAAS,cAC7B,MAAMG,EAAA,GAENC,EAAAL,EAAa,QAAb,MAAAK,EAAoB,OACtB,CAAA,EAGF,SAASC,EAAUC,EAA4B,CAE7C,GADIA,EAAM,MAAQ,UAAY,CAACb,EAAM,QAAW,QAAQ,EACpDa,EAAM,MAAQ,OAAS,CAACT,EAAM,MAAO,OAEzC,MAAMU,EAAYV,EAAM,MAAM,iBAA8B,wBAAwB,EAC9EW,EAAQD,EAAU,CAAC,EACnBE,EAAOF,EAAUA,EAAU,OAAS,CAAC,EACvC,CAACC,GAAS,CAACC,IAEXH,EAAM,UAAY,SAAS,gBAAkBE,GAC/CF,EAAM,eAAA,EACNG,EAAK,MAAA,GACI,CAACH,EAAM,UAAY,SAAS,gBAAkBG,IACvDH,EAAM,eAAA,EACNE,EAAM,MAAA,GAEV,mBAIEE,EA0CWC,EAAA,CA1CD,GAAG,QAAM,CAETjB,EAAA,UADRkB,EAwCM,MAAA,OAtCJ,MAAM,2DACL,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAAC,GAAA,CAAQrB,EAAA,MAAQC,EAAI,QAAA,EAAA,CAAA,MAAA,CAAA,GACzB,UAAAU,CAAA,GAEDW,EAiCM,MAAA,SAhCA,QAAJ,IAAInB,EACJ,KAAK,cACL,aAAW,OACX,kBAAgB,gBAChB,mBAAiB,eACjB,MAAM,wEAAA,GAENmB,EAAuE,KAAvEC,EAAuEC,EAAbxB,EAAA,KAAK,EAAA,CAAA,EAE/DsB,EAEM,MAFNG,EAEM,CADJC,EAAQC,EAAA,OAAA,SAAA,CAAA,GAGVL,EAkBM,MAlBNM,EAkBM,CAjBJN,EAQS,SAAA,SAPH,eAAJ,IAAIjB,EACJ,KAAK,SACL,MAAM,gBACL,SAAUL,EAAA,KACV,uBAAOC,EAAI,QAAA,EAAA,IAETD,EAAA,WAAW,EAAA,EAAA6B,CAAA,EAEhBP,EAOS,SAAA,CANP,KAAK,SACJ,QAAOtB,EAAA,YAAW,aAAA,aAAA,EAClB,SAAUA,EAAA,KACV,uBAAOC,EAAI,SAAA,EAAA,EAETuB,EAAAxB,EAAA,gBAAoBA,EAAA,YAAY,EAAA,GAAA8B,CAAA,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as $,o as V,c as i,i as r,a as e,F as g,j as L,w as m,k as h,b as v,t as a,l as N,r as x,f as _,m as j,g as l,e as y,n as B,A as D,u as E,p as G}from"./index-C-WfCDd6.js";import{_ as M}from"./DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js";import{_ as R}from"./PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js";const S={class:"mx-auto max-w-5xl space-y-6 px-4 py-6 sm:px-6"},T={key:0,class:"text-sm text-muted"},A={"aria-labelledby":"content-heading"},F={class:"grid grid-cols-2 gap-3 lg:grid-cols-4"},H={class:"text-sm text-muted"},O={class:"mt-1 text-[30px] font-light leading-9 tabular-nums"},U={class:"mt-1 text-xs text-muted"},W={class:"mt-1 text-[30px] font-light leading-9 tabular-nums"},q={class:"mt-1 text-xs text-muted"},z={key:0,role:"alert",class:"rounded-md border border-warning/15 bg-warning-soft p-4","aria-labelledby":"conflicts-heading"},I={class:"flex flex-wrap items-center justify-between gap-3"},J={key:1,class:"card p-4","aria-labelledby":"pending-heading"},K={class:"flex flex-wrap items-center justify-between gap-3"},P={id:"pending-heading",class:"text-sm font-semibold"},Q={class:"card p-4","aria-labelledby":"storage-heading"},X={class:"break-all font-mono"},se=$({__name:"DashboardView",setup(Y){const w=E(),p=N(),k=G(),o=x(null),b=x(!0),C=_(()=>{var d,u;const s=(u=(d=w.identity.value)==null?void 0:d.name)==null?void 0:u.split(" ")[0];if(!s)return"Overview";const t=new Date().getHours();return`${t<12?"Good morning":t<18?"Good afternoon":"Good evening"}, ${s}`}),f=_(()=>{var s;return(((s=o.value)==null?void 0:s.collections)??[]).reduce((t,n)=>t+n.total,0)});return V(async()=>{try{o.value=await B.overview()}catch(s){k.error(s instanceof D?s.message:"Could not load the overview.")}finally{b.value=!1}}),(s,t)=>{var d,u;const n=j("RouterLink");return l(),i(g,null,[r(R,{title:C.value,subtitle:o.value?`${f.value} entr${f.value===1?"y":"ies"}`:void 0},null,8,["title","subtitle"]),e("div",S,[b.value?(l(),i("p",T,"Loading…")):o.value?(l(),i(g,{key:1},[e("section",A,[t[1]||(t[1]=e("h2",{id:"content-heading",class:"sr-only"},"Content",-1)),e("ul",F,[(l(!0),i(g,null,L(o.value.collections,c=>(l(),i("li",{key:c.name},[r(n,{to:{name:"collection",params:{collection:c.name}},class:"card block p-4 transition hover:border-line-strong hover:bg-raised"},{default:m(()=>[e("p",H,a(c.label),1),e("p",O,a(c.total),1),e("p",U,a(c.total===1?"entry":"entries"),1)]),_:2},1032,["to"])]))),128)),e("li",null,[r(n,{to:{name:"media"},class:"card block p-4 transition hover:border-line-strong hover:bg-raised"},{default:m(()=>[t[0]||(t[0]=e("p",{class:"text-sm text-muted"},"Media",-1)),e("p",W,a(o.value.media.files),1),e("p",q,a(o.value.media.readable),1)]),_:1})])])]),(((u=(d=h(p).status.value)==null?void 0:d.sync)==null?void 0:u.conflicts.length)??0)>0?(l(),i("section",z,[e("div",I,[t[3]||(t[3]=e("div",null,[e("h2",{id:"conflicts-heading",class:"text-sm font-semibold text-warning"}," Changed on the website while you edited "),e("p",{class:"mt-1 text-sm text-muted"}," Choose a version for each. Until then, nothing can be published. ")],-1)),r(n,{to:{name:"changes"},class:"btn-secondary"},{default:m(()=>[...t[2]||(t[2]=[y("Choose versions",-1)])]),_:1})])])):v("",!0),h(p).editCount.value>0?(l(),i("section",J,[e("div",K,[e("div",null,[e("h2",P,a(h(p).editCount.value)+" saved change"+a(h(p).editCount.value===1?"":"s")+" not on the website yet ",1),t[4]||(t[4]=e("p",{class:"mt-1 text-sm text-muted"}," Choose which of them to publish. The others stay saved. ",-1))]),r(n,{to:{name:"changes"},class:"btn-secondary"},{default:m(()=>[...t[5]||(t[5]=[y("Review and publish",-1)])]),_:1})])])):v("",!0),e("section",Q,[t[6]||(t[6]=e("h2",{id:"storage-heading",class:"text-sm font-semibold"},"Where your content is kept",-1)),t[7]||(t[7]=e("p",{class:"mt-2 text-sm text-muted"}," Every entry and every uploaded file is kept as a file next to the website's code when it is published, so the website can be rebuilt from these files alone — with or without Mica. ",-1)),r(M,null,{default:m(()=>[e("p",X,a(o.value.repository),1)]),_:1})])],64)):v("",!0)])],64)}}});export{se as default};
|
|
2
|
+
//# sourceMappingURL=DashboardView-BPyKR5J3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardView-BPyKR5J3.js","sources":["../../src/views/DashboardView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Dashboard: counts, where the content lives, and the pending changes.\n * No \"Rebuild website\" button: the published commit triggers the repository's own pipeline.\n * No \"recently edited\" list: only the repository's history can say that truthfully.\n */\n\nimport { computed, onMounted, ref } from \"vue\";\n\nimport { api, ApiError, type Overview } from \"@/api\";\nimport DeveloperDetails from \"@/components/DeveloperDetails.vue\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport { useSession } from \"@/stores/session\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst session = useSession();\nconst staging = useStaging();\nconst toast = useToast();\n\nconst overview = ref<Overview | null>(null);\nconst loading = ref(true);\n\n/** Greets by name only when the provider gave one; local mode has no user. */\nconst greeting = computed(() => {\n const name = session.identity.value?.name?.split(\" \")[0];\n if (!name) return \"Overview\";\n\n const hour = new Date().getHours();\n const part = hour < 12 ? \"Good morning\" : hour < 18 ? \"Good afternoon\" : \"Good evening\";\n return `${part}, ${name}`;\n});\n\nconst entries = computed(() =>\n (overview.value?.collections ?? []).reduce((total, item) => total + item.total, 0),\n);\n\nonMounted(async () => {\n try {\n overview.value = await api.overview();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not load the overview.\");\n } finally {\n loading.value = false;\n }\n});\n</script>\n\n<template>\n <PageHeader\n :title=\"greeting\"\n :subtitle=\"overview ? `${entries} entr${entries === 1 ? 'y' : 'ies'}` : undefined\"\n />\n\n <div class=\"mx-auto max-w-5xl space-y-6 px-4 py-6 sm:px-6\">\n <p v-if=\"loading\" class=\"text-sm text-muted\">Loading…</p>\n\n <template v-else-if=\"overview\">\n <section aria-labelledby=\"content-heading\">\n <h2 id=\"content-heading\" class=\"sr-only\">Content</h2>\n\n <ul class=\"grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <li v-for=\"collection in overview.collections\" :key=\"collection.name\">\n <RouterLink\n :to=\"{ name: 'collection', params: { collection: collection.name } }\"\n class=\"card block p-4 transition hover:border-line-strong hover:bg-raised\"\n >\n <p class=\"text-sm text-muted\">{{ collection.label }}</p>\n <p class=\"mt-1 text-[30px] font-light leading-9 tabular-nums\">{{ collection.total }}</p>\n <p class=\"mt-1 text-xs text-muted\">\n {{ collection.total === 1 ? \"entry\" : \"entries\" }}\n </p>\n </RouterLink>\n </li>\n\n <li>\n <RouterLink :to=\"{ name: 'media' }\" class=\"card block p-4 transition hover:border-line-strong hover:bg-raised\">\n <p class=\"text-sm text-muted\">Media</p>\n <p class=\"mt-1 text-[30px] font-light leading-9 tabular-nums\">{{ overview.media.files }}</p>\n <p class=\"mt-1 text-xs text-muted\">{{ overview.media.readable }}</p>\n </RouterLink>\n </li>\n </ul>\n </section>\n\n <section\n v-if=\"(staging.status.value?.sync?.conflicts.length ?? 0) > 0\"\n role=\"alert\"\n class=\"rounded-md border border-warning/15 bg-warning-soft p-4\"\n aria-labelledby=\"conflicts-heading\"\n >\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h2 id=\"conflicts-heading\" class=\"text-sm font-semibold text-warning\">\n Changed on the website while you edited\n </h2>\n <p class=\"mt-1 text-sm text-muted\">\n Choose a version for each. Until then, nothing can be published.\n </p>\n </div>\n <RouterLink :to=\"{ name: 'changes' }\" class=\"btn-secondary\">Choose versions</RouterLink>\n </div>\n </section>\n\n <section\n v-if=\"staging.editCount.value > 0\"\n class=\"card p-4\"\n aria-labelledby=\"pending-heading\"\n >\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h2 id=\"pending-heading\" class=\"text-sm font-semibold\">\n {{ staging.editCount.value }} saved change{{ staging.editCount.value === 1 ? \"\" : \"s\" }}\n not on the website yet\n </h2>\n <p class=\"mt-1 text-sm text-muted\">\n Choose which of them to publish. The others stay saved.\n </p>\n </div>\n <RouterLink :to=\"{ name: 'changes' }\" class=\"btn-secondary\">Review and publish</RouterLink>\n </div>\n </section>\n\n <section class=\"card p-4\" aria-labelledby=\"storage-heading\">\n <h2 id=\"storage-heading\" class=\"text-sm font-semibold\">Where your content is kept</h2>\n\n <p class=\"mt-2 text-sm text-muted\">\n Every entry and every uploaded file is kept as a file next to the website's code when it\n is published, so the website can be rebuilt from these files alone — with or without Mica.\n </p>\n\n <DeveloperDetails>\n <p class=\"break-all font-mono\">{{ overview.repository }}</p>\n </DeveloperDetails>\n </section>\n </template>\n </div>\n</template>\n"],"names":["session","useSession","staging","useStaging","toast","useToast","overview","ref","loading","greeting","computed","name","_b","_a","hour","entries","total","item","onMounted","api","error","ApiError","_createVNode","PageHeader","_createElementVNode","_hoisted_1","_createElementBlock","_hoisted_2","_Fragment","_hoisted_3","_hoisted_4","_openBlock","_renderList","collection","_component_RouterLink","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_cache","_hoisted_8","_hoisted_9","_unref","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","DeveloperDetails","_hoisted_16"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as o,c as a,a as s,I as r,g as n}from"./index-C-WfCDd6.js";const l={class:"mt-2 text-xs text-muted"},c={class:"mt-1 space-y-1"},p=o({__name:"DeveloperDetails",setup(d){return(t,e)=>(n(),a("details",l,[e[0]||(e[0]=s("summary",{class:"cursor-pointer select-none"},"Details for developers",-1)),s("div",c,[r(t.$slots,"default")])]))}});export{p as _};
|
|
2
|
+
//# sourceMappingURL=DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js","sources":["../../src/components/DeveloperDetails.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * The technical side of a message, closed by default: editors read the plain\n * words around it, and a developer opens this for the Git terms.\n */\n</script>\n\n<template>\n <details class=\"mt-2 text-xs text-muted\">\n <summary class=\"cursor-pointer select-none\">Details for developers</summary>\n <div class=\"mt-1 space-y-1\"><slot /></div>\n </details>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_renderSlot","_ctx"],"mappings":"+LAQEA,EAAA,EAAAC,EAGU,UAHVC,EAGU,CAFRC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAA4E,UAAA,CAAnE,MAAM,4BAAA,EAA6B,yBAAsB,EAAA,GAClEA,EAA0C,MAA1CC,EAA0C,CAAdC,EAAQC,EAAA,OAAA,SAAA,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as fe,q as ge,o as me,c as r,i as N,w as Y,a as o,F,s as P,k,b as c,t as u,v as ye,z as pe,e as H,B as he,f as m,r as f,n as x,A as $,m as be,C as ke,y as we,l as xe,p as $e,D as te,g as a,E as Ce,j as _e,h as Le,G as Se}from"./index-C-WfCDd6.js";import{_ as Re}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js";import{u as Ue,a as De,b as Ve,_ as Oe,c as Te,d as Ne,e as Fe,f as Me,g as Ee,h as se,i as Ae,j as Be,M as Pe}from"./useUnsavedChanges-CErjJu5S.js";import{_ as je}from"./PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js";import{_ as Ie}from"./ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js";import"./ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js";import"./format-CAimH9FV.js";import"./arrow-right-CVMfMI8t.js";const qe=["disabled"],ze={class:"mx-auto max-w-3xl px-4 py-6 sm:px-6"},Ke={key:0,class:"text-sm text-muted"},Ge={key:2,role:"alert",class:"mb-5 rounded-md border border-warning/15 bg-warning-soft p-4"},Ye={key:5,role:"status",class:"mb-5 rounded-md border border-line bg-subtle p-4"},He={class:"text-sm font-medium"},Je={class:"mt-1 text-xs text-muted"},Qe={key:0,class:"mt-1 text-xs text-warning"},We={class:"mt-2 flex items-center gap-2 text-xs"},Xe={key:1,class:"mt-1 text-xs text-warning"},Ze={key:0,type:"submit",class:"sr-only"},et={key:6,class:"mt-10 border-t border-line pt-5"},tt={key:0,class:"mt-3 rounded-md border border-warning/15 bg-warning-soft p-4"},st={class:"text-sm font-medium text-warning"},lt={class:"mt-1 list-inside list-disc text-xs"},at={key:1,class:"p-8 text-center text-sm text-muted"},ft=fe({__name:"EntryView",props:{collection:{},slug:{}},setup(C){const s=C,J=Le(),S=ke(),Q=we(),R=xe(),d=$e(),n=m(()=>Q.collection(s.collection)),W=f(null),v=f({}),j=f(!0),_=f(!1),w=f("none"),y=f(null),M=f(!1),le=m(()=>{var t,e;return(((e=(t=R.status.value)==null?void 0:t.sync)==null?void 0:e.conflicts)??[]).some(h=>{var b;return((b=h.target)==null?void 0:b.kind)==="entry"&&h.target.collection===s.collection&&h.target.slug===s.slug})}),L=f([]);function I(t){var e;return t.kind==="entry"?`${t.title} (${((e=Q.collection(t.collection))==null?void 0:e.label)??t.collection})`:t.title}const U=m(()=>{var e;const t=v.value[((e=n.value)==null?void 0:e.slugField)??""];return typeof t=="string"?t.trim():""}),q=m(()=>!!s.slug&&U.value!==""&&U.value!==s.slug),g=f(null);Se(Pe,m(()=>s.slug?{path:`${s.collection}/${s.slug}/media`,isNew:!1}:Be(U.value)?{path:`${s.collection}/${U.value}/media`,isNew:!0}:null));const D=f(!0);ge(q,async t=>{if(!(!t||g.value!==null||!s.slug))try{g.value=(await x.entries.references(s.collection,s.slug)).references}catch{g.value=[]}});const V=f(null),O=Ue(()=>{var t;return(t=n.value)==null?void 0:t.fields},v),E=O.issues,T=De(v),A=T.dirty,p=Ve(()=>`${s.collection}/${s.slug??":new"}`,v,V,A),z=m(()=>!s.slug),K=m(()=>s.slug&&R.edits.value.find(t=>t.key===`entry:${s.collection}/${s.slug}`)||null),X=m(()=>z.value?{label:"Not saved yet",tone:"border-accent bg-accent-soft text-accent"}:A.value?{label:"Unsaved changes",tone:"border-accent bg-accent-soft text-accent"}:K.value?{label:"Saved · not published",tone:"text-warning"}:R.knowsPublished.value?{label:"Published",tone:"text-success"}:{label:"Saved",tone:"text-muted"}),Z=m(()=>{const t=n.value;if(!t)return"Entry";const e=v.value[t.titleField];return typeof e=="string"&&e.trim()?e.trim():z.value?`New ${t.labelSingular.toLowerCase()}`:"Untitled"}),ae=m(()=>{var t;return((t=W.value)==null?void 0:t.path)??"Not saved yet"});function ne(t){W.value=t,v.value=structuredClone(t.data),V.value=t.revision,O.reset(),w.value="none",y.value=null,g.value=null,D.value=!0,T.markClean()}async function B(t){ne(await x.entries.get(s.collection,t))}me(async()=>{const t=n.value;if(!t){j.value=!1;return}try{s.slug?await B(s.slug):(v.value=Ae(t.fields),V.value=null,T.markClean())}catch(e){d.error(e instanceof $?e.message:"Could not open this entry."),await S.replace({name:"collection",params:{collection:s.collection}})}finally{j.value=!1}if(p.check(),typeof J.query.field=="string"){const e=J.query.field;await te(),se(e)}});function oe(t){const e=Ee(t.target);e&&O.leave(e)}async function ee(){await te(),E.value[0]&&se(E.value[0].path)}async function G(t={}){var b;if((b=n.value)!=null&&b.readOnly)return;if(!O.checkAll()){d.error("Some fields need attention before you can save."),await ee();return}_.value=!0;const e=t.keepMine===!0&&y.value!==null,h={data:v.value,revision:e?y.value.revision:V.value,...e?{keepMine:e}:{},...q.value&&D.value?{updateLinks:!0}:{}};try{const l=s.slug?await x.entries.update(s.collection,s.slug,h):await x.entries.create(s.collection,h);if(T.markClean(),p.forget(),d.success(l.renamed?`Saved as “${l.slug}”.`:"Saved.",l.relinked>0?`Updated the links in ${l.relinked} other entr${l.relinked===1?"y or page":"ies or pages"}.`:void 0),R.refresh(),l.slug!==s.slug){await S.replace({name:"entry",params:{collection:s.collection,slug:l.slug}});return}await B(l.slug)}catch(l){l instanceof $&&l.status===409&&!s.slug?d.error("An entry with this URL exists already. Change the URL, then save."):l instanceof $&&l.status===409?await ie(s.slug,l.message):l instanceof $&&l.issues.length>0?(O.set(l.issues),d.error(l.message,`${l.issues.length} field(s) need attention.`),await ee()):d.error(l instanceof $?l.message:"Could not save this entry.")}finally{_.value=!1}}async function ie(t,e){w.value="loading";try{y.value=await x.entries.get(s.collection,t),w.value="loaded",y.value.revision===V.value&&(w.value="none",y.value=null,d.error(e))}catch{y.value=null,w.value="missing"}}async function re(){if(s.slug)try{await B(s.slug),p.forget(),d.success("Loaded their version.")}catch(t){d.error(t instanceof $?t.message:"Could not load this entry.")}}async function ue(t){var e;p.forget(),t.state==="new"?await S.replace({name:"collection",params:{collection:s.collection}}):((e=t.target)==null?void 0:e.kind)==="entry"&&t.target.from?await S.replace({name:"entry",params:{collection:s.collection,slug:t.target.from}}):s.slug&&await B(s.slug)}async function ce(){if(L.value=[],s.slug)try{const{references:t}=await x.entries.references(s.collection,s.slug);L.value=t.map(I)}catch{}M.value=!0}async function de(){if(s.slug)try{await x.entries.remove(s.collection,s.slug),T.release(),d.success("Deleted."),R.refresh(),await S.replace({name:"collection",params:{collection:s.collection}})}catch(t){d.error(t instanceof $?t.message:"Could not delete this entry.")}finally{M.value=!1}}return(t,e)=>{var b,l;const h=be("RouterLink");return n.value?(a(),r(F,{key:0},[N(je,{title:Z.value,subtitle:ae.value,back:{name:"collection",params:{collection:C.collection}},"back-label":n.value.label},{default:Y(()=>[n.value.readOnly?c("",!0):(a(),r(F,{key:0},[o("span",{class:Ce(["badge",X.value.tone])},[e[8]||(e[8]=o("span",{class:"h-1.5 w-1.5 rounded-full bg-current","aria-hidden":"true"},null,-1)),H(" "+u(X.value.label),1)],2),o("button",{type:"button",class:"btn-primary",disabled:_.value||!k(A),onClick:e[0]||(e[0]=i=>G())},u(_.value?"Saving…":"Save changes"),9,qe)],64))]),_:1},8,["title","subtitle","back","back-label"]),o("div",ze,[j.value?(a(),r("p",Ke,"Loading…")):(a(),r(F,{key:1},[n.value.readOnly?(a(),P(Ie,{key:0,reason:n.value.readOnly},null,8,["reason"])):K.value&&!k(A)?(a(),P(Oe,{key:1,edit:K.value,onDiscarded:ue},null,8,["edit"])):c("",!0),le.value?(a(),r("div",Ge,[e[10]||(e[10]=o("p",{class:"text-sm font-medium text-warning"},"This entry was changed on the website while you edited",-1)),e[11]||(e[11]=o("p",{class:"mt-1 text-xs text-muted"}," Your saved version is kept. Choose which version to publish on the Publish page. ",-1)),N(h,{to:{name:"changes"},class:"btn-secondary mt-2.5 inline-flex"},{default:Y(()=>[...e[9]||(e[9]=[H("Choose a version",-1)])]),_:1})])):c("",!0),w.value!=="none"?(a(),P(Te,{key:3,state:w.value,theirs:((b=y.value)==null?void 0:b.data)??null,mine:v.value,fields:n.value.fields,busy:_.value,onKeep:e[1]||(e[1]=i=>G({keepMine:!0})),onTake:re},null,8,["state","theirs","mine","fields","busy"])):c("",!0),k(p).offered.value?(a(),P(Ne,{key:4,at:k(p).offered.value.at,onRestore:e[2]||(e[2]=i=>k(p).restore()),onForget:e[3]||(e[3]=i=>k(p).forget())},null,8,["at"])):c("",!0),N(Fe,{issues:k(E)},null,8,["issues"]),q.value?(a(),r("div",Ye,[o("p",He,"The URL changes from “"+u(C.slug)+"” to “"+u(U.value)+"” when you save",1),(l=g.value)!=null&&l.length?(a(),r(F,{key:0},[o("p",Je,u(g.value.length)+" other entr"+u(g.value.length===1?"y or page links":"ies or pages link")+" to it: "+u(g.value.map(I).join(", "))+". ",1),g.value.some(i=>i.readOnly)?(a(),r("p",Qe," This version of Mica cannot change "+u(g.value.filter(i=>i.readOnly).map(I).join(", "))+". Their links keep the old URL until a developer changes them. ",1)):c("",!0),o("label",We,[ye(o("input",{"onUpdate:modelValue":e[4]||(e[4]=i=>D.value=i),type:"checkbox",class:"h-4 w-4"},null,512),[[pe,D.value]]),e[12]||(e[12]=H(" Update their links when I save ",-1))]),D.value?c("",!0):(a(),r("p",Xe," Their links then point to a URL that does not exist, and Publish waits until they are changed. "))],64)):c("",!0),e[13]||(e[13]=o("p",{class:"mt-1 text-xs text-muted"}," Visitors who use the old URL, from a bookmark or a search engine, need a redirect. Ask the developer of the website for one. ",-1))])):c("",!0),o("form",{novalidate:"",onSubmit:e[6]||(e[6]=he(i=>G(),["prevent"])),onFocusout:oe},[N(Me,{modelValue:v.value,"onUpdate:modelValue":e[5]||(e[5]=i=>v.value=i),fields:n.value.fields,issues:k(E),disabled:_.value||!!n.value.readOnly,collection:C.collection,"entry-slug":C.slug},null,8,["modelValue","fields","issues","disabled","collection","entry-slug"]),n.value.readOnly?c("",!0):(a(),r("button",Ze,"Save"))],32),!z.value&&!n.value.readOnly?(a(),r("div",et,[o("button",{type:"button",class:"btn-danger",onClick:ce}," Delete this "+u(n.value.labelSingular.toLowerCase()),1)])):c("",!0)],64))]),N(Re,{open:M.value,title:`Delete “${Z.value}”?`,"confirm-label":"Delete",destructive:"",onCancel:e[7]||(e[7]=i=>M.value=!1),onConfirm:de},{default:Y(()=>[e[14]||(e[14]=o("p",null," Like any change, the removal is saved first, and the entry leaves the website when you publish. ",-1)),L.value.length?(a(),r("div",tt,[o("p",st,u(L.value.length)+" other entr"+u(L.value.length===1?"y or page links":"ies or pages link")+" to this one: ",1),o("ul",lt,[(a(!0),r(F,null,_e(L.value,(i,ve)=>(a(),r("li",{key:ve},u(i),1))),128))])])):c("",!0)]),_:1},8,["open","title"])],64)):(a(),r("div",at,' There is no collection called "'+u(C.collection)+'". ',1))}}});export{ft as default};
|
|
2
|
+
//# sourceMappingURL=EntryView-qKGxmd49.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryView-qKGxmd49.js","sources":["../../src/views/EntryView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Entry editor. Saved is not Published: a save joins the pending changes, and\n * unsaved work stays in the form. `revision` goes back with the save, so a\n * concurrent save gets a 409 instead of an overwrite. The slug is the address:\n * changing it moves the entry, and the route follows.\n */\n\nimport { computed, nextTick, onMounted, provide, ref, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\n\nimport { defaultValues, isValidSlug } from \"@micacms/core\";\n\nimport { api, ApiError, type EntryDetail, type Referrer } from \"@/api\";\nimport ConfirmDialog from \"@/components/ConfirmDialog.vue\";\nimport FieldList from \"@/components/fields/FieldList.vue\";\nimport IssueSummary from \"@/components/IssueSummary.vue\";\nimport KeptChangesNotice from \"@/components/KeptChangesNotice.vue\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport PendingNotice from \"@/components/PendingNotice.vue\";\nimport type { Edit } from \"@/lib/edits\";\nimport ReadOnlyNotice from \"@/components/ReadOnlyNotice.vue\";\nimport SaveConflict from \"@/components/SaveConflict.vue\";\nimport { fieldPathOf, useFormIssues } from \"@/composables/useFormIssues\";\nimport { useKeptChanges } from \"@/composables/useKeptChanges\";\nimport { useUnsavedChanges } from \"@/composables/useUnsavedChanges\";\nimport { focusField } from \"@/lib/focus\";\nimport { MEDIA_FOLDER } from \"@/lib/media-folder\";\nimport { useSchema } from \"@/stores/schema\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst props = defineProps<{ collection: string; slug?: string }>();\n\nconst route = useRoute();\nconst router = useRouter();\nconst schema = useSchema();\nconst staging = useStaging();\nconst toast = useToast();\n\nconst definition = computed(() => schema.collection(props.collection));\n\nconst entry = ref<EntryDetail | null>(null);\nconst values = ref<Record<string, unknown>>({});\nconst loading = ref(true);\nconst saving = ref(false);\n/** A colleague saved since this form opened: their version, for the comparison. */\nconst conflict = ref<\"none\" | \"loading\" | \"loaded\" | \"missing\">(\"none\");\nconst theirs = ref<EntryDetail | null>(null);\nconst confirmDelete = ref(false);\n\n/** This entry was changed on the website while it has a draft here: Mica's own clone only. */\nconst websiteConflict = computed(() =>\n (staging.status.value?.sync?.conflicts ?? []).some(\n (item) =>\n item.target?.kind === \"entry\" && item.target.collection === props.collection && item.target.slug === props.slug,\n ),\n);\nconst references = ref<string[]>([]);\n\n/** An entry or settings page that links here, as the editor knows it: \"Haus A (Projects)\". */\nfunction describeReferrer(item: Referrer): string {\n return item.kind === \"entry\" ? `${item.title} (${schema.collection(item.collection)?.label ?? item.collection})` : item.title;\n}\n\n/** The URL in the form, when it differs from the saved one: the links to this entry must follow. */\nconst newSlug = computed(() => {\n const value = values.value[definition.value?.slugField ?? \"\"];\n return typeof value === \"string\" ? value.trim() : \"\";\n});\nconst urlChanging = computed(() => !!props.slug && newSlug.value !== \"\" && newSlug.value !== props.slug);\nconst linkers = ref<Referrer[] | null>(null);\n\n// Uploads go into the entry's folder: the saved URL's, or for a new entry a valid URL in the form.\nprovide(\n MEDIA_FOLDER,\n computed(() => {\n if (props.slug) return { path: `${props.collection}/${props.slug}/media`, isNew: false };\n return isValidSlug(newSlug.value) ? { path: `${props.collection}/${newSlug.value}/media`, isNew: true } : null;\n }),\n);\nconst updateLinks = ref(true);\n\nwatch(urlChanging, async (changing) => {\n if (!changing || linkers.value !== null || !props.slug) return;\n try {\n linkers.value = (await api.entries.references(props.collection, props.slug)).references;\n } catch {\n // The notice is a courtesy; Publish refuses a broken link in any case.\n linkers.value = [];\n }\n});\n\n/**\n * The version this form was opened against; `null` on a new entry, so a\n * duplicate slug is a conflict.\n */\nconst revision = ref<string | null>(null);\n\nconst form = useFormIssues(() => definition.value?.fields, values);\nconst issues = form.issues;\n\nconst unsaved = useUnsavedChanges(values);\nconst dirty = unsaved.dirty;\n// Kept in this tab, so that signing in again after the session ended loses nothing.\n// \":new\" is no valid URL, so it never names a saved entry.\nconst kept = useKeptChanges(() => `${props.collection}/${props.slug ?? \":new\"}`, values, revision, dirty);\n\nconst isNew = computed(() => !props.slug);\n\n/** This entry's saved changes that are not on the website yet. */\nconst pending = computed(\n () => (props.slug && staging.edits.value.find((edit) => edit.key === `entry:${props.collection}/${props.slug}`)) || null,\n);\n\nconst state = computed(() =>\n isNew.value\n ? { label: \"Not saved yet\", tone: \"border-accent bg-accent-soft text-accent\" }\n : dirty.value\n ? { label: \"Unsaved changes\", tone: \"border-accent bg-accent-soft text-accent\" }\n : pending.value\n ? { label: \"Saved · not published\", tone: \"text-warning\" }\n : staging.knowsPublished.value\n ? { label: \"Published\", tone: \"text-success\" }\n : { label: \"Saved\", tone: \"text-muted\" },\n);\n\nconst title = computed(() => {\n const def = definition.value;\n if (!def) return \"Entry\";\n const value = values.value[def.titleField];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n return isNew.value ? `New ${def.labelSingular.toLowerCase()}` : \"Untitled\";\n});\n\n/**\n * Where this entry lives, from the server: a directory with rich text or media,\n * else one `.json` file.\n */\nconst location = computed(() => entry.value?.path ?? \"Not saved yet\");\n\nfunction setBaseline(detail: EntryDetail): void {\n entry.value = detail;\n values.value = structuredClone(detail.data);\n revision.value = detail.revision;\n form.reset();\n conflict.value = \"none\";\n theirs.value = null;\n linkers.value = null;\n updateLinks.value = true;\n unsaved.markClean();\n}\n\nasync function open(slug: string): Promise<void> {\n setBaseline(await api.entries.get(props.collection, slug));\n}\n\nonMounted(async () => {\n const def = definition.value;\n if (!def) {\n loading.value = false;\n return;\n }\n\n try {\n if (props.slug) {\n await open(props.slug);\n } else {\n // A fresh entry starts as a full skeleton so every input is bound. The\n // skeleton itself is not an edit, so it becomes the baseline.\n values.value = defaultValues(def.fields);\n revision.value = null;\n unsaved.markClean();\n }\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not open this entry.\");\n await router.replace({ name: \"collection\", params: { collection: props.collection } });\n } finally {\n loading.value = false;\n }\n kept.check();\n\n // From a problem on the Publish page: go to its field.\n if (typeof route.query.field === \"string\") {\n const field = route.query.field;\n await nextTick();\n focusField(field);\n }\n});\n\n/** Checks a field when the editor leaves it. */\nfunction onLeave(event: FocusEvent): void {\n const path = fieldPathOf(event.target);\n if (path) form.leave(path);\n}\n\n/** Shows the problems and moves to the first one. */\nasync function showIssues(): Promise<void> {\n await nextTick();\n if (issues.value[0]) focusField(issues.value[0].path);\n}\n\n/** `keepMine`: save over the colleague's version that the conflict showed. */\nasync function save(options: { keepMine?: boolean } = {}): Promise<void> {\n if (definition.value?.readOnly) return;\n if (!form.checkAll()) {\n toast.error(\"Some fields need attention before you can save.\");\n await showIssues();\n return;\n }\n saving.value = true;\n\n const keepMine = options.keepMine === true && theirs.value !== null;\n const payload = {\n data: values.value,\n revision: keepMine ? theirs.value!.revision : revision.value,\n ...(keepMine ? { keepMine } : {}),\n // Also before the list has loaded, or when it failed: the server finds the links itself.\n ...(urlChanging.value && updateLinks.value ? { updateLinks: true } : {}),\n };\n\n try {\n const saved = props.slug\n ? await api.entries.update(props.collection, props.slug, payload)\n : await api.entries.create(props.collection, payload);\n\n // The server derives and de-duplicates the slug and can move the entry:\n // re-open at what it decided.\n unsaved.markClean();\n kept.forget();\n toast.success(\n saved.renamed ? `Saved as “${saved.slug}”.` : \"Saved.\",\n saved.relinked > 0 ? `Updated the links in ${saved.relinked} other entr${saved.relinked === 1 ? \"y or page\" : \"ies or pages\"}.` : undefined,\n );\n void staging.refresh();\n\n if (saved.slug !== props.slug) {\n await router.replace({\n name: \"entry\",\n params: { collection: props.collection, slug: saved.slug },\n });\n return;\n }\n\n await open(saved.slug);\n } catch (error) {\n if (error instanceof ApiError && error.status === 409 && !props.slug) {\n toast.error(\"An entry with this URL exists already. Change the URL, then save.\");\n } else if (error instanceof ApiError && error.status === 409) {\n // The form keeps the editor's work; which version stays is their decision.\n await showConflict(props.slug!, error.message);\n } else if (error instanceof ApiError && error.issues.length > 0) {\n form.set(error.issues);\n toast.error(error.message, `${error.issues.length} field(s) need attention.`);\n await showIssues();\n } else {\n toast.error(error instanceof ApiError ? error.message : \"Could not save this entry.\");\n }\n } finally {\n saving.value = false;\n }\n}\n\nasync function showConflict(slug: string, message: string): Promise<void> {\n conflict.value = \"loading\";\n try {\n theirs.value = await api.entries.get(props.collection, slug);\n conflict.value = \"loaded\";\n // This entry is as it was: what changed is an entry or page whose links were to follow.\n if (theirs.value.revision === revision.value) {\n conflict.value = \"none\";\n theirs.value = null;\n toast.error(message);\n }\n } catch {\n theirs.value = null;\n conflict.value = \"missing\";\n }\n}\n\n/** Takes the colleague's saved version, discarding this form's edits. */\nasync function useTheirs(): Promise<void> {\n if (!props.slug) return;\n try {\n await open(props.slug);\n kept.forget();\n toast.success(\"Loaded their version.\");\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not load this entry.\");\n }\n}\n\n/** After a discard, a new entry is gone, and a URL change goes back to the old URL. */\nasync function discarded(edit: Edit): Promise<void> {\n kept.forget();\n if (edit.state === \"new\") {\n await router.replace({ name: \"collection\", params: { collection: props.collection } });\n } else if (edit.target?.kind === \"entry\" && edit.target.from) {\n await router.replace({ name: \"entry\", params: { collection: props.collection, slug: edit.target.from } });\n } else if (props.slug) {\n await open(props.slug);\n }\n}\n\nasync function askDelete(): Promise<void> {\n references.value = [];\n if (props.slug) {\n try {\n const { references: found } = await api.entries.references(props.collection, props.slug);\n references.value = found.map(describeReferrer);\n } catch {\n // The warning is a courtesy; a failure to fetch it must not block deletion.\n }\n }\n confirmDelete.value = true;\n}\n\nasync function remove(): Promise<void> {\n if (!props.slug) return;\n try {\n await api.entries.remove(props.collection, props.slug);\n unsaved.release();\n toast.success(\"Deleted.\");\n void staging.refresh();\n await router.replace({ name: \"collection\", params: { collection: props.collection } });\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not delete this entry.\");\n } finally {\n confirmDelete.value = false;\n }\n}\n</script>\n\n<template>\n <template v-if=\"definition\">\n <PageHeader\n :title=\"title\"\n :subtitle=\"location\"\n :back=\"{ name: 'collection', params: { collection } }\"\n :back-label=\"definition.label\"\n >\n <template v-if=\"!definition.readOnly\">\n <span :class=\"['badge', state.tone]\">\n <span class=\"h-1.5 w-1.5 rounded-full bg-current\" aria-hidden=\"true\" />\n {{ state.label }}\n </span>\n <button type=\"button\" class=\"btn-primary\" :disabled=\"saving || !dirty\" @click=\"save()\">\n {{ saving ? \"Saving…\" : \"Save changes\" }}\n </button>\n </template>\n </PageHeader>\n\n <div class=\"mx-auto max-w-3xl px-4 py-6 sm:px-6\">\n <p v-if=\"loading\" class=\"text-sm text-muted\">Loading…</p>\n\n <template v-else>\n <ReadOnlyNotice v-if=\"definition.readOnly\" :reason=\"definition.readOnly\" />\n <PendingNotice v-else-if=\"pending && !dirty\" :edit=\"pending\" @discarded=\"discarded\" />\n\n <div\n v-if=\"websiteConflict\"\n role=\"alert\"\n class=\"mb-5 rounded-md border border-warning/15 bg-warning-soft p-4\"\n >\n <p class=\"text-sm font-medium text-warning\">This entry was changed on the website while you edited</p>\n <p class=\"mt-1 text-xs text-muted\">\n Your saved version is kept. Choose which version to publish on the Publish page.\n </p>\n <RouterLink :to=\"{ name: 'changes' }\" class=\"btn-secondary mt-2.5 inline-flex\">Choose a version</RouterLink>\n </div>\n\n <SaveConflict\n v-if=\"conflict !== 'none'\"\n :state=\"conflict\"\n :theirs=\"theirs?.data ?? null\"\n :mine=\"values\"\n :fields=\"definition.fields\"\n :busy=\"saving\"\n @keep=\"save({ keepMine: true })\"\n @take=\"useTheirs\"\n />\n\n <KeptChangesNotice v-if=\"kept.offered.value\" :at=\"kept.offered.value.at\" @restore=\"kept.restore()\" @forget=\"kept.forget()\" />\n <IssueSummary :issues=\"issues\" />\n\n <div v-if=\"urlChanging\" role=\"status\" class=\"mb-5 rounded-md border border-line bg-subtle p-4\">\n <p class=\"text-sm font-medium\">The URL changes from “{{ slug }}” to “{{ newSlug }}” when you save</p>\n <template v-if=\"linkers?.length\">\n <p class=\"mt-1 text-xs text-muted\">\n {{ linkers.length }} other entr{{ linkers.length === 1 ? \"y or page links\" : \"ies or pages link\" }} to it:\n {{ linkers.map(describeReferrer).join(\", \") }}.\n </p>\n <p v-if=\"linkers.some((item) => item.readOnly)\" class=\"mt-1 text-xs text-warning\">\n This version of Mica cannot change\n {{ linkers.filter((item) => item.readOnly).map(describeReferrer).join(\", \") }}. Their links keep the old\n URL until a developer changes them.\n </p>\n <label class=\"mt-2 flex items-center gap-2 text-xs\">\n <input v-model=\"updateLinks\" type=\"checkbox\" class=\"h-4 w-4\" />\n Update their links when I save\n </label>\n <p v-if=\"!updateLinks\" class=\"mt-1 text-xs text-warning\">\n Their links then point to a URL that does not exist, and Publish waits until they are changed.\n </p>\n </template>\n <p class=\"mt-1 text-xs text-muted\">\n Visitors who use the old URL, from a bookmark or a search engine, need a redirect. Ask the developer of\n the website for one.\n </p>\n </div>\n\n <form novalidate @submit.prevent=\"save()\" @focusout=\"onLeave\">\n <FieldList\n v-model=\"values\"\n :fields=\"definition.fields\"\n :issues=\"issues\"\n :disabled=\"saving || !!definition.readOnly\"\n :collection=\"collection\"\n :entry-slug=\"slug\"\n />\n\n <!-- Enter in a text input should save, not do nothing. -->\n <button v-if=\"!definition.readOnly\" type=\"submit\" class=\"sr-only\">Save</button>\n </form>\n\n <div v-if=\"!isNew && !definition.readOnly\" class=\"mt-10 border-t border-line pt-5\">\n <button type=\"button\" class=\"btn-danger\" @click=\"askDelete\">\n Delete this {{ definition.labelSingular.toLowerCase() }}\n </button>\n </div>\n </template>\n </div>\n\n <ConfirmDialog\n :open=\"confirmDelete\"\n :title=\"`Delete “${title}”?`\"\n confirm-label=\"Delete\"\n destructive\n @cancel=\"confirmDelete = false\"\n @confirm=\"remove\"\n >\n <p>\n Like any change, the removal is saved first, and the entry leaves the website when you\n publish.\n </p>\n\n <div v-if=\"references.length\" class=\"mt-3 rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">\n {{ references.length }} other entr{{ references.length === 1 ? \"y or page links\" : \"ies or pages link\" }} to\n this one:\n </p>\n <ul class=\"mt-1 list-inside list-disc text-xs\">\n <li v-for=\"(item, index) in references\" :key=\"index\">{{ item }}</li>\n </ul>\n </div>\n </ConfirmDialog>\n </template>\n\n <div v-else class=\"p-8 text-center text-sm text-muted\">\n There is no collection called \"{{ collection }}\".\n </div>\n</template>\n"],"names":["props","__props","route","useRoute","router","useRouter","schema","useSchema","staging","useStaging","toast","useToast","definition","computed","entry","ref","values","loading","saving","conflict","theirs","confirmDelete","websiteConflict","_b","_a","item","references","describeReferrer","newSlug","value","urlChanging","linkers","provide","MEDIA_FOLDER","isValidSlug","updateLinks","watch","changing","api","revision","form","useFormIssues","issues","unsaved","useUnsavedChanges","dirty","kept","useKeptChanges","isNew","pending","edit","state","title","def","location","setBaseline","detail","open","slug","onMounted","defaultValues","error","ApiError","field","nextTick","focusField","onLeave","event","path","fieldPathOf","showIssues","save","options","keepMine","payload","saved","showConflict","message","useTheirs","discarded","askDelete","found","remove","_createElementBlock","_Fragment","_createVNode","PageHeader","_createElementVNode","_normalizeClass","_toDisplayString","_unref","_hoisted_1","_hoisted_2","_hoisted_3","_createBlock","ReadOnlyNotice","PendingNotice","_openBlock","_hoisted_4","_cache","_component_RouterLink","SaveConflict","KeptChangesNotice","$event","IssueSummary","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","FieldList","_hoisted_11","_hoisted_12","ConfirmDialog","_hoisted_13","_hoisted_14","_hoisted_15","_renderList","index","_hoisted_16"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as _,o as h,c as a,a as t,_ as b,t as u,b as d,e as v,
|
|
2
|
-
//# sourceMappingURL=LoginView-
|
|
1
|
+
import{d as _,o as h,c as a,a as t,_ as b,t as u,b as d,e as v,r as f,f as c,u as w,g as i,h as k}from"./index-C-WfCDd6.js";const S={key:0,class:"grid min-h-full place-items-center p-6"},q={key:1,class:"grid min-h-full place-items-center p-6"},T={class:"w-full max-w-sm"},C={class:"card space-y-4 p-5"},M={key:0,role:"alert",class:"rounded-md border border-danger/15 bg-danger-soft px-4 py-3 text-sm text-danger"},R=["disabled"],V={key:1,class:"text-center text-xs text-muted"},B={class:"font-medium"},N={key:0,class:"mt-4 text-center text-xs text-muted"},E=_({__name:"LoginView",setup(A){const r=w(),m=k(),l=f(!1),o=f(null),p=c(()=>{var e;return(e=r.config.value)==null?void 0:e.provider}),n=c(()=>{var e;return((e=r.config.value)==null?void 0:e.authRequired)===!1}),y=c(()=>{const e=m.query.redirect;return typeof e=="string"&&e.startsWith("/admin")?e:"/admin/"}),x={rate_limited:"Too many sign-in attempts. Wait a few minutes, then sign in again.",expired:"That sign-in attempt expired or was not started here. Please try again.",failed:"Sign-in could not be completed. Please try again.",not_admitted:"You are signed in at your provider, but that account has no access to this site. Ask whoever runs it to add you.",too_large:"Sign-in could not be completed: your account details are too large."};h(()=>{const e=m.query.error;typeof e=="string"&&(o.value=x[e]??"Sign-in could not be completed."),n.value&&!o.value&&g()});function g(){l.value=!0,r.signIn(y.value)}return(e,s)=>n.value&&!o.value?(i(),a("div",S,[...s[0]||(s[0]=[t("p",{class:"text-sm text-muted"},"Opening the editor…",-1)])])):(i(),a("div",q,[t("div",T,[s[3]||(s[3]=t("div",{class:"mb-7 flex flex-col items-center gap-4 text-center"},[t("img",{src:b,alt:"micacms",class:"h-8 w-auto"}),t("div",null,[t("h1",{class:"text-lg font-semibold tracking-tight"},"Sign in to Mica"),t("p",{class:"mt-0.5 text-sm text-muted"},"Manage your website content.")])],-1)),t("div",C,[o.value?(i(),a("p",M,u(o.value),1)):d("",!0),t("button",{type:"button",class:"btn-primary w-full",disabled:l.value,onClick:g},u(l.value?"Redirecting…":n.value?"Continue":"Sign in"),9,R),p.value&&!n.value?(i(),a("p",V,[s[1]||(s[1]=v(" You will be taken to ",-1)),t("span",B,u(p.value),1),s[2]||(s[2]=v(" to sign in. ",-1))])):d("",!0)]),n.value?d("",!0):(i(),a("p",N," Mica does not hold your password. Trouble signing in is a question for whoever runs your identity provider; no access once you are in is a question for a site administrator. "))])]))}});export{E as default};
|
|
2
|
+
//# sourceMappingURL=LoginView-C4FlLD5n.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginView-
|
|
1
|
+
{"version":3,"file":"LoginView-C4FlLD5n.js","sources":["../../src/views/LoginView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Sign in.\n *\n * There is no form. Mica does not hold passwords, so there is nothing for an\n * editor to type here — the button hands the browser to the identity provider,\n * which does the actual authenticating and sends it back.\n *\n * The error banner exists because the round trip can fail after the provider\n * is satisfied: someone can authenticate perfectly well and still not be\n * admitted to this site, and that has to read as \"ask for access\", not as\n * \"your password was wrong\".\n *\n * In local mode this screen is not reached at all: there is no provider, no\n * account and nobody to be, and the session starts as the page is served. The\n * redirect below is the fallback for the one way in that skips that — a\n * browser still holding `/admin/login` from an earlier session.\n */\n\nimport { computed, onMounted, ref } from \"vue\";\nimport { useRoute } from \"vue-router\";\n\nimport { useSession } from \"@/stores/session\";\n\nconst session = useSession();\nconst route = useRoute();\n\nconst busy = ref(false);\n\n/** Set by the callback when it bounces the browser back here with a reason. */\nconst error = ref<string | null>(null);\n\nconst provider = computed(() => session.config.value?.provider);\n/** Local mode: no provider to send anybody to, so there is nothing to show. */\nconst authDisabled = computed(() => session.config.value?.authRequired === false);\n\n/** Where to land afterwards. Always a path on this server. */\nconst returnTo = computed(() => {\n const redirect = route.query[\"redirect\"];\n return typeof redirect === \"string\" && redirect.startsWith(\"/admin\")\n ? redirect\n : \"/admin/\";\n});\n\n/** The callback sends a code, never a sentence, so the URL carries no address (#150). */\nconst REFUSALS: Record<string, string> = {\n rate_limited: \"Too many sign-in attempts. Wait a few minutes, then sign in again.\",\n expired: \"That sign-in attempt expired or was not started here. Please try again.\",\n failed: \"Sign-in could not be completed. Please try again.\",\n not_admitted: \"You are signed in at your provider, but that account has no access to this site. Ask whoever runs it to add you.\",\n too_large: \"Sign-in could not be completed: your account details are too large.\",\n};\n\nonMounted(() => {\n const reason = route.query[\"error\"];\n if (typeof reason === \"string\") error.value = REFUSALS[reason] ?? \"Sign-in could not be completed.\";\n\n // No provider, no question to ask. Straight to the editor.\n if (authDisabled.value && !error.value) signIn();\n});\n\nfunction signIn(): void {\n busy.value = true;\n session.signIn(returnTo.value);\n}\n</script>\n\n<template>\n <!-- Local mode: a held breath, not a screen. -->\n <div v-if=\"authDisabled && !error\" class=\"grid min-h-full place-items-center p-6\">\n <p class=\"text-sm text-muted\">Opening the editor…</p>\n </div>\n\n <div v-else class=\"grid min-h-full place-items-center p-6\">\n <div class=\"w-full max-w-sm\">\n <div class=\"mb-7 flex flex-col items-center gap-4 text-center\">\n <img src=\"/brand/micacms-wordmark.svg\" alt=\"micacms\" class=\"h-8 w-auto\" />\n <div>\n <h1 class=\"text-lg font-semibold tracking-tight\">Sign in to Mica</h1>\n <p class=\"mt-0.5 text-sm text-muted\">Manage your website content.</p>\n </div>\n </div>\n\n <div class=\"card space-y-4 p-5\">\n <p v-if=\"error\" role=\"alert\" class=\"rounded-md border border-danger/15 bg-danger-soft px-4 py-3 text-sm text-danger\">\n {{ error }}\n </p>\n\n <button type=\"button\" class=\"btn-primary w-full\" :disabled=\"busy\" @click=\"signIn\">\n {{ busy ? \"Redirecting…\" : authDisabled ? \"Continue\" : \"Sign in\" }}\n </button>\n\n <p v-if=\"provider && !authDisabled\" class=\"text-center text-xs text-muted\">\n You will be taken to <span class=\"font-medium\">{{ provider }}</span> to sign in.\n </p>\n </div>\n\n <p v-if=\"!authDisabled\" class=\"mt-4 text-center text-xs text-muted\">\n Mica does not hold your password. Trouble signing in is a question for\n whoever runs your identity provider; no access once you are in is a\n question for a site administrator.\n </p>\n </div>\n </div>\n</template>\n"],"names":["session","useSession","route","useRoute","busy","ref","error","provider","computed","_a","authDisabled","returnTo","redirect","REFUSALS","onMounted","reason","signIn","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_hoisted_3","_imports_0","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9"],"mappings":"6kBAwBA,MAAMA,EAAUC,EAAA,EACVC,EAAQC,EAAA,EAERC,EAAOC,EAAI,EAAK,EAGhBC,EAAQD,EAAmB,IAAI,EAE/BE,EAAWC,EAAS,IAAA,OAAM,OAAAC,EAAAT,EAAQ,OAAO,QAAf,YAAAS,EAAsB,SAAQ,EAExDC,EAAeF,EAAS,IAAA,OAAM,QAAAC,EAAAT,EAAQ,OAAO,QAAf,YAAAS,EAAsB,gBAAiB,GAAK,EAG1EE,EAAWH,EAAS,IAAM,CAC9B,MAAMI,EAAWV,EAAM,MAAM,SAC7B,OAAO,OAAOU,GAAa,UAAYA,EAAS,WAAW,QAAQ,EAC/DA,EACA,SACN,CAAC,EAGKC,EAAmC,CACvC,aAAc,qEACd,QAAS,0EACT,OAAQ,oDACR,aAAc,mHACd,UAAW,qEAAA,EAGbC,EAAU,IAAM,CACd,MAAMC,EAASb,EAAM,MAAM,MACvB,OAAOa,GAAW,aAAgB,MAAQF,EAASE,CAAM,GAAK,mCAG9DL,EAAa,OAAS,CAACJ,EAAM,OAAOU,EAAA,CAC1C,CAAC,EAED,SAASA,GAAe,CACtBZ,EAAK,MAAQ,GACbJ,EAAQ,OAAOW,EAAS,KAAK,CAC/B,cAKaD,EAAA,QAAiBJ,EAAA,OAA5BW,IAAAC,EAEM,MAFNC,EAEM,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CADJC,EAAqD,IAAA,CAAlD,MAAM,oBAAA,EAAqB,sBAAmB,EAAA,CAAA,OAGnDJ,IAAAC,EA8BM,MA9BNI,EA8BM,CA7BJD,EA4BM,MA5BNE,EA4BM,aA3BJF,EAMM,MAAA,CAND,MAAM,qDAAmD,CAC5DA,EAA0E,MAAA,CAArE,IAAAG,EAAkC,IAAI,UAAU,MAAM,YAAA,GAC3DH,EAGM,MAAA,KAAA,CAFJA,EAAqE,KAAA,CAAjE,MAAM,sCAAA,EAAuC,iBAAe,EAChEA,EAAqE,IAAA,CAAlE,MAAM,2BAAA,EAA4B,8BAA4B,CAAA,SAIrEA,EAYM,MAZNI,EAYM,CAXKnB,EAAA,WAATY,EAEI,IAFJQ,EAEIC,EADCrB,EAAA,KAAK,EAAA,CAAA,YAGVe,EAES,SAAA,CAFD,KAAK,SAAS,MAAM,qBAAsB,SAAUjB,EAAA,MAAO,QAAOY,CAAA,EACrEW,EAAAvB,EAAA,qBAAwBM,EAAA,MAAY,WAAA,SAAA,EAAA,EAAAkB,CAAA,EAGhCrB,EAAA,QAAaG,EAAA,OAAtBO,IAAAC,EAEI,IAFJW,EAEI,eAFuE,yBACpD,EAAA,GAAAR,EAA+C,OAA/CS,EAA+CH,EAAlBpB,EAAA,KAAQ,EAAA,CAAA,gBAAU,gBACtE,EAAA,EAAA,eAGQG,EAAA,oBAAVQ,EAII,IAJJa,EAAoE,iLAIpE"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as oe,q as ie,o as re,c as l,i as B,w as L,k as w,a as s,v as ue,x as de,F as x,t as o,b as C,j,n as _,B as F,E as X,r as p,A as z,f as P,p as ce,g as a,e as $,m as pe,y as he,l as ve}from"./index-C-WfCDd6.js";import{_ as fe}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js";import{_ as me}from"./PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js";import{f as O}from"./format-CAimH9FV.js";const ge={class:"btn-primary cursor-pointer"},ye=["disabled"],be={class:"mb-3 flex flex-wrap items-center gap-2"},xe={class:"text-sm text-muted"},_e={key:0,role:"alert",class:"mb-3 rounded-md border border-warning/15 bg-warning-soft p-4"},ke={class:"text-sm font-medium text-warning"},we={class:"mt-1.5 space-y-1 text-xs"},Ce={class:"font-mono"},$e={key:1,class:"py-12 text-center text-sm text-muted"},Te={key:2,class:"card px-4 py-12 text-center"},De={class:"text-sm font-medium"},Se={key:3,class:"grid gap-5 lg:grid-cols-[1fr_20rem]"},je={class:"space-y-6"},ze={class:"mb-2 font-mono text-xs text-muted"},Me={class:"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4"},Ne=["checked","aria-label","onChange"],Be=["aria-pressed","onClick"],Le={class:"block aspect-4/3 bg-canvas"},Pe=["src"],Ue={key:1,class:"flex h-full w-full items-center justify-center text-xs font-semibold uppercase text-muted"},Ve={class:"block px-2 py-1.5"},Ie={class:"block truncate text-xs font-medium"},Re={class:"block text-[11px] text-muted"},Ae={key:0,class:"card h-fit p-4 lg:sticky lg:top-5"},Ee={class:"mt-3 overflow-hidden rounded-lg border border-line bg-canvas"},Fe=["src"],Oe={key:1,class:"p-6 text-center text-xs text-muted"},qe={class:"mt-4 space-y-1 text-xs text-muted"},We={class:"flex justify-between gap-3"},Ge={key:0,class:"flex justify-between gap-3"},He={class:"flex justify-between gap-3"},Je={class:"mt-3 border-t border-line pt-3"},Ke={class:"mt-1 break-all font-mono text-[11px]"},Qe={class:"mt-3 border-t border-line pt-3"},Xe={key:0,class:"mt-1 text-xs text-warning"},Ye={key:1,class:"mt-1 text-xs text-muted"},Ze={key:2,class:"mt-1 text-xs text-muted"},et={key:3,class:"mt-1 space-y-0.5 text-xs"},tt={class:"mt-3 flex gap-2"},st=["href"],lt=["disabled"],at={key:0,class:"mt-1 text-xs text-muted"},nt={key:0,class:"mt-2 text-warning"},ct=oe({__name:"MediaView",setup(ot){const f=ce(),g=p([]),U=p(!0),M=p(!1),T=p(""),N=p(!1),i=p(null),V=p(null),Y=he(),I=ve(),y=p(new Set);function Z(t){const e=new Set(y.value);e.delete(t)||e.add(t),y.value=e}const m=p(null),D=p(null);ie(i,async t=>{var e,r;if(m.value=null,D.value=null,!!t)try{const{uses:d,unreadable:b}=await _.media.usage([t.path]);if(((e=i.value)==null?void 0:e.path)!==t.path)return;b.length>0?D.value=`Mica cannot read ${b.join(", ")}.`:m.value=d[t.path]??[]}catch(d){((r=i.value)==null?void 0:r.path)===t.path&&(D.value=d instanceof z?d.message:"Could not check.")}});const R=P(()=>{var t;return new Set((((t=I.status.value)==null?void 0:t.changes)??[]).filter(e=>e.kind==="create").map(e=>e.path))}),k=p([]),c=p(null),A=p(!1);function q(t){return t.kind==="entry"?{name:"entry",params:{collection:t.collection,slug:t.slug}}:{name:"singleton",params:{name:t.name}}}function W(t){var e;return t.kind==="entry"?`${t.title} (${((e=Y.collection(t.collection))==null?void 0:e.label)??t.collection})`:t.title}async function G(t){k.value=[];try{const{uses:e,unreadable:r}=await _.media.usage(t);if(r.length>0){f.error(`Mica cannot read ${r.join(", ")}, so it cannot tell whether the files are used.`);return}k.value=t.flatMap(d=>(e[d]??[]).length>0?[{path:d,users:e[d]}]:[])}catch(e){f.error(e instanceof z?e.message:"Could not check where the files are used.");return}k.value.length===0&&(c.value=t)}async function ee(){const t=c.value;if(t){A.value=!0;try{await _.media.remove(t),f.success(`Deleted ${t.length} file${t.length===1?"":"s"}.`,"They leave the website when you publish."),c.value=null,y.value=new Set,I.refresh(),await E()}catch(e){f.error(e instanceof z?e.message:"Could not delete.")}finally{A.value=!1}}}const H=t=>t.mimeType.startsWith("image/"),te=t=>{const e=t.split("/");return e.pop(),e.join("/")||"/"},J=P(()=>{const t=T.value.trim().toLowerCase();return t?g.value.filter(e=>e.path.toLowerCase().includes(t)):g.value}),se=P(()=>{const t=new Map;for(const e of J.value){const r=te(e.path),d=t.get(r);d?d.push(e):t.set(r,[e])}return[...t].sort(([e],[r])=>e.localeCompare(r))}),le=P(()=>g.value.reduce((t,e)=>t+e.size,0));async function E(){U.value=!0;try{g.value=(await _.media.list()).items;const t=g.value.find(e=>{var r;return e.path===((r=i.value)==null?void 0:r.path)});i.value=t??null}catch(t){f.error(t instanceof z?t.message:"Could not load the media library.")}finally{U.value=!1}}re(E);async function K(t){const e=Array.from(t??[]);if(e.length!==0){M.value=!0;try{const{items:r}=await _.media.upload(e);f.success(`Uploaded ${r.length} file${r.length===1?"":"s"}.`),I.refresh(),await E(),i.value=g.value.find(d=>{var b;return d.path===((b=r[0])==null?void 0:b.path)})??null}catch(r){f.error(r instanceof z?r.message:"The upload failed.")}finally{M.value=!1,V.value&&(V.value.value="")}}}async function ae(t){try{await navigator.clipboard.writeText(t),f.success("Path copied.")}catch{f.error("Could not copy. Select the path and copy it by hand.")}}return(t,e)=>{var d,b;const r=pe("RouterLink");return a(),l(x,null,[B(me,{title:"Media",subtitle:`${g.value.length} file${g.value.length===1?"":"s"} · ${w(O)(le.value)}`},{default:L(()=>[s("label",ge,[s("input",{ref_key:"fileInput",ref:V,type:"file",multiple:"",class:"sr-only",disabled:M.value,onChange:e[0]||(e[0]=n=>K(n.target.files))},null,40,ye),$(" "+o(M.value?"Uploading…":"Upload files"),1)])]),_:1},8,["subtitle"]),s("div",{class:X(["mx-auto max-w-5xl px-4 py-5 sm:px-6",N.value&&"rounded-md outline-2 outline-dashed outline-ink"]),onDragover:e[6]||(e[6]=F(n=>N.value=!0,["prevent"])),onDragleave:e[7]||(e[7]=F(n=>N.value=!1,["prevent"])),onDrop:e[8]||(e[8]=F(n=>{var h;N.value=!1,K(((h=n.dataTransfer)==null?void 0:h.files)??null)},["prevent"]))},[s("div",be,[ue(s("input",{"onUpdate:modelValue":e[1]||(e[1]=n=>T.value=n),type:"search",placeholder:"Search by name or folder…",class:"input max-w-64","aria-label":"Search media"},null,512),[[de,T.value]]),y.value.size>0?(a(),l(x,{key:0},[s("span",xe,o(y.value.size)+" selected",1),s("button",{type:"button",class:"btn-danger",onClick:e[2]||(e[2]=n=>G([...y.value]))},"Delete"),s("button",{type:"button",class:"btn-ghost",onClick:e[3]||(e[3]=n=>y.value=new Set)},"Clear selection")],64)):C("",!0)]),k.value.length?(a(),l("div",_e,[s("p",ke," Not deleted: "+o(k.value.length===1?"this file is":"these files are")+" still used ",1),s("ul",we,[(a(!0),l(x,null,j(k.value,n=>(a(),l("li",{key:n.path},[s("span",Ce,o(n.path.split("/").at(-1)),1),e[10]||(e[10]=$(" is used by ",-1)),(a(!0),l(x,null,j(n.users,(h,u)=>(a(),l(x,{key:u},[$(o(u>0?", ":""),1),B(r,{to:q(h),class:"underline underline-offset-2"},{default:L(()=>[$(o(W(h)),1)]),_:2},1032,["to"])],64))),128)),e[11]||(e[11]=$(". ",-1))]))),128))]),e[12]||(e[12]=s("p",{class:"mt-1.5 text-xs text-muted"},"Remove the file there first, then delete it here.",-1))])):C("",!0),U.value?(a(),l("p",$e,"Loading…")):J.value.length===0?(a(),l("div",Te,[s("p",De,o(T.value?`Nothing matches "${T.value}".`:"No files yet."),1),e[13]||(e[13]=s("p",{class:"mt-1 text-sm text-muted"}," Drag files anywhere on this page to upload them. ",-1))])):(a(),l("div",Se,[s("div",je,[(a(!0),l(x,null,j(se.value,([n,h])=>(a(),l("section",{key:n},[s("h2",ze,o(n),1),s("ul",Me,[(a(!0),l(x,null,j(h,u=>{var S,v;return a(),l("li",{key:u.path,class:"relative"},[s("input",{type:"checkbox",class:"absolute left-2 top-2 z-10 h-4 w-4",checked:y.value.has(u.path),"aria-label":`Select ${u.filename}`,onChange:ne=>Z(u.path)},null,40,Ne),s("button",{type:"button","aria-pressed":((S=i.value)==null?void 0:S.path)===u.path,class:X(["block w-full overflow-hidden rounded-lg border text-left transition",((v=i.value)==null?void 0:v.path)===u.path?"border-accent ring-2 ring-accent/25":"border-line hover:border-accent/40"]),onClick:ne=>{var Q;return i.value=((Q=i.value)==null?void 0:Q.path)===u.path?null:u}},[s("span",Le,[H(u)?(a(),l("img",{key:0,src:w(_).media.url(u.path),alt:"",loading:"lazy",class:"h-full w-full object-cover"},null,8,Pe)):(a(),l("span",Ue,o(u.mimeType.split("/")[1]),1))]),s("span",Ve,[s("span",Ie,o(u.filename),1),s("span",Re,o(w(O)(u.size)),1)])],10,Be)])}),128))])]))),128))]),i.value?(a(),l("aside",Ae,[e[19]||(e[19]=s("h2",{class:"text-sm font-semibold"},"File details",-1)),s("div",Ee,[H(i.value)?(a(),l("img",{key:0,src:w(_).media.url(i.value.path),alt:"",class:"max-h-48 w-full object-contain"},null,8,Fe)):(a(),l("p",Oe,o(i.value.mimeType),1))]),s("dl",qe,[s("div",We,[e[14]||(e[14]=s("dt",null,"Type",-1)),s("dd",null,o(i.value.mimeType),1)]),i.value.width?(a(),l("div",Ge,[e[15]||(e[15]=s("dt",null,"Dimensions",-1)),s("dd",null,o(i.value.width)+" × "+o(i.value.height),1)])):C("",!0),s("div",He,[e[16]||(e[16]=s("dt",null,"Size",-1)),s("dd",null,o(w(O)(i.value.size)),1)])]),s("div",Je,[e[17]||(e[17]=s("p",{class:"field-label"},"Path",-1)),s("p",Ke,o(i.value.path),1)]),s("div",Qe,[e[18]||(e[18]=s("p",{class:"field-label"},"Used by",-1)),D.value?(a(),l("p",Xe,o(D.value),1)):m.value===null?(a(),l("p",Ye,"Checking…")):m.value.length===0?(a(),l("p",Ze,"Nothing uses this file.")):(a(),l("ul",et,[(a(!0),l(x,null,j(m.value,(n,h)=>(a(),l("li",{key:h},[B(r,{to:q(n),class:"underline underline-offset-2"},{default:L(()=>[$(o(W(n)),1)]),_:2},1032,["to"])]))),128))]))]),s("div",tt,[s("button",{type:"button",class:"btn-secondary flex-1",onClick:e[4]||(e[4]=n=>ae(i.value.path))}," Copy path "),s("a",{href:w(_).media.url(i.value.path),target:"_blank",rel:"noopener noreferrer",class:"btn-secondary flex-1"}," Open ",8,st)]),s("button",{type:"button",class:"btn-danger mt-2 w-full",disabled:m.value===null||m.value.length>0,onClick:e[5]||(e[5]=n=>G([i.value.path]))}," Delete this file ",8,lt),m.value&&m.value.length>0?(a(),l("p",at,"Remove it where it is used first.")):C("",!0)])):C("",!0)]))],34),B(fe,{open:c.value!==null,title:`Delete ${((d=c.value)==null?void 0:d.length)===1?"this file":`${(b=c.value)==null?void 0:b.length} files`}?`,"confirm-label":"Delete",destructive:"",busy:A.value,onCancel:e[9]||(e[9]=n=>c.value=null),onConfirm:ee},{default:L(()=>{var n,h,u,S;return[s("p",null," Nothing uses "+o(((n=c.value)==null?void 0:n.length)===1?"it":"them")+". "+o(((h=c.value)==null?void 0:h.length)===1?"It leaves":"They leave")+" the website when you publish. Until then, Discard on the Publish page brings "+o(((u=c.value)==null?void 0:u.length)===1?"it":"them")+" back. ",1),(S=c.value)!=null&&S.some(v=>R.value.has(v))?(a(),l("p",nt,o(c.value.filter(v=>R.value.has(v)).map(v=>v.split("/").at(-1)).join(", "))+" "+o(c.value.filter(v=>R.value.has(v)).length===1?"was":"were")+" never published: deleting cannot be undone. ",1)):C("",!0)]}),_:1},8,["open","title","busy"])],64)}}});export{ct as default};
|
|
2
|
+
//# sourceMappingURL=MediaView-C0FP8j4J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MediaView-C0FP8j4J.js","sources":["../../src/views/MediaView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Media library — a view of the files in the content repository.\n *\n * See what is there, add to it, and delete what nothing uses. A delete is\n * refused while an entry or a settings page uses the file, in a field or in\n * rich text, and it waits on the Publish page like every change. Two things it\n * deliberately does not offer:\n *\n * - **Alt text.** Not a property of a file: the same photograph means\n * different things in different places, so it belongs to the field that\n * uses the image, next to the content it describes.\n * - **Rename.** A media file is referenced by its path, so moving one is a\n * change to every entry that points at it.\n *\n * Files are grouped by directory, which is meaningful here: an entry's images\n * sit beside the entry.\n */\n\nimport { computed, onMounted, ref, watch } from \"vue\";\n\nimport { api, ApiError, type MediaItem, type Referrer } from \"@/api\";\nimport ConfirmDialog from \"@/components/ConfirmDialog.vue\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport { useSchema } from \"@/stores/schema\";\nimport { formatBytes } from \"@/lib/format\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst toast = useToast();\n\nconst items = ref<MediaItem[]>([]);\nconst loading = ref(true);\nconst uploading = ref(false);\nconst search = ref(\"\");\nconst dragging = ref(false);\nconst selected = ref<MediaItem | null>(null);\nconst fileInput = ref<HTMLInputElement | null>(null);\nconst schema = useSchema();\nconst staging = useStaging();\n\n/** Files ticked for a delete. */\nconst chosen = ref(new Set<string>());\nfunction toggleChosen(path: string): void {\n const next = new Set(chosen.value);\n if (!next.delete(path)) next.add(path);\n chosen.value = next;\n}\n\n/** Where the selected file is used, for the details panel. */\nconst usedBy = ref<Referrer[] | null>(null);\n/** Why the use cannot be checked, such as a collection that cannot be read. */\nconst usageProblem = ref<string | null>(null);\nwatch(selected, async (item) => {\n usedBy.value = null;\n usageProblem.value = null;\n if (!item) return;\n try {\n const { uses, unreadable } = await api.media.usage([item.path]);\n // A slower answer for a file selected before must not show for this one.\n if (selected.value?.path !== item.path) return;\n if (unreadable.length > 0) usageProblem.value = `Mica cannot read ${unreadable.join(\", \")}.`;\n else usedBy.value = uses[item.path] ?? [];\n } catch (error) {\n if (selected.value?.path === item.path) usageProblem.value = error instanceof ApiError ? error.message : \"Could not check.\";\n }\n});\n\n/** Files that were never published: a delete removes them for good. */\nconst neverPublished = computed(\n () => new Set((staging.status.value?.changes ?? []).filter((change) => change.kind === \"create\").map((change) => change.path)),\n);\n\n/** Files that the last delete could not remove, with what uses them. */\nconst blocked = ref<Array<{ path: string; users: Referrer[] }>>([]);\nconst confirming = ref<string[] | null>(null);\nconst deleting = ref(false);\n\nfunction linkTo(item: Referrer) {\n return item.kind === \"entry\"\n ? { name: \"entry\", params: { collection: item.collection, slug: item.slug } }\n : { name: \"singleton\", params: { name: item.name } };\n}\n\nfunction describe(item: Referrer): string {\n return item.kind === \"entry\" ? `${item.title} (${schema.collection(item.collection)?.label ?? item.collection})` : item.title;\n}\n\n/** Checks where the files are used first: a used file is named, not deleted. */\nasync function askDelete(paths: string[]): Promise<void> {\n blocked.value = [];\n try {\n const { uses, unreadable } = await api.media.usage(paths);\n if (unreadable.length > 0) {\n toast.error(`Mica cannot read ${unreadable.join(\", \")}, so it cannot tell whether the files are used.`);\n return;\n }\n blocked.value = paths.flatMap((path) => ((uses[path] ?? []).length > 0 ? [{ path, users: uses[path]! }] : []));\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not check where the files are used.\");\n return;\n }\n if (blocked.value.length === 0) confirming.value = paths;\n}\n\nasync function remove(): Promise<void> {\n const paths = confirming.value;\n if (!paths) return;\n deleting.value = true;\n try {\n await api.media.remove(paths);\n toast.success(`Deleted ${paths.length} file${paths.length === 1 ? \"\" : \"s\"}.`, \"They leave the website when you publish.\");\n confirming.value = null;\n chosen.value = new Set();\n void staging.refresh();\n await load();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not delete.\");\n } finally {\n deleting.value = false;\n }\n}\n\nconst isImage = (item: MediaItem): boolean => item.mimeType.startsWith(\"image/\");\n\n/** The directory a file sits in; `media` is the shared one. */\nconst folderOf = (path: string): string => {\n const parts = path.split(\"/\");\n parts.pop();\n return parts.join(\"/\") || \"/\";\n};\n\nconst matching = computed(() => {\n const term = search.value.trim().toLowerCase();\n return term ? items.value.filter((item) => item.path.toLowerCase().includes(term)) : items.value;\n});\n\n/** Grouped by directory, in path order — the order the repository has them. */\nconst folders = computed(() => {\n const groups = new Map<string, MediaItem[]>();\n for (const item of matching.value) {\n const folder = folderOf(item.path);\n const group = groups.get(folder);\n if (group) group.push(item);\n else groups.set(folder, [item]);\n }\n return [...groups].sort(([a], [b]) => a.localeCompare(b));\n});\n\nconst totalBytes = computed(() => items.value.reduce((sum, item) => sum + item.size, 0));\n\nasync function load(): Promise<void> {\n loading.value = true;\n try {\n items.value = (await api.media.list()).items;\n // The chosen file may have gone from the repository between loads.\n const stillThere = items.value.find((item) => item.path === selected.value?.path);\n selected.value = stillThere ?? null;\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not load the media library.\");\n } finally {\n loading.value = false;\n }\n}\n\nonMounted(load);\n\nasync function upload(files: FileList | File[] | null): Promise<void> {\n const list = Array.from(files ?? []);\n if (list.length === 0) return;\n\n uploading.value = true;\n try {\n const { items: uploaded } = await api.media.upload(list);\n toast.success(`Uploaded ${uploaded.length} file${uploaded.length === 1 ? \"\" : \"s\"}.`);\n void staging.refresh();\n await load();\n selected.value = items.value.find((item) => item.path === uploaded[0]?.path) ?? null;\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"The upload failed.\");\n } finally {\n uploading.value = false;\n if (fileInput.value) fileInput.value.value = \"\";\n }\n}\n\nasync function copyPath(path: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(path);\n toast.success(\"Path copied.\");\n } catch {\n // Clipboard access is denied in some browsers unless the page is focused.\n toast.error(\"Could not copy. Select the path and copy it by hand.\");\n }\n}\n</script>\n\n<template>\n <PageHeader\n title=\"Media\"\n :subtitle=\"`${items.length} file${items.length === 1 ? '' : 's'} · ${formatBytes(totalBytes)}`\"\n >\n <label class=\"btn-primary cursor-pointer\">\n <input\n ref=\"fileInput\"\n type=\"file\"\n multiple\n class=\"sr-only\"\n :disabled=\"uploading\"\n @change=\"upload(($event.target as HTMLInputElement).files)\"\n />\n {{ uploading ? \"Uploading…\" : \"Upload files\" }}\n </label>\n </PageHeader>\n\n <div\n class=\"mx-auto max-w-5xl px-4 py-5 sm:px-6\"\n :class=\"dragging && 'rounded-md outline-2 outline-dashed outline-ink'\"\n @dragover.prevent=\"dragging = true\"\n @dragleave.prevent=\"dragging = false\"\n @drop.prevent=\"\n dragging = false;\n upload($event.dataTransfer?.files ?? null);\n \"\n >\n <div class=\"mb-3 flex flex-wrap items-center gap-2\">\n <input\n v-model=\"search\"\n type=\"search\"\n placeholder=\"Search by name or folder…\"\n class=\"input max-w-64\"\n aria-label=\"Search media\"\n />\n <template v-if=\"chosen.size > 0\">\n <span class=\"text-sm text-muted\">{{ chosen.size }} selected</span>\n <button type=\"button\" class=\"btn-danger\" @click=\"askDelete([...chosen])\">Delete</button>\n <button type=\"button\" class=\"btn-ghost\" @click=\"chosen = new Set()\">Clear selection</button>\n </template>\n </div>\n\n <div v-if=\"blocked.length\" role=\"alert\" class=\"mb-3 rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">\n Not deleted: {{ blocked.length === 1 ? \"this file is\" : \"these files are\" }} still used\n </p>\n <ul class=\"mt-1.5 space-y-1 text-xs\">\n <li v-for=\"item in blocked\" :key=\"item.path\">\n <span class=\"font-mono\">{{ item.path.split(\"/\").at(-1) }}</span> is used by\n <template v-for=\"(user, index) in item.users\" :key=\"index\">\n {{ index > 0 ? \", \" : \"\" }}<RouterLink :to=\"linkTo(user)\" class=\"underline underline-offset-2\">{{ describe(user) }}</RouterLink>\n </template>.\n </li>\n </ul>\n <p class=\"mt-1.5 text-xs text-muted\">Remove the file there first, then delete it here.</p>\n </div>\n\n <p v-if=\"loading\" class=\"py-12 text-center text-sm text-muted\">Loading…</p>\n\n <div v-else-if=\"matching.length === 0\" class=\"card px-4 py-12 text-center\">\n <p class=\"text-sm font-medium\">\n {{ search ? `Nothing matches \"${search}\".` : \"No files yet.\" }}\n </p>\n <p class=\"mt-1 text-sm text-muted\">\n Drag files anywhere on this page to upload them.\n </p>\n </div>\n\n <div v-else class=\"grid gap-5 lg:grid-cols-[1fr_20rem]\">\n <div class=\"space-y-6\">\n <section v-for=\"[folder, files] in folders\" :key=\"folder\">\n <h2 class=\"mb-2 font-mono text-xs text-muted\">{{ folder }}</h2>\n\n <ul class=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4\">\n <li v-for=\"item in files\" :key=\"item.path\" class=\"relative\">\n <input\n type=\"checkbox\"\n class=\"absolute left-2 top-2 z-10 h-4 w-4\"\n :checked=\"chosen.has(item.path)\"\n :aria-label=\"`Select ${item.filename}`\"\n @change=\"toggleChosen(item.path)\"\n />\n <button\n type=\"button\"\n :aria-pressed=\"selected?.path === item.path\"\n :class=\"[\n 'block w-full overflow-hidden rounded-lg border text-left transition',\n selected?.path === item.path\n ? 'border-accent ring-2 ring-accent/25'\n : 'border-line hover:border-accent/40',\n ]\"\n @click=\"selected = selected?.path === item.path ? null : item\"\n >\n <span class=\"block aspect-4/3 bg-canvas\">\n <img\n v-if=\"isImage(item)\"\n :src=\"api.media.url(item.path)\"\n alt=\"\"\n loading=\"lazy\"\n class=\"h-full w-full object-cover\"\n />\n <span\n v-else\n class=\"flex h-full w-full items-center justify-center text-xs font-semibold uppercase text-muted\"\n >\n {{ item.mimeType.split(\"/\")[1] }}\n </span>\n </span>\n\n <span class=\"block px-2 py-1.5\">\n <span class=\"block truncate text-xs font-medium\">{{ item.filename }}</span>\n <span class=\"block text-[11px] text-muted\">{{ formatBytes(item.size) }}</span>\n </span>\n </button>\n </li>\n </ul>\n </section>\n </div>\n\n <aside v-if=\"selected\" class=\"card h-fit p-4 lg:sticky lg:top-5\">\n <h2 class=\"text-sm font-semibold\">File details</h2>\n\n <div class=\"mt-3 overflow-hidden rounded-lg border border-line bg-canvas\">\n <img\n v-if=\"isImage(selected)\"\n :src=\"api.media.url(selected.path)\"\n alt=\"\"\n class=\"max-h-48 w-full object-contain\"\n />\n <p v-else class=\"p-6 text-center text-xs text-muted\">\n {{ selected.mimeType }}\n </p>\n </div>\n\n <dl class=\"mt-4 space-y-1 text-xs text-muted\">\n <div class=\"flex justify-between gap-3\">\n <dt>Type</dt>\n <dd>{{ selected.mimeType }}</dd>\n </div>\n <div v-if=\"selected.width\" class=\"flex justify-between gap-3\">\n <dt>Dimensions</dt>\n <dd>{{ selected.width }} × {{ selected.height }}</dd>\n </div>\n <div class=\"flex justify-between gap-3\">\n <dt>Size</dt>\n <dd>{{ formatBytes(selected.size) }}</dd>\n </div>\n </dl>\n\n <!-- The path is the file's identity: it is what a field stores and what\n appears in the diff, so it is worth being able to copy. -->\n <div class=\"mt-3 border-t border-line pt-3\">\n <p class=\"field-label\">Path</p>\n <p class=\"mt-1 break-all font-mono text-[11px]\">{{ selected.path }}</p>\n </div>\n\n <div class=\"mt-3 border-t border-line pt-3\">\n <p class=\"field-label\">Used by</p>\n <p v-if=\"usageProblem\" class=\"mt-1 text-xs text-warning\">{{ usageProblem }}</p>\n <p v-else-if=\"usedBy === null\" class=\"mt-1 text-xs text-muted\">Checking…</p>\n <p v-else-if=\"usedBy.length === 0\" class=\"mt-1 text-xs text-muted\">Nothing uses this file.</p>\n <ul v-else class=\"mt-1 space-y-0.5 text-xs\">\n <li v-for=\"(user, index) in usedBy\" :key=\"index\">\n <RouterLink :to=\"linkTo(user)\" class=\"underline underline-offset-2\">{{ describe(user) }}</RouterLink>\n </li>\n </ul>\n </div>\n\n <div class=\"mt-3 flex gap-2\">\n <button type=\"button\" class=\"btn-secondary flex-1\" @click=\"copyPath(selected.path)\">\n Copy path\n </button>\n <a\n :href=\"api.media.url(selected.path)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"btn-secondary flex-1\"\n >\n Open\n </a>\n </div>\n <button\n type=\"button\"\n class=\"btn-danger mt-2 w-full\"\n :disabled=\"usedBy === null || usedBy.length > 0\"\n @click=\"askDelete([selected.path])\"\n >\n Delete this file\n </button>\n <p v-if=\"usedBy && usedBy.length > 0\" class=\"mt-1 text-xs text-muted\">Remove it where it is used first.</p>\n </aside>\n </div>\n </div>\n\n <ConfirmDialog\n :open=\"confirming !== null\"\n :title=\"`Delete ${confirming?.length === 1 ? 'this file' : `${confirming?.length} files`}?`\"\n confirm-label=\"Delete\"\n destructive\n :busy=\"deleting\"\n @cancel=\"confirming = null\"\n @confirm=\"remove\"\n >\n <p>\n Nothing uses {{ confirming?.length === 1 ? \"it\" : \"them\" }}. {{ confirming?.length === 1 ? \"It leaves\" : \"They leave\" }}\n the website when you publish. Until then, Discard on the Publish page brings\n {{ confirming?.length === 1 ? \"it\" : \"them\" }} back.\n </p>\n <p v-if=\"confirming?.some((path) => neverPublished.has(path))\" class=\"mt-2 text-warning\">\n {{ confirming.filter((path) => neverPublished.has(path)).map((path) => path.split(\"/\").at(-1)).join(\", \") }}\n {{ confirming.filter((path) => neverPublished.has(path)).length === 1 ? \"was\" : \"were\" }} never published: deleting\n cannot be undone.\n </p>\n </ConfirmDialog>\n</template>\n"],"names":["toast","useToast","items","ref","loading","uploading","search","dragging","selected","fileInput","schema","useSchema","staging","useStaging","chosen","toggleChosen","path","next","usedBy","usageProblem","watch","item","uses","unreadable","api","_a","error","_b","ApiError","neverPublished","computed","change","blocked","confirming","deleting","linkTo","describe","askDelete","paths","remove","load","isImage","folderOf","parts","matching","term","folders","groups","folder","group","a","b","totalBytes","sum","stillThere","onMounted","upload","files","list","uploaded","copyPath","_createVNode","PageHeader","_unref","formatBytes","_createElementVNode","_hoisted_1","$event","_createTextVNode","_normalizeClass","_cache","_withModifiers","_hoisted_3","_createElementBlock","_Fragment","_hoisted_4","_toDisplayString","_openBlock","_hoisted_5","_hoisted_6","_hoisted_7","_renderList","_hoisted_8","user","index","_component_RouterLink","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_18","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","ConfirmDialog","_c","_d","_hoisted_43"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a7 as s,g as n,c as a,a as e,i as r,w as d,e as i,m}from"./index-C-WfCDd6.js";const l={},c={class:"grid min-h-[60vh] place-items-center p-6 text-center"};function x(p,t){const o=m("RouterLink");return n(),a("div",c,[e("div",null,[t[1]||(t[1]=e("p",{class:"text-sm font-semibold text-muted"},"Not found",-1)),t[2]||(t[2]=e("h1",{class:"mt-1 text-xl font-semibold tracking-tight"},"This page does not exist",-1)),t[3]||(t[3]=e("p",{class:"mt-1.5 text-sm text-muted"}," The link may be out of date, or the content may have been deleted. ",-1)),r(o,{to:{name:"dashboard"},class:"btn-primary mt-5"},{default:d(()=>[...t[0]||(t[0]=[i("Back to overview",-1)])]),_:1})])])}const f=s(l,[["render",x]]);export{f as default};
|
|
2
|
+
//# sourceMappingURL=NotFoundView-BXXcZp2U.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotFoundView-
|
|
1
|
+
{"version":3,"file":"NotFoundView-BXXcZp2U.js","sources":["../../src/views/NotFoundView.vue"],"sourcesContent":["<template>\n <div class=\"grid min-h-[60vh] place-items-center p-6 text-center\">\n <div>\n <p class=\"text-sm font-semibold text-muted\">Not found</p>\n <h1 class=\"mt-1 text-xl font-semibold tracking-tight\">This page does not exist</h1>\n <p class=\"mt-1.5 text-sm text-muted\">\n The link may be out of date, or the content may have been deleted.\n </p>\n <RouterLink :to=\"{ name: 'dashboard' }\" class=\"btn-primary mt-5\">Back to overview</RouterLink>\n </div>\n </div>\n</template>\n"],"names":["_hoisted_1","_openBlock","_createElementBlock","_createElementVNode","_cache","_createVNode","_component_RouterLink"],"mappings":"gGACOA,EAAA,CAAA,MAAM,sDAAsD,0CAAjE,OAAAC,EAAA,EAAAC,EASM,MATNF,EASM,CARJG,EAOM,MAAA,KAAA,CANJC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,EAAyD,IAAA,CAAtD,MAAM,kCAAkC,EAAC,YAAS,EAAA,GACrDC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,EAAmF,KAAA,CAA/E,MAAM,2CAA2C,EAAC,2BAAwB,EAAA,GAC9EC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,EAEI,IAAA,CAFD,MAAM,2BAA2B,EAAC,uEAErC,EAAA,GACAE,EAA8FC,EAAA,CAAjF,GAAI,CAAA,KAAA,WAAA,EAAuB,MAAM,+BAAmB,IAAgB,CAAA,GAAAF,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,GAAhB,mBAAgB,EAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{d as _,r as w,g as a,c as d,a as m,t as n,k as o,s as x,w as C,b as u,E as y,W as B,v as D,a8 as N,i as S,f as r}from"./index-C-WfCDd6.js";import{f as $}from"./useUnsavedChanges-CErjJu5S.js";import{u as j}from"./ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js";import{C as z}from"./chevron-down-Cn8dXqbz.js";import"./format-CAimH9FV.js";import"./arrow-right-CVMfMI8t.js";import"./ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js";const E={class:"card overflow-hidden"},F={class:"sr-only"},I={class:"text-sm font-semibold"},W={key:0,class:"badge bg-danger-soft text-danger"},O={class:"border-t border-line p-4 sm:p-5"},U={key:0,class:"mb-4 text-xs text-muted"},q={key:0,class:"px-4 pb-3 text-xs font-medium text-danger"},Q=_({__name:"ObjectField",props:{field:{},path:{},issues:{},disabled:{type:Boolean},modelValue:{},collection:{},entrySlug:{}},emits:["update:modelValue"],setup(t,{emit:g}){const s=t,V=g,e=r(()=>s.field),{label:p,error:v}=j(s),f=w(!e.value.collapsed),k=r(()=>s.modelValue&&typeof s.modelValue=="object"?s.modelValue:{}),b=r(()=>{var c;return((c=s.issues)==null?void 0:c.some(l=>l.path.startsWith(`${s.path}.`)))??!1}),i=r(()=>f.value||b.value);return(c,l)=>(a(),d("fieldset",E,[m("legend",F,n(o(p)),1),(a(),x(B(e.value.collapsible?"button":"div"),{type:e.value.collapsible?"button":void 0,"aria-expanded":e.value.collapsible?i.value:void 0,class:y(["flex w-full items-center gap-2 px-4 py-3 text-left",e.value.collapsible&&"hover:bg-canvas"]),onClick:l[0]||(l[0]=h=>e.value.collapsible?f.value=!i.value:void 0)},{default:C(()=>[m("span",I,n(o(p)),1),b.value?(a(),d("span",W," Needs attention ")):u("",!0),e.value.collapsible?(a(),x(o(z),{key:1,size:16,class:y(["ml-auto h-4 w-4 text-muted transition",i.value&&"rotate-180"]),"aria-hidden":"true"},null,8,["class"])):u("",!0)]),_:1},8,["type","aria-expanded","class"])),D(m("div",O,[e.value.description?(a(),d("p",U,n(e.value.description),1)):u("",!0),S($,{fields:e.value.fields,"model-value":k.value,path:t.path,issues:t.issues,disabled:t.disabled||e.value.readonly,collection:t.collection,"entry-slug":t.entrySlug,"onUpdate:modelValue":l[1]||(l[1]=h=>V("update:modelValue",h))},null,8,["fields","model-value","path","issues","disabled","collection","entry-slug"])],512),[[N,i.value]]),o(v)?(a(),d("p",q,n(o(v)),1)):u("",!0)]))}});export{Q as default};
|
|
2
|
+
//# sourceMappingURL=ObjectField-BFAmw-Bf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectField-
|
|
1
|
+
{"version":3,"file":"ObjectField-BFAmw-Bf.js","sources":["../../src/components/fields/ObjectField.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Nested object. Recurses through `FieldList`, so nesting depth is unbounded.\n */\n\nimport { computed, ref } from \"vue\";\nimport { ChevronDown } from \"@lucide/vue\";\n\nimport type { ObjectField } from \"@micacms/core\";\n\nimport FieldList from \"./FieldList.vue\";\nimport { useField, type FieldProps } from \"@/composables/useField\";\n\nconst props = defineProps<\n FieldProps & { modelValue: unknown; collection?: string; entrySlug?: string }\n>();\nconst emit = defineEmits<{ \"update:modelValue\": [Record<string, unknown>] }>();\n\nconst field = computed(() => props.field as ObjectField);\nconst { label, error } = useField(props);\n\nconst open = ref(!field.value.collapsed);\n\nconst value = computed<Record<string, unknown>>(() =>\n props.modelValue && typeof props.modelValue === \"object\"\n ? (props.modelValue as Record<string, unknown>)\n : {},\n);\n\n// A collapsed group that hides an error is a trap; force it open.\nconst hasIssueInside = computed(\n () => props.issues?.some((issue) => issue.path.startsWith(`${props.path}.`)) ?? false,\n);\n\nconst expanded = computed(() => open.value || hasIssueInside.value);\n</script>\n\n<template>\n <fieldset class=\"card overflow-hidden\">\n <legend class=\"sr-only\">{{ label }}</legend>\n\n <component\n :is=\"field.collapsible ? 'button' : 'div'\"\n :type=\"field.collapsible ? 'button' : undefined\"\n :aria-expanded=\"field.collapsible ? expanded : undefined\"\n :class=\"[\n 'flex w-full items-center gap-2 px-4 py-3 text-left',\n field.collapsible && 'hover:bg-canvas',\n ]\"\n @click=\"field.collapsible ? (open = !expanded) : undefined\"\n >\n <span class=\"text-sm font-semibold\">{{ label }}</span>\n\n <span\n v-if=\"hasIssueInside\"\n class=\"badge bg-danger-soft text-danger\"\n >\n Needs attention\n </span>\n\n <ChevronDown\n v-if=\"field.collapsible\"\n :size=\"16\"\n :class=\"['ml-auto h-4 w-4 text-muted transition', expanded && 'rotate-180']\"\n aria-hidden=\"true\"\n />\n </component>\n\n <div v-show=\"expanded\" class=\"border-t border-line p-4 sm:p-5\">\n <p v-if=\"field.description\" class=\"mb-4 text-xs text-muted\">\n {{ field.description }}\n </p>\n\n <FieldList\n :fields=\"field.fields\"\n :model-value=\"value\"\n :path=\"path\"\n :issues=\"issues\"\n :disabled=\"disabled || field.readonly\"\n :collection=\"collection\"\n :entry-slug=\"entrySlug\"\n @update:model-value=\"emit('update:modelValue', $event)\"\n />\n </div>\n\n <p v-if=\"error\" class=\"px-4 pb-3 text-xs font-medium text-danger\">{{ error }}</p>\n </fieldset>\n</template>\n"],"names":["props","__props","emit","__emit","field","computed","label","error","useField","open","ref","value","hasIssueInside","_a","issue","expanded","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","_unref","_createBlock","_resolveDynamicComponent","_normalizeClass","_cache","$event","_hoisted_3","_hoisted_4","ChevronDown","_withDirectives","_hoisted_5","_hoisted_6","_createVNode","FieldList","_hoisted_7"],"mappings":"0+BAaA,MAAMA,EAAQC,EAGRC,EAAOC,EAEPC,EAAQC,EAAS,IAAML,EAAM,KAAoB,EACjD,CAAE,MAAAM,EAAO,MAAAC,GAAUC,EAASR,CAAK,EAEjCS,EAAOC,EAAI,CAACN,EAAM,MAAM,SAAS,EAEjCO,EAAQN,EAAkC,IAC9CL,EAAM,YAAc,OAAOA,EAAM,YAAe,SAC3CA,EAAM,WACP,CAAA,CAAC,EAIDY,EAAiBP,EACrB,IAAA,OAAM,QAAAQ,EAAAb,EAAM,SAAN,YAAAa,EAAc,KAAMC,GAAUA,EAAM,KAAK,WAAW,GAAGd,EAAM,IAAI,GAAG,KAAM,GAAA,EAG5Ee,EAAWV,EAAS,IAAMI,EAAK,OAASG,EAAe,KAAK,gBAIhEI,EAAA,EAAAC,EAgDW,WAhDXC,EAgDW,CA/CTC,EAA4C,SAA5CC,EAA4CC,EAAjBC,EAAAhB,CAAA,CAAK,EAAA,CAAA,OAEhCiB,EAyBYC,EAxBLpB,EAAA,MAAM,YAAW,SAAA,KAAA,EAAA,CACrB,KAAMA,EAAA,MAAM,qBAAyB,OACrC,gBAAeA,EAAA,MAAM,YAAcW,EAAA,MAAW,OAC9C,MAAKU,EAAA,sDAA0ErB,EAAA,MAAM,aAAW,iBAAA,GAIhG,QAAKsB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEvB,QAAM,YAAeK,EAAA,MAAI,CAAIM,EAAA,MAAY,OAAA,aAEjD,IAAsD,CAAtDI,EAAsD,OAAtDS,EAAsDP,EAAfC,EAAAhB,CAAA,CAAK,EAAA,CAAA,EAGpCM,EAAA,WADRK,EAKO,OALPY,EAGC,mBAED,YAGQzB,EAAA,MAAM,iBADdmB,EAKED,EAAAQ,CAAA,EAAA,OAHC,KAAM,GACN,iDAAiDf,EAAA,OAAQ,YAAA,CAAA,EAC1D,cAAY,MAAA,0EAIhBgB,EAAAZ,EAeM,MAfNa,EAeM,CAdK5B,EAAA,MAAM,aAAfY,EAAA,EAAAC,EAEI,IAFJgB,EAEIZ,EADCjB,EAAA,MAAM,WAAW,EAAA,CAAA,YAGtB8B,EASEC,EAAA,CARC,OAAQ/B,EAAA,MAAM,OACd,cAAaO,EAAA,MACb,KAAMV,EAAA,KACN,OAAQA,EAAA,OACR,SAAUA,EAAA,UAAYG,EAAA,MAAM,SAC5B,WAAYH,EAAA,WACZ,aAAYA,EAAA,UACZ,sBAAkByB,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,GAAEzB,EAAI,oBAAsByB,CAAM,EAAA,kGAb5CZ,EAAA,KAAQ,CAAA,GAiBZO,EAAAf,CAAA,OAATU,EAAiF,IAAjFmB,EAAiFf,EAAZC,EAAAf,CAAA,CAAK,EAAA,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{H as r,d as l,c as n,a as t,s as d,w as m,b as o,t as a,I as x,m as u,g as s,i as k,k as f,e as h}from"./index-C-WfCDd6.js";/**
|
|
2
|
+
* @license @lucide/vue v1.55.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const b={name:"chevron-left",size:24,node:[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]},_=r(b),g={class:"border-b border-line bg-raised"},p={class:"mx-auto flex max-w-5xl flex-wrap items-center gap-4 px-4 py-4 sm:px-6"},v={class:"min-w-0 flex-1"},w={class:"truncate font-display text-2xl font-normal leading-8 tracking-tight"},y={key:1,class:"mt-1 truncate text-xs text-muted"},L={class:"flex shrink-0 items-center gap-2"},N=l({__name:"PageHeader",props:{title:{},subtitle:{},back:{},backLabel:{}},setup(e){return(c,B)=>{const i=u("RouterLink");return s(),n("header",g,[t("div",p,[t("div",v,[e.back?(s(),d(i,{key:0,to:e.back,class:"mb-0.5 inline-flex items-center gap-1 text-xs font-medium text-muted hover:text-ink"},{default:m(()=>[k(f(_),{size:14,"aria-hidden":"true"}),h(" "+a(e.backLabel??"Back"),1)]),_:1},8,["to"])):o("",!0),t("h1",w,a(e.title),1),e.subtitle?(s(),n("p",y,a(e.subtitle),1)):o("",!0)]),t("div",L,[x(c.$slots,"default")])])])}}});export{N as _};
|
|
7
|
+
//# sourceMappingURL=PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.55.0_vue@3.5.43_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/chevron-left.mjs","../../src/components/PageHeader.vue"],"sourcesContent":["/**\n * @license @lucide/vue v1.55.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"chevron-left\",\n size: 24,\n node: [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]]\n};\nconst ChevronLeft = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.mjs.map\n","<script setup lang=\"ts\">\nimport { ChevronLeft } from \"@lucide/vue\";\n\ndefineProps<{\n title: string;\n subtitle?: string | null;\n /** Rendered as a back link above the title. */\n back?: { name: string; params?: Record<string, string> } | null;\n backLabel?: string;\n}>();\n</script>\n\n<template>\n <header class=\"border-b border-line bg-raised\">\n <div class=\"mx-auto flex max-w-5xl flex-wrap items-center gap-4 px-4 py-4 sm:px-6\">\n <div class=\"min-w-0 flex-1\">\n <RouterLink\n v-if=\"back\"\n :to=\"back\"\n class=\"mb-0.5 inline-flex items-center gap-1 text-xs font-medium text-muted hover:text-ink\"\n >\n <ChevronLeft :size=\"14\" aria-hidden=\"true\" />\n {{ backLabel ?? \"Back\" }}\n </RouterLink>\n\n <h1 class=\"truncate font-display text-2xl font-normal leading-8 tracking-tight\">{{ title }}</h1>\n <p v-if=\"subtitle\" class=\"mt-1 truncate text-xs text-muted\">{{ subtitle }}</p>\n </div>\n\n <div class=\"flex shrink-0 items-center gap-2\">\n <slot />\n </div>\n </div>\n </header>\n</template>\n"],"names":["__iconData","ChevronLeft","createLucideIcon","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_3","__props","_createBlock","_component_RouterLink","_createVNode","_unref","_createTextVNode","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6","_renderSlot","_ctx"],"mappings":"mIAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,KAAM,eACN,KAAM,GACN,KAAM,CAAC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,SAAU,CAAC,CACzD,EACMC,EAAcC,EAAiBF,CAAU,ocCD7C,OAAAG,EAAA,EAAAC,EAoBS,SApBTC,EAoBS,CAnBPC,EAkBM,MAlBNC,EAkBM,CAjBJD,EAYM,MAZNE,EAYM,CAVIC,EAAA,UADRC,EAOaC,EAAA,OALV,GAAIF,EAAA,KACL,MAAM,qFAAA,aAEN,IAA6C,CAA7CG,EAA6CC,EAAAZ,CAAA,EAAA,CAA/B,KAAM,GAAI,cAAY,MAAA,GAASa,EAAA,MAC1CL,EAAA,WAAS,MAAA,EAAA,CAAA,CAAA,4BAGdH,EAAgG,KAAhGS,EAAgGC,EAAbP,EAAA,KAAK,EAAA,CAAA,EAC/EA,EAAA,cAATL,EAA8E,IAA9Ea,EAA8ED,EAAfP,EAAA,QAAQ,EAAA,CAAA,cAGzEH,EAEM,MAFNY,EAEM,CADJC,EAAQC,EAAA,OAAA,SAAA,CAAA","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{H as a,d as n,c as o,a as s,t as r,g as i}from"./index-C-WfCDd6.js";/**
|
|
2
|
+
* @license @lucide/vue v1.55.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const c={name:"plus",size:24,node:[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]},_=a(c),d={role:"status",class:"mb-5 rounded-md border border-warning/15 bg-warning-soft p-4"},m={class:"mt-1 text-xs text-muted"},u=n({__name:"ReadOnlyNotice",props:{reason:{}},setup(t){return(p,e)=>(i(),o("div",d,[e[0]||(e[0]=s("p",{class:"text-sm font-medium text-warning"},"Read-only in this version of Mica",-1)),s("p",m,r(t.reason),1)]))}});export{_ as P,u as _};
|
|
7
|
+
//# sourceMappingURL=ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.55.0_vue@3.5.43_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/plus.mjs","../../src/components/ReadOnlyNotice.vue"],"sourcesContent":["/**\n * @license @lucide/vue v1.55.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"plus\",\n size: 24,\n node: [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n ]\n};\nconst Plus = createLucideIcon(__iconData);\n\nexport { __iconData, Plus as default };\n//# sourceMappingURL=plus.mjs.map\n","<script setup lang=\"ts\">\n/** Why this collection or singleton cannot be edited here: the model is newer than this Mica. */\ndefineProps<{ reason: string }>();\n</script>\n\n<template>\n <div role=\"status\" class=\"mb-5 rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">Read-only in this version of Mica</p>\n <p class=\"mt-1 text-xs text-muted\">{{ reason }}</p>\n </div>\n</template>\n"],"names":["__iconData","Plus","createLucideIcon","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_toDisplayString","__props"],"mappings":"2EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,EAAa,CACjB,KAAM,OACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,EACzC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC7C,CACA,EACMC,EAAOC,EAAiBF,CAAU,mMCXtCG,EAAA,EAAAC,EAGM,MAHNC,EAGM,CAFJC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAiF,IAAA,CAA9E,MAAM,kCAAA,EAAmC,oCAAiC,EAAA,GAC7EA,EAAmD,IAAnDC,EAAmDC,EAAbC,EAAA,MAAM,EAAA,CAAA,CAAA","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import{H as w,d as j,g as d,c,a as o,e as V,t as r,k as h,b,F as B,j as R,i as v,E as H,v as I,a8 as U,f as _,r as E}from"./index-C-WfCDd6.js";import{f as P,i as T}from"./useUnsavedChanges-CErjJu5S.js";import{u as q,h as W}from"./ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js";import{C as G}from"./chevron-down-Cn8dXqbz.js";import{A as J,a as K}from"./arrow-up-D5CzEqmi.js";import{P as O}from"./ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js";import"./format-CAimH9FV.js";import"./arrow-right-CVMfMI8t.js";import"./ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js";/**
|
|
2
|
+
* @license @lucide/vue v1.55.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const Q={name:"copy",size:24,node:[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]},X=w(Q);/**
|
|
7
|
+
* @license @lucide/vue v1.55.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const Y={name:"trash",size:24,node:[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],aliases:["trash-2"]},Z=w(Y),ee={class:"field-label mb-1.5"},te={key:0,class:"text-danger","aria-hidden":"true"},ae={key:0,class:"field-hint -mt-1 mb-2"},se={key:1,class:"space-y-2"},le={class:"flex items-center gap-1 bg-canvas/60 px-3 py-2"},oe=["aria-expanded","onClick"],ne={class:"truncate text-sm font-medium"},ie={key:0,class:"badge shrink-0 bg-danger-soft text-danger"},de={class:"flex shrink-0 items-center gap-0.5"},ce=["disabled","onClick"],re={class:"sr-only"},ue=["disabled","onClick"],he={class:"sr-only"},me=["disabled","onClick"],ve={class:"sr-only"},pe=["disabled","onClick"],fe={class:"sr-only"},ye={class:"border-t border-line p-4"},be={key:2,class:"rounded-lg border border-dashed border-line px-4 py-5 text-center text-sm text-muted"},_e=["disabled"],ge={key:3,class:"ml-2 text-xs text-muted"},ke={key:4,class:"field-error"},Se=j({__name:"RepeaterField",props:{field:{},path:{},issues:{},disabled:{type:Boolean},modelValue:{},collection:{},entrySlug:{}},emits:["update:modelValue"],setup(i,{emit:x}){const p=i,$=x,l=_(()=>p.field),{label:M,error:k}=q(p),m=E(new Set),n=_(()=>Array.isArray(p.modelValue)?p.modelValue:[]),g=_(()=>l.value.max!==void 0&&n.value.length>=l.value.max),z=_(()=>l.value.min!==void 0&&n.value.length<=l.value.min);function f(a,t){var u;const s=l.value.itemLabel,e=s?a[s]:void 0;return typeof e=="string"&&e.trim()?e.trim():`${W(((u=l.value.addLabel)==null?void 0:u.replace(/^Add\s+/i,""))??"Item")} ${t+1}`}function A(a){var t;return((t=p.issues)==null?void 0:t.some(s=>s.path.startsWith(`${p.path}.${a}.`)))??!1}function y(a){$("update:modelValue",a)}function D(){y([...n.value,T(l.value.fields)])}function S(a){const t=n.value[a];if(!t)return;const s=[...n.value];s.splice(a+1,0,structuredClone(t)),y(s)}function N(a){y(n.value.filter((t,s)=>s!==a)),m.value=new Set([...m.value].filter(t=>t!==a).map(t=>t>a?t-1:t))}function C(a,t){const s=a+t;if(s<0||s>=n.value.length)return;const e=[...n.value];[e[a],e[s]]=[e[s],e[a]],y(e)}function F(a,t){y(n.value.map((s,e)=>e===a?t:s))}function L(a){const t=new Set(m.value);t.has(a)?t.delete(a):t.add(a),m.value=t}return(a,t)=>(d(),c("fieldset",null,[o("legend",ee,[V(r(h(M))+" ",1),l.value.required?(d(),c("span",te,"*")):b("",!0)]),l.value.description?(d(),c("p",ae,r(l.value.description),1)):b("",!0),n.value.length?(d(),c("ol",se,[(d(!0),c(B,null,R(n.value,(s,e)=>(d(),c("li",{key:e,class:"card overflow-hidden"},[o("div",le,[o("button",{type:"button",class:"flex min-w-0 flex-1 items-center gap-2 text-left","aria-expanded":!m.value.has(e),onClick:u=>L(e)},[v(h(G),{size:16,class:H(["h-4 w-4 shrink-0 text-muted transition",!m.value.has(e)&&"rotate-180"]),"aria-hidden":"true"},null,8,["class"]),o("span",ne,r(f(s,e)),1),A(e)?(d(),c("span",ie," Needs attention ")):b("",!0)],8,oe),o("div",de,[o("button",{type:"button",class:"btn-ghost px-1.5 py-1",disabled:i.disabled||e===0,onClick:u=>C(e,-1)},[v(h(J),{size:16,"aria-hidden":"true"}),o("span",re,'Move "'+r(f(s,e))+'" up',1)],8,ce),o("button",{type:"button",class:"btn-ghost px-1.5 py-1",disabled:i.disabled||e===n.value.length-1,onClick:u=>C(e,1)},[v(h(K),{size:16,"aria-hidden":"true"}),o("span",he,'Move "'+r(f(s,e))+'" down',1)],8,ue),o("button",{type:"button",class:"btn-ghost px-1.5 py-1",disabled:i.disabled||g.value,onClick:u=>S(e)},[v(h(X),{size:16,"aria-hidden":"true"}),o("span",ve,'Duplicate "'+r(f(s,e))+'"',1)],8,me),o("button",{type:"button",class:"btn-ghost px-1.5 py-1 hover:text-danger",disabled:i.disabled||z.value,onClick:u=>N(e)},[v(h(Z),{size:16,"aria-hidden":"true"}),o("span",fe,'Remove "'+r(f(s,e))+'"',1)],8,pe)])]),I(o("div",ye,[v(P,{fields:l.value.fields,"model-value":s,path:`${i.path}.${e}`,issues:i.issues,disabled:i.disabled||l.value.readonly,collection:i.collection,"entry-slug":i.entrySlug,"onUpdate:modelValue":u=>F(e,u)},null,8,["fields","model-value","path","issues","disabled","collection","entry-slug","onUpdate:modelValue"])],512),[[U,!m.value.has(e)]])]))),128))])):(d(),c("p",be," Nothing added yet. ")),o("button",{type:"button",class:"btn-secondary mt-2",disabled:i.disabled||l.value.readonly||g.value,onClick:D},[v(h(O),{size:16,"aria-hidden":"true"}),V(" "+r(l.value.addLabel??"Add item"),1)],8,_e),g.value?(d(),c("span",ge," Maximum of "+r(l.value.max)+" reached. ",1)):b("",!0),h(k)?(d(),c("p",ke,r(h(k)),1)):b("",!0)]))}});export{Se as default};
|
|
12
|
+
//# sourceMappingURL=RepeaterField-BA5zPM54.js.map
|