@webx-ui/module-inbox 0.11.0 → 0.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{FormEditorPage-B2Q0gTp3.js → FormEditorPage-DhlICloH.js} +2 -2
- package/dist/{FormEditorPage-B2Q0gTp3.js.map → FormEditorPage-DhlICloH.js.map} +1 -1
- package/dist/{InboxPage-iMQ0pjrR.js → InboxPage-GX_vLaDG.js} +30 -28
- package/dist/InboxPage-GX_vLaDG.js.map +1 -0
- package/dist/{StatusesPage-arNMRLzM.js → StatusesPage-BOjY4W1p.js} +2 -2
- package/dist/{StatusesPage-arNMRLzM.js.map → StatusesPage-BOjY4W1p.js.map} +1 -1
- package/dist/{SubmissionPage-BDI8xL0N.js → SubmissionPage-DKU21Oox.js} +2 -2
- package/dist/{SubmissionPage-BDI8xL0N.js.map → SubmissionPage-DKU21Oox.js.map} +1 -1
- package/dist/{index-gLN73Ici.js → index-BpBqmOqV.js} +83 -83
- package/dist/{index-gLN73Ici.js.map → index-BpBqmOqV.js.map} +1 -1
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +3 -3
- package/dist/InboxPage-iMQ0pjrR.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "vue";
|
|
2
|
-
import { e as x, b as i, F as b, W as n, f as e, g as t, h as I, S, i as W, c as r, j as m, k as F, o as g } from "./index-
|
|
2
|
+
import { e as x, b as i, F as b, W as n, f as e, g as t, h as I, S, i as W, c as r, j as m, k as F, o as g } from "./index-BpBqmOqV.js";
|
|
3
3
|
export {
|
|
4
4
|
x as FIELD_TYPES,
|
|
5
5
|
i as STATUS_COLORS,
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.wx-inbox-form-field[data-v-91f60441]{display:flex;flex-direction:column;gap:var(--wx-space-8);min-width:0}.wx-inbox-form-field__chosen[data-v-91f60441]{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0;padding:var(--wx-space-6) var(--wx-space-8) var(--wx-space-6) var(--wx-space-12);border:1px solid var(--wx-border-default);border-radius:var(--wx-radius-control);background:var(--wx-bg-surface)}.wx-inbox-form-field__text[data-v-91f60441]{display:flex;flex-direction:column;flex:1 1 auto;min-width:0}.wx-inbox-form-field__title[data-v-91f60441],.wx-inbox-form-field__slug[data-v-91f60441]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-inbox-form-field__slug[data-v-91f60441],.wx-inbox-form-field__empty[data-v-91f60441]{font-size:var(--wx-font-size-sm);color:var(--wx-text-muted)}.wx-inbox-form-field__empty[data-v-91f60441]{margin:0}.wx-inbox-form-field[data-v-91f60441] .wx-badge{flex:none}.wx-inbox-by-hand[data-v-72006299]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-submissions[data-v-
|
|
1
|
+
.wx-inbox-form-field[data-v-91f60441]{display:flex;flex-direction:column;gap:var(--wx-space-8);min-width:0}.wx-inbox-form-field__chosen[data-v-91f60441]{display:flex;align-items:center;gap:var(--wx-space-8);min-width:0;padding:var(--wx-space-6) var(--wx-space-8) var(--wx-space-6) var(--wx-space-12);border:1px solid var(--wx-border-default);border-radius:var(--wx-radius-control);background:var(--wx-bg-surface)}.wx-inbox-form-field__text[data-v-91f60441]{display:flex;flex-direction:column;flex:1 1 auto;min-width:0}.wx-inbox-form-field__title[data-v-91f60441],.wx-inbox-form-field__slug[data-v-91f60441]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wx-inbox-form-field__slug[data-v-91f60441],.wx-inbox-form-field__empty[data-v-91f60441]{font-size:var(--wx-font-size-sm);color:var(--wx-text-muted)}.wx-inbox-form-field__empty[data-v-91f60441]{margin:0}.wx-inbox-form-field[data-v-91f60441] .wx-badge{flex:none}.wx-inbox-by-hand[data-v-72006299]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-submissions[data-v-c743b9e7]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));padding:var(--wx-gap, var(--wx-space-16));min-width:0}.wx-submissions__head[data-v-c743b9e7] .wx-screen-head__subtitle{font-family:var(--wx-font-family-mono)}.wx-submissions__views[data-v-c743b9e7] .wx-tabs__panels{padding-top:var(--wx-space-8)}.wx-submissions__views[data-v-c743b9e7] .wx-table--flush .wx-table__header{padding-bottom:var(--wx-space-8)}.wx-submissions__mass[data-v-c743b9e7]{display:flex;align-items:center;gap:var(--wx-space-8);flex-wrap:wrap}.wx-submissions[data-v-c743b9e7] .wx-submissions__when{white-space:nowrap}.wx-submissions__state[data-v-c743b9e7]{display:flex;align-items:center;flex-wrap:wrap;gap:var(--wx-space-6);min-width:0}.wx-submissions[data-v-c743b9e7] .is-unread{font-weight:var(--wx-font-weight-medium)}.wx-submissions[data-v-c743b9e7] .is-unread td:first-child{box-shadow:inset 2px 0 0 0 var(--wx-color-primary)}.wx-inbox-field-form[data-v-8b202bc1]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-inbox-field-form__row[data-v-8b202bc1]{display:flex;flex-wrap:wrap;gap:var(--wx-space-12)}.wx-inbox-field-form__row[data-v-8b202bc1]>*{flex:1 1 200px;min-width:0}.wx-inbox-field-form__row[data-v-8b202bc1]:empty{display:none}.wx-inbox-field-form__advanced[data-v-8b202bc1]{display:flex;flex-direction:column;gap:var(--wx-space-8);padding-block-start:var(--wx-space-12);border-block-start:1px solid var(--wx-border-muted)}.wx-inbox-field-form__checks[data-v-8b202bc1]{display:flex;flex-wrap:wrap;gap:var(--wx-space-16)}.wx-inbox-choices[data-v-8b202bc1]{display:flex;flex-direction:column;gap:var(--wx-space-8);align-items:flex-start}.wx-inbox-choices__row[data-v-8b202bc1]{display:flex;align-items:center;gap:var(--wx-space-8);width:100%}.wx-inbox-choices__row[data-v-8b202bc1]>:first-child{flex:0 1 180px;min-width:0}.wx-inbox-choices__row[data-v-8b202bc1]>:nth-child(2){flex:1 1 auto;min-width:0}.wx-inbox-field[data-v-5d9f662e]{display:flex;flex-direction:column;gap:var(--wx-space-2);flex:1 1 auto;min-width:0}.wx-inbox-field__name[data-v-5d9f662e]{display:flex;align-items:center;gap:var(--wx-space-6);min-width:0}.wx-inbox-create[data-v-55fb40d8]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-inbox>.wx-card__body{display:flex;flex-direction:column;overflow:clip;border-radius:inherit}.wx-inbox__loading{padding:var(--wx-space-16)}.wx-inbox__forms{padding:var(--wx-gap, var(--wx-space-16)) var(--wx-space-12) var(--wx-space-8)}.wx-inbox__forms.is-panel{padding:0}.wx-inbox__forms.is-plain .wx-sortable-list__row{padding-inline:var(--wx-space-8)}.wx-inbox__forms.is-plain .wx-sortable-list__head{margin-block-end:var(--wx-space-6);padding-inline:var(--wx-space-8)}.wx-inbox__forms.is-plain .wx-sortable-list__head{min-height:var(--wx-size-control-md)}.wx-inbox__forms.is-plain .wx-sortable-list__title{line-height:calc(var(--wx-font-size-xl) * var(--wx-font-line-height-tight))}.wx-inbox-form{display:flex;flex-direction:column;gap:var(--wx-space-2);align-items:flex-start;flex:1 1 auto;width:100%;min-width:0;padding:0;border:0;background:none;font:inherit;color:inherit;text-align:start;cursor:pointer}.wx-inbox-form__name{display:flex;align-items:center;gap:var(--wx-space-6);min-width:0;max-width:100%}.wx-inbox-form.is-off .wx-inbox-form__name>.wx-text{text-decoration:line-through}.wx-inbox-form.is-current{color:var(--wx-color-primary)}.wx-inbox-form__silent{flex:none;color:var(--wx-color-warning)}.wx-inbox-form__count{flex:0 0 auto}.wx-inbox-status-form[data-v-b520b53b]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-inbox-status-form__checks[data-v-b520b53b]{display:flex;flex-wrap:wrap;gap:var(--wx-space-16)}.wx-inbox-statuses[data-v-ba548af9]{display:flex;flex-direction:column;align-items:flex-start;gap:var(--wx-space-12)}.wx-inbox-statuses>.wx-list-screen[data-v-ba548af9]{align-self:stretch}.wx-inbox-status[data-v-ba548af9]{display:flex;align-items:center;gap:var(--wx-space-8);flex:1 1 auto;min-width:0;flex-wrap:wrap}.wx-inbox-embed[data-v-7f9788ed]{display:flex;flex-direction:column;gap:var(--wx-space-16)}.wx-inbox-embed__snippet[data-v-7f9788ed]{display:flex;align-items:center;gap:var(--wx-space-8);margin-top:var(--wx-space-12);padding:var(--wx-space-10) var(--wx-space-12);border:1px solid var(--wx-border-default);border-radius:var(--wx-radius-md);background:var(--wx-bg-subtle)}.wx-inbox-embed__snippet code[data-v-7f9788ed]{flex:1 1 auto;min-width:0;overflow-x:auto;white-space:pre;font-family:var(--wx-font-family-mono);font-size:var(--wx-font-size-sm)}.wx-inbox-general[data-v-1065e341]{display:flex;flex-direction:column;gap:var(--wx-space-16)}.wx-inbox-notifications__way[data-v-5fc21abd]{display:flex;flex-direction:column;gap:var(--wx-space-4)}.wx-inbox-notifications__route[data-v-5fc21abd]{display:flex;flex-direction:column;gap:var(--wx-space-4);max-width:var(--wx-field-max-width, 640px)}.wx-inbox-recipients[data-v-5fc21abd]{display:flex;flex-direction:column;gap:var(--wx-space-8);margin-block:var(--wx-space-8) var(--wx-space-12);max-width:var(--wx-field-max-width, 640px)}.wx-inbox-channels[data-v-5fc21abd]{display:flex;flex-direction:column;align-items:flex-start;gap:var(--wx-space-8);margin-block-start:var(--wx-space-8);max-width:var(--wx-field-max-width, 640px)}.wx-inbox-channels[data-v-5fc21abd]>:first-child{align-self:stretch}.wx-inbox-recipients__item[data-v-5fc21abd]{display:flex;flex-direction:column;gap:var(--wx-space-4)}.wx-inbox-recipients__row[data-v-5fc21abd]{display:flex;align-items:center;gap:var(--wx-space-8)}.wx-inbox-recipients__row[data-v-5fc21abd]>:first-child{flex:1 1 auto;min-width:0}.wx-inbox-editor[data-v-1d18ccd2]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16))}.wx-inbox-editor__head[data-v-1d18ccd2] .wx-screen-head__subtitle{font-family:var(--wx-font-family-mono)}.wx-inbox-editor__tabs[data-v-1d18ccd2]{flex:1 1 auto}.wx-submission[data-v-d78eb931]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));min-width:0;container-type:inline-size}.wx-submission__panes[data-v-d78eb931],.wx-submission__main[data-v-d78eb931],.wx-submission__aside[data-v-d78eb931]{display:flex;flex-direction:column;gap:var(--wx-gap, var(--wx-space-16));min-width:0}@container (min-width: 900px){.wx-submission__panes[data-v-d78eb931]{flex-direction:row;align-items:flex-start}.wx-submission__main[data-v-d78eb931]{flex:1 1 auto}.wx-submission__aside[data-v-d78eb931]{flex:0 0 320px;max-width:320px}}.wx-submission__value[data-v-d78eb931]{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}.wx-submission__value.is-enclosure[data-v-d78eb931]{font-family:var(--wx-font-family-mono);font-size:var(--wx-font-size-sm)}.wx-submission__detail[data-v-d78eb931]{overflow-wrap:anywhere}.wx-submission__notification[data-v-d78eb931]{display:flex;flex-direction:column;gap:var(--wx-space-8)}.wx-submission__hint[data-v-d78eb931]{display:block}.wx-submission__recipients[data-v-d78eb931]{display:flex;flex-direction:column;gap:var(--wx-space-4);margin:0;padding:0;list-style:none}.wx-submission__recipients li[data-v-d78eb931]{display:flex;flex-wrap:wrap;align-items:center;gap:var(--wx-space-8);overflow-wrap:anywhere}.wx-submission__recipients li.wx-submission__channel[data-v-d78eb931]{flex-wrap:nowrap;justify-content:space-between;align-items:flex-start}.wx-submission__channel-text[data-v-d78eb931]{display:flex;flex-direction:column;min-width:0}.wx-submission__event[data-v-d78eb931]{margin:0}.wx-submission__by[data-v-d78eb931]{display:flex;align-items:baseline;gap:var(--wx-space-6);flex-wrap:wrap;margin:0}.wx-submission__files[data-v-d78eb931]{display:flex;flex-wrap:wrap;gap:var(--wx-space-8)}.wx-submission__fields[data-v-d78eb931]{display:flex;flex-direction:column;gap:var(--wx-space-12)}.wx-submission__field[data-v-d78eb931]{display:flex;flex-direction:column;gap:var(--wx-space-4)}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webx-ui/module-inbox",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.2",
|
|
4
4
|
"description": "Forms and submissions for the WebX UI admin panel: the forms of a site, their fields, their statuses, and what has come in through them.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"vue-router": "^4.5.0"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@webx-ui/core": "^0.45.
|
|
48
|
-
"@webx-ui/module-admin": "^0.33.
|
|
47
|
+
"@webx-ui/core": "^0.45.3",
|
|
48
|
+
"@webx-ui/module-admin": "^0.33.1"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@types/node": "^24.10.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InboxPage-iMQ0pjrR.js","sources":["../src/FormCreateDialog.vue","../src/InboxPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate } from '@webx-ui/module-admin'\nimport {\n toast,\n useModal,\n WxButton,\n WxDialog,\n WxFormItem,\n WxInput,\n WxSpace,\n type LocalizedValue,\n} from '@webx-ui/core'\nimport { createInboxApi } from './api'\nimport { useInboxMessages } from './i18n'\nimport type { InboxForm } from './types'\n\n/**\n * A form, started.\n *\n * Two fields, because a form has nothing else until it has questions: what it is called and\n * where it answers. Everything else — who is written to, what happens after sending, the\n * antispam — belongs to the editor, and asking for it before the form exists would be a\n * dialog longer than the screen it leads to.\n *\n * The address is typed rather than made out of the title. A page's address is a sentence\n * transliterated; a form's is a short word somebody chooses once and then writes into a\n * template by hand, and guessing `svyazhites-s-nami` for them helps nobody.\n */\nconst { resolve, dismiss, open } = useModal<InboxForm>()\n\nconst context = useAdmin()\nconst api = createInboxApi(context)\nuseInboxMessages()\n\nconst t = useTranslate('webx-inbox')\n/* Not the server's `message`: the panel says how a request failed in its own words. */\nconst message = useErrorText()\n\nconst title = ref<LocalizedValue>({})\nconst slug = ref('')\nconst saving = ref(false)\nconst errors = ref<Record<string, string[]>>({})\n\nfunction errorOf(field: string): string | undefined {\n return errors.value[field]?.[0]\n}\n\nasync function save(): Promise<void> {\n saving.value = true\n errors.value = {}\n\n try {\n resolve(\n await api.createForm({\n title: title.value,\n slug: slug.value.trim(),\n is_enabled: true,\n options: {},\n }),\n )\n } catch (error) {\n const body = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (body?.errors) {\n errors.value = body.errors\n toast.danger(t('panel.failed'))\n } else {\n toast.danger(message(error))\n }\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"t('panel.new-form-title')\" :width=\"520\">\n <div class=\"wx-inbox-create\">\n <wx-form-item :label=\"t('panel.title')\" :error=\"errorOf('title')\" required>\n <wx-input v-model=\"title\" localized autofocus />\n </wx-form-item>\n\n <wx-form-item :label=\"t('panel.slug')\" :help=\"t('panel.slug-help')\" :error=\"errorOf('slug')\">\n <wx-input v-model=\"slug\" placeholder=\"contact\" />\n </wx-form-item>\n </div>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"dismiss()\">{{ t('panel.cancel') }}</wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" @click=\"save\">\n {{ t('panel.save') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-inbox-create {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, useTemplateRef, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n useAdmin,\n useErrorText,\n useTranslate,\n WxListScreen,\n WxRowMenu,\n type RowAction,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport {\n confirm,\n createModal,\n localizedValue,\n toast,\n useLocales,\n WxAction,\n WxButton,\n WxCard,\n WxEmpty,\n WxIcon,\n WxIndicator,\n WxListDetail,\n WxSkeleton,\n WxSortableList,\n WxText,\n} from '@webx-ui/core'\nimport FormCreateDialog from './FormCreateDialog.vue'\nimport SubmissionList from './SubmissionList.vue'\nimport { createInboxApi } from './api'\nimport { useInboxMessages } from './i18n'\nimport type { InboxForm } from './types'\n\n/**\n * The section: the forms of the site on the left, what came in through one of them on the\n * right (§11, §2.12).\n *\n * One screen rather than two, and that is the decision this is built around. The columns of\n * the list are the fields of the chosen form, so a list of everything would have no columns\n * to speak of; and the two questions somebody opens this section to ask — \"what is new\" and\n * \"what does this form ask\" — are one click apart instead of one screen apart.\n *\n * Which of the two is the screen and which is the chooser is the second decision. The forms\n * are the chooser: they are the `filters` column of the pane, so on a phone they fold into a\n * panel and the submissions are what the section opens on. The other way round — forms as the\n * list, submissions as the record beside it — is what this was, and it cost the reader a\n * screen: somebody who opens the section is asking what came in, and was shown a list of\n * three form names instead, every time.\n *\n * One form is therefore always open (the first, unless the address names another), and what\n * is here is the column: the forms, in the order somebody dragged them, with what is waiting\n * in each.\n */\nconst props = withDefaults(defineProps<{ base?: string }>(), { base: '/inbox' })\n\nconst context = useAdmin()\nconst api = createInboxApi(context)\nconst route = useRoute()\nconst router = useRouter()\nconst locales = useLocales()\nuseInboxMessages()\n\nconst t = useTranslate('webx-inbox')\n/* Not the server's `message`: the panel says how a request failed in its own words. */\nconst message = useErrorText()\n\nconst forms = ref<InboxForm[]>([])\nconst loading = ref(true)\n\n/** The list of submissions, for the one action of its own that the section's head carries. */\nconst pane = useTemplateRef<{ create: () => void }>('pane')\n\n/**\n * Whether the forms still have a column, and whether their panel is up.\n *\n * Both live here rather than inside the pane because the way to the forms is in the head of\n * the section, beside its other actions — a button that appears exactly when the column is\n * gone. The pane says when that is.\n */\nconst columnInline = ref(true)\nconst formsOpen = ref(false)\n\nconst canManage = computed(() => context.can('inbox.manage'))\n\nconst create = createModal<InboxForm, Record<string, never>>(FormCreateDialog)\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'inbox')?.title ??\n t('module.title'),\n)\n\n/**\n * Which form is open, kept in the address.\n *\n * So that coming back from a submission lands on the form it belonged to (§11) — and so that\n * a link to \"the callback form\" is a link somebody can send.\n */\nconst current = computed<number | null>(() => {\n const asked = route.query.form\n\n return typeof asked === 'string' && asked !== '' ? Number(asked) : null\n})\n\nconst chosen = computed(() => forms.value.find((form) => form.id === current.value) ?? null)\n\nfunction name(form: InboxForm): string {\n return localizedValue(form.title, locales.active.value, form.slug)\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n forms.value = await api.forms()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nvoid load()\n\n/**\n * One form is always open, and the address always says which.\n *\n * The section is the submissions, so the first form stands in until somebody picks another —\n * on a phone especially, where the alternative is opening the panel before seeing anything at\n * all. It covers the address that names no form, the address that names one that has since\n * been deleted, and the list arriving after the address did; `replace`, because none of the\n * three is a place worth going back to.\n */\nwatch([forms, chosen], () => {\n if (forms.value.length === 0 || chosen.value !== null) return\n\n void router.replace({ query: { ...route.query, form: String(forms.value[0].id) } })\n})\n\nfunction choose(form: InboxForm, close: () => void): void {\n void router.replace({ query: { ...route.query, form: String(form.id) } })\n /* Picked from the panel: the panel has done its job. It is a column on a wide screen, and\n closing what is not open does nothing there. */\n close()\n}\n\nfunction edit(form: InboxForm): void {\n void router.push(`${props.base}/forms/${form.id}`)\n}\n\nfunction actionsFor(form: InboxForm): RowAction[] {\n if (!canManage.value) return []\n\n return [\n { key: 'settings', icon: 'settings', label: t('panel.settings'), run: () => edit(form) },\n { key: 'duplicate', icon: 'copy', label: t('panel.duplicate'), run: () => duplicate(form) },\n // A form that has taken submissions is switched off, never deleted (§2.4). The line is\n // left out rather than greyed: a menu is a list of what is possible.\n ...(form.submissions_count === 0\n ? [\n {\n key: 'delete',\n icon: 'trash' as const,\n label: t('panel.delete'),\n danger: true,\n run: () => remove(form),\n },\n ]\n : []),\n ]\n}\n\nasync function add(): Promise<void> {\n const made = await create({})\n\n if (made) {\n await load()\n edit(made)\n }\n}\n\nasync function duplicate(form: InboxForm): Promise<void> {\n try {\n const copy = await api.duplicateForm(form.id)\n toast.success(t('panel.duplicated'))\n await load()\n edit(copy)\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function remove(form: InboxForm): Promise<void> {\n const agreed = await confirm({\n title: t('panel.delete-form-title', { form: name(form) }),\n message: t('panel.delete-form-text'),\n confirmText: t('panel.delete'),\n cancelText: t('panel.cancel'),\n tone: 'danger',\n })\n\n if (!agreed) return\n\n try {\n await api.removeForm(form.id)\n toast.success(t('panel.deleted'))\n\n /* The address named the form that is gone; what stands in its place is decided above. */\n if (current.value === form.id) {\n const rest = { ...route.query }\n delete rest.form\n void router.replace({ query: rest })\n }\n\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\n/**\n * The whole order, every time.\n *\n * The list is already in its new order on screen — `WxSortableList` reorders the model before\n * it says anything — so this only has to agree with what is there, and a failure has to put\n * the list back rather than leave the screen disagreeing with the database.\n */\nasync function reorder(): Promise<void> {\n try {\n await api.sortForms(forms.value.map((form) => form.id))\n } catch (error) {\n toast.danger(message(error, t('panel.reorder-failed')))\n await load()\n }\n}\n\n/**\n * What the section offers. Declared, because on a phone the head folds it into the ···.\n *\n * The one it exists for is a submission, not a form: this is the inbox, and the section is\n * opened dozens of times for what came in for every once that a form is added. A new form is\n * the `+` over the list of forms — beside the thing it makes one more of — and what used to\n * stand here as the primary button was that, which is why it was the biggest thing on the\n * screen and almost never what anybody wanted.\n */\nconst actions = computed<ScreenAction[]>(() => {\n const list: ScreenAction[] = []\n\n if (canManage.value) {\n list.push({\n key: 'statuses',\n label: t('panel.statuses'),\n icon: 'tag',\n run: () => void router.push(`${props.base}/statuses`),\n })\n }\n\n /* The dialog belongs to the list: what is written has to land in it, in the filter that is\n on, and be counted in its tabs. The head only asks for it. */\n if (context.can('inbox.update') && chosen.value !== null) {\n list.push({\n key: 'new-submission',\n label: t('panel.new-submission'),\n icon: 'plus',\n primary: true,\n run: () => void pane.value?.create(),\n })\n }\n\n return list\n})\n</script>\n\n<template>\n <wx-list-screen :title=\"title\" :actions=\"actions\" :card=\"false\">\n <!--\n Written here rather than declared as an action, because an action folds behind the ···\n on a narrow head and this is only ever drawn on one: it is the way to the forms for a\n reader whose column of them is gone. It stands where the other actions of the section\n stand, beside the one that writes a submission.\n -->\n <template v-if=\"!columnInline\" #actions>\n <wx-button variant=\"outline\" @click=\"formsOpen = true\">\n <template #icon><wx-icon name=\"list\" /></template>\n {{ t('panel.forms') }}\n </wx-button>\n </template>\n\n <wx-card class=\"wx-inbox\" padding=\"none\">\n <wx-list-detail\n v-model:filters-open=\"formsOpen\"\n class=\"wx-inbox__panes\"\n :filters-width=\"270\"\n :detail-min=\"420\"\n :filters-title=\"t('panel.forms')\"\n @filters-inline=\"columnInline = $event\"\n >\n <!--\n The forms are what narrows the list, so they are the column that folds: on a phone\n this is a panel raised from the head of the submissions, and the submissions are\n the screen.\n -->\n <template #filters=\"{ inline, close }\">\n <wx-skeleton v-if=\"loading\" class=\"wx-inbox__loading\" :rows=\"5\" />\n\n <template v-else>\n <!--\n In the panel the `+` would stand alone on a line of its own under the drawer's\n own heading, which reads as a stray mark rather than as a control. There is\n room for the word here, so it takes it.\n -->\n <wx-button\n v-if=\"!inline && canManage\"\n class=\"wx-inbox__new-form\"\n variant=\"outline\"\n block\n @click=\"add\"\n >\n <template #icon><wx-icon name=\"plus\" /></template>\n {{ t('panel.new-form') }}\n </wx-button>\n\n <!--\n A grip and not the whole row: the row is what opens a form, and a list whose\n rows both open and drag is a list where one of the two happens by accident.\n -->\n <wx-sortable-list\n v-model=\"forms\"\n class=\"wx-inbox__forms\"\n :class=\"{ 'is-panel': !inline }\"\n plain\n size=\"sm\"\n item-key=\"id\"\n :item-label=\"name\"\n :drag-label=\"t('panel.reorder')\"\n :disabled=\"!canManage\"\n :title=\"inline ? t('panel.forms') : undefined\"\n @move=\"reorder\"\n >\n <!--\n A new form is made where the forms are and not in the head of the section: it\n is one more of these, and it is asked for once for every few dozen times\n somebody opens the inbox to read what came in. An icon, because the word for\n it is already written beside it.\n -->\n <template v-if=\"inline && canManage\" #extra>\n <wx-action icon=\"plus\" size=\"sm\" :title=\"t('panel.new-form')\" @click=\"add\" />\n </template>\n\n <template #default=\"{ item }\">\n <button\n type=\"button\"\n class=\"wx-inbox-form\"\n :class=\"{ 'is-current': item.id === current, 'is-off': !item.is_enabled }\"\n @click=\"choose(item, close)\"\n >\n <!--\n A switched-off form is said by the name itself — struck through and grey —\n rather than by a badge beside it. The badge was a second thing on a line\n 270px wide that already holds a name, a count and the ···: it did not\n shrink, so it ran under the menu, and it said in a word what the type says\n at a glance.\n -->\n <span class=\"wx-inbox-form__name\">\n <wx-text truncate weight=\"medium\" :tone=\"item.is_enabled ? 'default' : 'muted'\">\n {{ name(item) }}\n </wx-text>\n\n <!--\n On the name's line, not under it. The list stacks what the slot hands it,\n so a count standing beside the form was a third line under the address —\n the row grew by a line to say a single digit. Unread first and in colour;\n the total behind it, quietly, because it is context rather than work.\n -->\n <!-- Only on a form that is switched on: one that is off tells nobody\n because nobody can send it. -->\n <wx-icon\n v-if=\"item.is_enabled && item.notifies === false\"\n class=\"wx-inbox-form__silent\"\n name=\"warning\"\n :label=\"t('panel.notifies-nobody-short')\"\n :title=\"t('panel.notifies-nobody-short')\"\n />\n <wx-indicator\n v-if=\"item.unread_count\"\n class=\"wx-inbox-form__count\"\n type=\"primary\"\n :value=\"item.unread_count\"\n :label=\"t('panel.unread')\"\n />\n <wx-indicator\n v-else-if=\"item.submissions_count\"\n class=\"wx-inbox-form__count\"\n type=\"neutral\"\n :value=\"item.submissions_count\"\n :label=\"t('panel.submissions')\"\n />\n </span>\n <wx-text size=\"sm\" tone=\"muted\" truncate>{{ item.slug }}</wx-text>\n </button>\n </template>\n\n <template #actions=\"{ item }\">\n <wx-row-menu :actions=\"actionsFor(item)\" :label=\"name(item)\" />\n </template>\n </wx-sortable-list>\n </template>\n </template>\n\n <!--\n The submissions of the chosen form, and the screen. The pane is the list's, head\n and all: what is above the rows — which form this is, the way to another one where\n there is no column for them — belongs beside the tabs.\n\n Nothing chosen and nothing loading means the site has no forms yet, since a form\n that exists is picked for the reader. The word about it goes here rather than in\n the column, because here is what a phone shows.\n -->\n <template #list>\n <wx-skeleton v-if=\"loading\" class=\"wx-inbox__loading\" :rows=\"6\" />\n\n <submission-list\n v-else-if=\"chosen\"\n ref=\"pane\"\n :key=\"chosen.id\"\n :form=\"chosen\"\n :base=\"props.base\"\n @changed=\"load\"\n />\n\n <wx-empty v-else :title=\"t('panel.no-forms')\" :description=\"t('panel.no-forms-help')\" />\n </template>\n </wx-list-detail>\n </wx-card>\n </wx-list-screen>\n</template>\n\n<style>\n/*\n * What scrolls here is the page.\n *\n * The section used to be as tall as the window, with the rows scrolling inside a box of their\n * own: a second scroller inside the first, its bar running down the middle of the screen, and\n * a wheel that meant one thing over the rows and another an inch to the left. Page after page\n * of the panel scrolls as a page; this one now does too, and the card is as tall as what is\n * in it.\n *\n * The card's corners are still the screen's corners. The two panes inside are square and paint\n * their own background right up to the edge, so without the clip they covered the rounding —\n * four white notches poking out of the card, most visible where the column divider and the\n * bottom rule of the list meet it. `clip` rather than `hidden`: `hidden` would make this a\n * scroll container again, and everything sticky inside would pin itself to a box that never\n * moves (CLAUDE.md §4).\n */\n.wx-inbox > .wx-card__body {\n display: flex;\n flex-direction: column;\n overflow: clip;\n border-radius: inherit;\n}\n\n.wx-inbox__loading {\n padding: var(--wx-space-16);\n}\n\n.wx-inbox__forms {\n padding: var(--wx-space-8) var(--wx-space-12);\n}\n\n/* In the panel the sheet is the column, and it insets what it holds already: a second step\n inside the first stands the same list further from the edge than it stands anywhere else\n (CLAUDE.md §4). */\n.wx-inbox__forms.is-panel {\n padding: 0;\n}\n\n/*\n * A plain list draws its rows edge to edge, which is right until one of them is tinted: the\n * highlight then starts exactly at the first letter and ends exactly at the `···`, so the\n * chosen form reads as a stain rather than as a row, and it sits flush against the rule that\n * divides the two columns. The padding is inside the tint, not around it.\n */\n.wx-inbox__forms.is-plain .wx-sortable-list__row {\n padding-inline: var(--wx-space-8);\n}\n\n/*\n * Air under the rule that carries the column's name, and the rows' own step beside it.\n *\n * The first row started exactly where the line ended, and the first row here is usually the\n * tinted one — so the chosen form read as hanging off the heading rather than as the first of\n * a list. Visible in the dark theme first, where the tint is a shape of its own.\n *\n * The step is the one the rows take inside their tint (above), so the name of the column\n * begins where the names of the forms do and the `+` stands over the row of `···` rather\n * than eight pixels to the right of them. Measured: 338 against 330.\n */\n.wx-inbox__forms.is-plain .wx-sortable-list__head {\n margin-block-end: var(--wx-space-6);\n padding-inline: var(--wx-space-8);\n}\n\n.wx-inbox-form {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-2);\n align-items: flex-start;\n /* The row is the target, so it takes the row: a name of four letters should not leave\n three quarters of the line dead. */\n flex: 1 1 auto;\n min-width: 0;\n padding: 0;\n border: 0;\n background: none;\n font: inherit;\n color: inherit;\n text-align: start;\n cursor: pointer;\n}\n\n.wx-inbox-form__name {\n display: flex;\n align-items: center;\n gap: var(--wx-space-6);\n min-width: 0;\n max-width: 100%;\n}\n\n/*\n * Switched off: struck through and grey. On the name alone and not on the line it stands in,\n * because what is off is the form — the count beside it is still true, and a decoration set\n * on the row would run through that too and could not be taken off a child. The grey comes\n * from the text's own `tone`, since `WxText` declares its colour on its own element and an\n * inherited one would never reach it (CLAUDE.md §4).\n */\n.wx-inbox-form.is-off .wx-inbox-form__name > .wx-text {\n text-decoration: line-through;\n}\n\n/*\n * The chosen form, marked on the whole row rather than on the name inside it: the row is what\n * was clicked, and a colour on the words alone leaves the grip and the menu looking like they\n * belong to something else. `:has()` because the row is the list's element and the class is\n * ours — the slot cannot reach the element it is drawn into.\n */\n.wx-inbox__forms .wx-sortable-list__row:has(.wx-inbox-form.is-current) {\n background: var(--wx-bg-subtle);\n border-radius: var(--wx-radius-sm);\n}\n\n.wx-inbox-form.is-current {\n color: var(--wx-color-primary);\n}\n\n.wx-inbox-form__silent {\n flex: none;\n color: var(--wx-color-warning);\n}\n\n.wx-inbox-form__count {\n flex: 0 0 auto;\n}\n</style>\n"],"names":["resolve","dismiss","open","useModal","context","useAdmin","api","createInboxApi","useInboxMessages","t","useTranslate","message","useErrorText","title","ref","slug","saving","errors","errorOf","field","save","error","body","toast","_createBlock","_unref","WxDialog","$event","_createVNode","WxSpace","WxButton","_createElementVNode","_hoisted_1","WxFormItem","WxInput","props","__props","route","useRoute","router","useRouter","locales","useLocales","forms","loading","pane","useTemplateRef","columnInline","formsOpen","canManage","computed","create","createModal","FormCreateDialog","module","current","asked","chosen","form","name","localizedValue","load","watch","choose","close","edit","actionsFor","duplicate","remove","add","made","copy","confirm","rest","reorder","actions","list","WxListScreen","WxCard","WxListDetail","_cache","_withCtx","inline","WxSkeleton","_createElementBlock","_Fragment","WxIcon","_createTextVNode","WxSortableList","_normalizeClass","item","_hoisted_2","WxText","_toDisplayString","WxIndicator","WxRowMenu","WxAction","SubmissionList","WxEmpty"],"mappings":"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"}
|