@things-factory/announcement 10.1.255 → 10.1.257

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.
Files changed (41) hide show
  1. package/client/components/announcement-receipts.ts +31 -36
  2. package/client/components/announcement-sheet.ts +18 -15
  3. package/client/components/audience-picker.ts +41 -28
  4. package/client/pages/announcement-editor.ts +125 -87
  5. package/client/pages/announcement-view.ts +38 -36
  6. package/client/utils/announcement-api.ts +3 -50
  7. package/dist-client/components/announcement-receipts.d.ts +6 -5
  8. package/dist-client/components/announcement-receipts.js +24 -52
  9. package/dist-client/components/announcement-receipts.js.map +1 -1
  10. package/dist-client/components/announcement-sheet.d.ts +2 -1
  11. package/dist-client/components/announcement-sheet.js +15 -21
  12. package/dist-client/components/announcement-sheet.js.map +1 -1
  13. package/dist-client/components/audience-picker.d.ts +8 -4
  14. package/dist-client/components/audience-picker.js +35 -35
  15. package/dist-client/components/audience-picker.js.map +1 -1
  16. package/dist-client/pages/announcement-editor.d.ts +22 -12
  17. package/dist-client/pages/announcement-editor.js +116 -130
  18. package/dist-client/pages/announcement-editor.js.map +1 -1
  19. package/dist-client/pages/announcement-view.d.ts +7 -4
  20. package/dist-client/pages/announcement-view.js +34 -48
  21. package/dist-client/pages/announcement-view.js.map +1 -1
  22. package/dist-client/tsconfig.tsbuildinfo +1 -1
  23. package/dist-client/utils/announcement-api.d.ts +0 -47
  24. package/dist-client/utils/announcement-api.js +3 -21
  25. package/dist-client/utils/announcement-api.js.map +1 -1
  26. package/dist-server/index.d.ts +1 -0
  27. package/dist-server/index.js +1 -0
  28. package/dist-server/index.js.map +1 -1
  29. package/dist-server/tsconfig.tsbuildinfo +1 -1
  30. package/dist-server/work-doors.d.ts +1 -0
  31. package/dist-server/work-doors.js +11 -0
  32. package/dist-server/work-doors.js.map +1 -0
  33. package/package.json +11 -11
  34. package/server/index.ts +1 -0
  35. package/server/work-doors.ts +9 -0
  36. package/translations/en.json +2 -1
  37. package/translations/es.json +2 -1
  38. package/translations/ja.json +2 -1
  39. package/translations/ko.json +2 -1
  40. package/translations/ms.json +2 -1
  41. package/translations/zh.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"announcement-editor.js","sourceRoot":"","sources":["../../client/pages/announcement-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/list-state/ox-page-state.js'\nimport '../components/audience-picker.js'\n\nimport { css, html, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { notify } from '@operato/layout'\nimport { navigate, PageView } from '@operato/shell'\nimport { renderMarkdown } from '@things-factory/ai-assistant/dist-client/index.js'\nimport { ButtonStyles, DocumentPageStyles, FormFieldStyles } from '@operato/styles'\n\nimport { chooser } from '../components/audience-picker.js'\nimport { announcementApi, type AnnouncementInput, type AnnouncementItem, type AnnouncementLink, type Audience, type FileRow } from '../utils/announcement-api.js'\nimport { CATEGORIES, categoryWord, IMPORTANCES, importanceWord, reasonOf, statusWord, t } from '../utils/announcement-words.js'\n\ntype Form = {\n title: string\n body: string\n category: string\n importance: string\n startsAt: string\n endsAt: string\n pinned: boolean\n requiresAcknowledgement: boolean\n acknowledgeBy: string\n popup: boolean\n sendEmail: boolean\n links: AnnouncementLink[]\n audiences: Audience[]\n}\n\nconst blank = (): Form => ({\n title: '',\n body: '',\n category: 'GENERAL',\n importance: 'NORMAL',\n startsAt: '',\n endsAt: '',\n pinned: false,\n requiresAcknowledgement: false,\n acknowledgeBy: '',\n popup: false,\n sendEmail: false,\n links: [],\n audiences: []\n})\n\n/** `datetime-local` speaks the reader's own clock. */\nconst pad = (n: number) => String(n).padStart(2, '0')\nfunction localOf(value?: string | null, dateOnly = false): string {\n if (!value) return ''\n const d = new Date(value)\n const day = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`\n return dateOnly ? day : `${day}T${pad(d.getHours())}:${pad(d.getMinutes())}`\n}\nconst isoOf = (local: string, endOfDay = false) => (local ? new Date(endOfDay && local.length === 10 ? `${local}T23:59:59` : local).toISOString() : null)\n\nfunction formOf(one: AnnouncementItem): Form {\n return {\n title: one.title,\n body: one.body ?? '',\n category: one.category,\n importance: one.importance,\n startsAt: localOf(one.startsAt),\n endsAt: localOf(one.endsAt),\n pinned: one.pinned,\n requiresAcknowledgement: one.requiresAcknowledgement,\n acknowledgeBy: localOf(one.acknowledgeBy, true),\n popup: one.popup,\n sendEmail: !!one.sendEmail,\n links: (one.links ?? []).map(link => ({ ...link })),\n audiences: (one.audiences ?? []).map(({ scope, targetId, targetName }) => ({ scope, targetId, targetName }))\n }\n}\n\n/**\n * 공지 작성 — what it says, to whom, when, and what it asks of its readers (ADR-0163 decisions 2-5). A new one is kept as\n * a draft until it is published; one already out is changed into a new version, and its writer may tell everyone again.\n * `?from=<id>` starts a new one as a copy.\n */\n@customElement('announcement-editor')\nexport class AnnouncementEditor extends localize(i18next)(PageView) {\n static styles = [\n FormFieldStyles,\n ButtonStyles,\n DocumentPageStyles,\n css`\n .form {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n }\n .form .wide {\n grid-column: 1 / -1;\n }\n label {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n label.check {\n flex-direction: row;\n align-items: center;\n gap: var(--spacing-small, 4px);\n }\n textarea.body {\n display: block;\n width: 100%;\n box-sizing: border-box;\n min-height: 240px;\n font-family: inherit;\n }\n /* Writing or its preview - the segmented switch of the card library (ai-dashboard), right above the body. */\n .tabs {\n display: inline-flex;\n gap: 4px;\n padding: 3px;\n margin-bottom: var(--spacing-small, 4px);\n border-radius: 10px;\n background: var(--ui-panel-2, var(--md-sys-color-surface-container));\n }\n .tabs button {\n padding: 4px 14px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n box-shadow: none;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n }\n .tabs button[aria-selected='true'] {\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n color: var(--ui-ink, var(--md-sys-color-on-surface));\n box-shadow: 0 1px 3px rgb(0 0 0 / 12%);\n }\n .preview.markdown :is(ul, ol) {\n padding-inline-start: 1.4em;\n }\n .preview {\n min-height: 240px;\n padding: var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: var(--border-radius, 4px);\n }\n .hint {\n font-size: var(--ui-t-small, 12px);\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n ul.files,\n ul.links {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small, 4px);\n }\n ul.files li,\n ul.links li {\n display: flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n }\n ul.links input {\n flex: 1;\n }\n ul.links input.label {\n flex: 0 1 200px;\n }\n .removed {\n text-decoration: line-through;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n .add-link {\n align-self: flex-start;\n }\n li button,\n .add-link {\n border: 0;\n background: none;\n cursor: pointer;\n color: var(--md-sys-color-primary);\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font: inherit;\n padding: 0;\n }\n li button md-icon,\n .add-link md-icon {\n --md-icon-size: 18px;\n }\n `\n ]\n\n @state() announcement: AnnouncementItem | null = null\n @state() form: Form = blank()\n @state() files: FileRow[] = []\n @state() added: File[] = []\n @state() removed: string[] = []\n @state() notifyAgain = false\n @state() preview = false\n @state() progress?: number\n @state() loading = false\n @state() error: unknown = null\n @state() busy = false\n\n get out() {\n return this.announcement?.status === 'PUBLISHED'\n }\n\n get context() {\n const one = this.announcement\n const actions: any[] = []\n const draft = !one || one.status === 'DRAFT'\n if (!this.busy && !this.error && (!one || one.editable)) {\n if (draft && one) actions.push({ title: t('announcement.button.delete'), icon: 'delete', action: () => this.deleteDraft() })\n actions.push({ title: draft ? t('announcement.button.save-draft') : t('announcement.button.save'), icon: 'save', action: () => this.save(false) })\n if (draft) {\n const later = !!this.form.startsAt && new Date(this.form.startsAt).getTime() > Date.now()\n actions.push({ title: later ? t('announcement.button.schedule') : t('announcement.button.publish'), icon: 'campaign', emphasis: { raised: true }, action: () => this.save(true) })\n }\n }\n return {\n title: one ? `${t('announcement.title.edit')} · ${one.title}` : t('announcement.title.new'),\n ...(one ? { description: statusWord(one.status) } : {}),\n frame: 'document',\n /* Opened from 공지사항 or 공지 관리; the menu marks 공지사항. */\n menu: 'announcement-list',\n actions\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active || !(changes.active || changes.params)) return\n const { id, from } = lifecycle?.params ?? {}\n if (id) {\n if (id !== this.announcement?.id) await this.load(id, false)\n } else if (from) {\n await this.load(from, true)\n } else {\n this.announcement = null\n this.form = blank()\n this.files = []\n this.reset()\n this.updateContext()\n }\n }\n\n private reset() {\n this.added = []\n this.removed = []\n this.notifyAgain = false\n this.preview = false\n }\n\n private async load(id: string, asCopy: boolean) {\n this.loading = true\n this.error = null\n try {\n const one = await announcementApi.one(id)\n if (!one) throw new Error(t('announcement.refusal.unknown-announcement'))\n this.announcement = asCopy ? null : one\n this.form = asCopy ? { ...formOf(one), startsAt: '', endsAt: '' } : formOf(one)\n this.files = asCopy ? [] : (one.attachments ?? [])\n this.reset()\n } catch (error) {\n this.error = error\n } finally {\n this.loading = false\n this.updateContext()\n }\n }\n\n render() {\n const form = this.form\n const set = (patch: Partial<Form>) => {\n this.form = { ...form, ...patch }\n this.updateContext()\n }\n const editable = !this.busy && (!this.announcement || !!this.announcement.editable)\n return html`<ox-page-state .loading=${this.loading} .error=${this.error} @retry=${() => this.announcement && this.load(this.announcement.id, false)}>\n <div class=\"page\">\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.text.section-what')}</h3></header>\n <div class=\"form\">\n <label class=\"wide\"\n >${t('announcement.field.title')}\n <input .value=${form.title} maxlength=\"200\" ?disabled=${!editable} @input=${(e: any) => set({ title: e.target.value })}\n /></label>\n <label\n >${t('announcement.field.category')}\n ${chooser(\n CATEGORIES.map(code => ({ value: code, display: categoryWord(code) })),\n form.category,\n value => set({ category: value }),\n '—',\n t('announcement.field.category')\n )}\n </label>\n <label\n >${t('announcement.field.importance')}\n ${chooser(\n IMPORTANCES.map(code => ({ value: code, display: importanceWord(code) })),\n form.importance,\n /* An urgent one pops up unless its writer says not to. */\n value => set({ importance: value, ...(value === 'URGENT' ? { popup: true } : {}) }),\n '—',\n t('announcement.field.importance')\n )}\n </label>\n <div class=\"wide\">\n <div class=\"tabs\" role=\"tablist\">\n <button role=\"tab\" aria-selected=${String(!this.preview)} @click=${() => (this.preview = false)}>${t('announcement.text.write')}</button>\n <button role=\"tab\" aria-selected=${String(this.preview)} @click=${() => (this.preview = true)}>${t('announcement.text.preview')}</button>\n </div>\n ${this.preview\n ? html`<div class=\"preview markdown\">${unsafeHTML(renderMarkdown(form.body))}</div>`\n : html`<textarea class=\"body\" .value=${form.body} ?disabled=${!editable} placeholder=${t('announcement.text.body-placeholder')} @input=${(e: any) => set({ body: e.target.value })}></textarea>\n <span class=\"hint\">${t('announcement.text.markdown-hint')}</span>`}\n </div>\n </div>\n </section>\n\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.field.audience')}</h3></header>\n <announcement-audience-picker .value=${form.audiences} ?disabled=${!editable} @change=${(e: CustomEvent) => set({ audiences: e.detail })}></announcement-audience-picker>\n </section>\n\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.text.section-when')}</h3></header>\n <div class=\"form\">\n <label\n >${t('announcement.field.starts-at')}\n <input type=\"datetime-local\" .value=${form.startsAt} ?disabled=${!editable || this.out} @input=${(e: any) => set({ startsAt: e.target.value })} />\n <span class=\"hint\">${t('announcement.text.starts-at-hint')}</span>\n </label>\n <label\n >${t('announcement.field.ends-at')}\n <input type=\"datetime-local\" .value=${form.endsAt} ?disabled=${!editable} @input=${(e: any) => set({ endsAt: e.target.value })} />\n <span class=\"hint\">${t('announcement.text.ends-at-hint')}</span>\n </label>\n <label class=\"check wide\"><input type=\"checkbox\" .checked=${form.pinned} ?disabled=${!editable} @change=${(e: any) => set({ pinned: e.target.checked })} />${t('announcement.text.pinned-label')}</label>\n <label class=\"check wide\"\n ><input\n type=\"checkbox\"\n .checked=${form.requiresAcknowledgement}\n ?disabled=${!editable}\n @change=${(e: any) => set({ requiresAcknowledgement: e.target.checked, ...(e.target.checked ? { popup: true } : { acknowledgeBy: '' }) })}\n />${t('announcement.text.acknowledge-label')}</label\n >\n ${form.requiresAcknowledgement\n ? html`<label\n >${t('announcement.field.acknowledge-by')}\n <input type=\"date\" .value=${form.acknowledgeBy} ?disabled=${!editable} @input=${(e: any) => set({ acknowledgeBy: e.target.value })}\n /></label>`\n : nothing}\n <label class=\"check wide\"><input type=\"checkbox\" .checked=${form.popup} ?disabled=${!editable} @change=${(e: any) => set({ popup: e.target.checked })} />${t('announcement.text.popup-label')}</label>\n <label class=\"check wide\"\n ><input type=\"checkbox\" .checked=${form.sendEmail} ?disabled=${!editable} @change=${(e: any) => set({ sendEmail: e.target.checked })} />${t('announcement.text.email-label')}</label\n >\n ${form.sendEmail ? html`<span class=\"hint wide\">${t('announcement.text.email-hint')}</span>` : nothing}\n </div>\n </section>\n\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.field.attachments')}</h3></header>\n <ul class=\"files\">\n ${this.files.map(\n file => html`<li class=${this.removed.includes(file.id) ? 'removed' : ''}>\n <md-icon>attach_file</md-icon>${file.name}\n ${editable\n ? this.removed.includes(file.id)\n ? html`<button @click=${() => (this.removed = this.removed.filter(id => id !== file.id))}><md-icon>undo</md-icon></button>`\n : html`<button aria-label=${t('announcement.button.remove')} @click=${() => (this.removed = [...this.removed, file.id])}><md-icon>close</md-icon></button>`\n : nothing}\n </li>`\n )}\n ${this.added.map(\n (file, index) => html`<li>\n <md-icon>upload_file</md-icon>${file.name}\n <button aria-label=${t('announcement.button.remove')} @click=${() => (this.added = this.added.filter((_, i) => i !== index))}><md-icon>close</md-icon></button>\n </li>`\n )}\n </ul>\n ${editable ? html`<ox-input-file quiet hide-filelist multiple icon=\"attach_file\" .progress=${this.progress} @change=${(e: CustomEvent) => this.pick(e)}></ox-input-file>` : nothing}\n </section>\n\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.field.links')}</h3></header>\n <ul class=\"links\">\n ${form.links.map(\n (link, index) => html`<li>\n <input\n class=\"label\"\n .value=${link.label}\n maxlength=\"100\"\n placeholder=${t('announcement.text.link-label')}\n ?disabled=${!editable}\n @input=${(e: any) => set({ links: form.links.map((one, i) => (i === index ? { ...one, label: e.target.value } : one)) })}\n />\n <input\n .value=${link.url}\n placeholder=${t('announcement.text.link-url')}\n ?disabled=${!editable}\n @input=${(e: any) => set({ links: form.links.map((one, i) => (i === index ? { ...one, url: e.target.value } : one)) })}\n />\n ${editable ? html`<button aria-label=${t('announcement.button.remove')} @click=${() => set({ links: form.links.filter((_, i) => i !== index) })}><md-icon>close</md-icon></button>` : nothing}\n </li>`\n )}\n </ul>\n ${editable && form.links.length < 10\n ? html`<button class=\"add-link\" @click=${() => set({ links: [...form.links, { label: '', url: '' }] })}><md-icon>add_link</md-icon>${t('announcement.button.add-link')}</button>\n <span class=\"hint\">${t('announcement.text.link-hint')}</span>`\n : nothing}\n </section>\n\n ${this.out\n ? html`<section class=\"page-section\">\n <label class=\"check\"><input type=\"checkbox\" .checked=${this.notifyAgain} @change=${(e: any) => (this.notifyAgain = e.target.checked)} />${t('announcement.text.notify-again')}</label>\n <span class=\"hint\">${t('announcement.text.new-version', { version: (this.announcement?.version ?? 1) + 1 })}</span>\n </section>`\n : nothing}\n </div>\n </ox-page-state>`\n }\n\n private pick(e: CustomEvent) {\n const picked = [...((e.detail as File[]) ?? [])]\n /* The picker's own reset says `change` again, with nothing - that one is let go. */\n if (!picked.length) return\n ;(e.target as any).reset?.()\n this.added = [...this.added, ...picked]\n }\n\n private input(): AnnouncementInput {\n const form = this.form\n return {\n title: form.title,\n body: form.body,\n category: form.category,\n importance: form.importance,\n startsAt: isoOf(form.startsAt),\n endsAt: isoOf(form.endsAt),\n pinned: form.pinned,\n requiresAcknowledgement: form.requiresAcknowledgement,\n acknowledgeBy: form.requiresAcknowledgement ? isoOf(form.acknowledgeBy, true) : null,\n popup: form.popup,\n sendEmail: form.sendEmail,\n links: form.links.filter(link => link.label.trim() || link.url.trim()),\n audiences: form.audiences.map(({ scope, targetId, targetName }) => ({ scope, targetId, targetName: targetName ?? undefined }))\n }\n }\n\n /** Keeps it, then sends it out when asked - a draft that cannot go out stays kept with the reason told. */\n private async save(publish: boolean) {\n this.busy = true\n this.updateContext()\n const uploading = (fraction: number) => (this.progress = fraction)\n try {\n let id = this.announcement?.id\n if (id) await announcementApi.update(id, this.input(), this.added, this.removed, this.notifyAgain, uploading)\n else id = (await announcementApi.create(this.input(), this.added, uploading)).id\n if (publish) {\n const sent = await announcementApi.publish(id)\n notify({ message: sent.status === 'SCHEDULED' ? t('announcement.text.scheduled-done') : t('announcement.text.published-done') })\n navigate(`announcement-view?id=${id}`)\n return\n }\n notify({ message: t('announcement.text.saved') })\n if (this.announcement?.id === id) await this.load(id, false)\n else navigate(`announcement-editor?id=${id}`)\n } catch (error) {\n notify({ level: 'error', message: reasonOf(error) })\n } finally {\n this.progress = undefined\n this.busy = false\n this.updateContext()\n }\n }\n\n private async deleteDraft() {\n const sure = await OxPrompt.open({\n title: t('announcement.button.delete'),\n text: t('announcement.text.delete-confirm', { title: this.announcement!.title }),\n confirmButton: { text: t('announcement.button.delete') },\n cancelButton: { text: t('announcement.button.cancel') }\n })\n if (!sure) return\n try {\n await announcementApi.remove(this.announcement!.id)\n notify({ message: t('announcement.text.deleted') })\n navigate('announcement-manage-list')\n } catch (error) {\n notify({ level: 'error', message: reasonOf(error) })\n }\n }\n}\n"]}
1
+ {"version":3,"file":"announcement-editor.js","sourceRoot":"","sources":["../../client/pages/announcement-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/list-state/ox-page-state.js'\nimport '../components/audience-picker.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { notify } from '@operato/layout'\nimport { navigate, PageView, DraftController } from '@operato/shell'\nimport { renderMarkdown } from '@things-factory/ai-assistant/dist-client/index.js'\nimport { ButtonStyles, DocumentPageStyles, FormFieldStyles } from '@operato/styles'\n\nimport { chooser } from '../components/audience-picker.js'\nimport { FULL_FIELDS, type AnnouncementInput, type AnnouncementItem, type AnnouncementLink, type Audience, type FileRow } from '../utils/announcement-api.js'\nimport { CATEGORIES, categoryWord, IMPORTANCES, importanceWord, statusWord, t } from '../utils/announcement-words.js'\n\ntype Form = {\n title: string\n body: string\n category: string\n importance: string\n startsAt: string\n endsAt: string\n pinned: boolean\n requiresAcknowledgement: boolean\n acknowledgeBy: string\n popup: boolean\n sendEmail: boolean\n links: AnnouncementLink[]\n audiences: Audience[]\n /** Files picked to attach, attached ones to take off, and whether a changed one tells everyone again. */\n added: File[]\n removed: string[]\n notifyAgain: boolean\n}\n\nconst blank = (): Form => ({\n title: '',\n body: '',\n category: 'GENERAL',\n importance: 'NORMAL',\n startsAt: '',\n endsAt: '',\n pinned: false,\n requiresAcknowledgement: false,\n acknowledgeBy: '',\n popup: false,\n sendEmail: false,\n links: [],\n audiences: [],\n added: [],\n removed: [],\n notifyAgain: false\n})\n\n/** `datetime-local` speaks the reader's own clock. */\nconst pad = (n: number) => String(n).padStart(2, '0')\nfunction localOf(value?: string | null, dateOnly = false): string {\n if (!value) return ''\n const d = new Date(value)\n const day = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`\n return dateOnly ? day : `${day}T${pad(d.getHours())}:${pad(d.getMinutes())}`\n}\nconst isoOf = (local: string, endOfDay = false) => (local ? new Date(endOfDay && local.length === 10 ? `${local}T23:59:59` : local).toISOString() : null)\n\nfunction formOf(one: AnnouncementItem): Form {\n return {\n title: one.title,\n body: one.body ?? '',\n category: one.category,\n importance: one.importance,\n startsAt: localOf(one.startsAt),\n endsAt: localOf(one.endsAt),\n pinned: one.pinned,\n requiresAcknowledgement: one.requiresAcknowledgement,\n acknowledgeBy: localOf(one.acknowledgeBy, true),\n popup: one.popup,\n sendEmail: !!one.sendEmail,\n links: (one.links ?? []).map(link => ({ ...link })),\n audiences: (one.audiences ?? []).map(({ scope, targetId, targetName }) => ({ scope, targetId, targetName })),\n added: [],\n removed: [],\n notifyAgain: false\n }\n}\n\n/**\n * 공지 작성 — what it says, to whom, when, and what it asks of its readers (ADR-0163 decisions 2-5). A new one is kept as\n * a draft until it is published; one already out is changed into a new version, and its writer may tell everyone again.\n * `?from=<id>` starts a new one as a copy.\n */\n@customElement('announcement-editor')\nexport class AnnouncementEditor extends localize(i18next)(PageView) {\n static styles = [\n FormFieldStyles,\n ButtonStyles,\n DocumentPageStyles,\n css`\n .form {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n }\n .form .wide {\n grid-column: 1 / -1;\n }\n label {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n label.check {\n flex-direction: row;\n align-items: center;\n gap: var(--spacing-small, 4px);\n }\n textarea.body {\n display: block;\n width: 100%;\n box-sizing: border-box;\n min-height: 240px;\n font-family: inherit;\n }\n /* Writing or its preview - the segmented switch of the card library (ai-dashboard), right above the body. */\n .tabs {\n display: inline-flex;\n gap: 4px;\n padding: 3px;\n margin-bottom: var(--spacing-small, 4px);\n border-radius: 10px;\n background: var(--ui-panel-2, var(--md-sys-color-surface-container));\n }\n .tabs button {\n padding: 4px 14px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n box-shadow: none;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font: inherit;\n font-weight: 600;\n cursor: pointer;\n }\n .tabs button[aria-selected='true'] {\n background: var(--ui-panel, var(--md-sys-color-surface-container-lowest));\n color: var(--ui-ink, var(--md-sys-color-on-surface));\n box-shadow: 0 1px 3px rgb(0 0 0 / 12%);\n }\n .preview.markdown :is(ul, ol) {\n padding-inline-start: 1.4em;\n }\n .preview {\n min-height: 240px;\n padding: var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: var(--border-radius, 4px);\n }\n .hint {\n font-size: var(--ui-t-small, 12px);\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n ul.files,\n ul.links {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small, 4px);\n }\n ul.files li,\n ul.links li {\n display: flex;\n align-items: center;\n gap: var(--spacing-small, 4px);\n }\n ul.links input {\n flex: 1;\n }\n ul.links input.label {\n flex: 0 1 200px;\n }\n .removed {\n text-decoration: line-through;\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n .add-link {\n align-self: flex-start;\n }\n li button,\n .add-link {\n border: 0;\n background: none;\n cursor: pointer;\n color: var(--md-sys-color-primary);\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font: inherit;\n padding: 0;\n }\n li button md-icon,\n .add-link md-icon {\n --md-icon-size: 18px;\n }\n `\n ]\n\n /** What the address opens: an announcement by id, a new one copied `from` another, or a new one. */\n @state() private address?: { id?: string; from?: string }\n @state() preview = false\n @state() progress?: number\n\n /* The announcement edited, or the one a new one is copied from (ADR-0190). */\n private record = new QueryController(this, gql(`query ($id: String!) { announcement(id: $id) { ${FULL_FIELDS} readCount acknowledgedCount } }`), {\n variables: () => {\n const id = this.address?.id || this.address?.from\n return id ? { id } : undefined\n }\n })\n\n /* What is typed over the announcement read - a copy starts without its days, a new one blank. */\n private draft = new DraftController<Form>(this, {\n read: () => {\n if (!this.address) return undefined\n if (!this.address.id && !this.address.from) return blank()\n const one = this.record.data?.announcement\n if (!one) return undefined\n return this.address.from && !this.address.id ? { ...formOf(one), startsAt: '', endsAt: '' } : formOf(one)\n },\n key: () => this.address\n })\n\n /* A change reads the announcement again once it is done; one that goes out or away leaves the editor. */\n private saves = {\n create: new MutationController(this, gql`mutation ($input: AnnouncementInput!, $attach: [Upload!]) { createAnnouncement(input: $input, attach: $attach) { id } }`),\n update: new MutationController(\n this,\n gql`\n mutation ($id: String!, $input: AnnouncementInput!, $attach: [Upload!], $remove: [String!], $notifyAgain: Boolean) {\n updateAnnouncement(id: $id, input: $input, attach: $attach, remove: $remove, notifyAgain: $notifyAgain) { id status }\n }\n `,\n { refetch: () => [this.record] }\n ),\n publish: new MutationController(this, gql`mutation ($id: String!) { publishAnnouncement(id: $id) { id status startsAt } }`),\n remove: new MutationController(this, gql`mutation ($id: String!) { deleteAnnouncement(id: $id) }`)\n }\n\n get announcement(): AnnouncementItem | null {\n return (this.address?.id && this.record.data?.announcement) || null\n }\n\n /** The form as it shows: each field's edit, else what was read (blank while it is read). */\n get form(): Form {\n return Object.fromEntries(Object.entries(blank()).map(([name, given]) => [name, this.draft.value(name as keyof Form) ?? given])) as Form\n }\n\n /** The files attached so far - a copy starts with none. */\n get files(): FileRow[] {\n return this.announcement?.attachments ?? []\n }\n\n /** A failed read, or an announcement the address names that is not there. */\n get error(): unknown {\n if (this.record.error) return this.record.error\n return this.record.data && !this.record.data.announcement ? new Error(t('announcement.refusal.unknown-announcement')) : null\n }\n\n get loading() {\n return this.record.loading\n }\n\n get busy() {\n return Object.values(this.saves).some(save => save.pending)\n }\n\n get out() {\n return this.announcement?.status === 'PUBLISHED'\n }\n\n get context() {\n const one = this.announcement\n const actions: any[] = []\n const draft = !one || one.status === 'DRAFT'\n if (!this.busy && !this.error && (!one || one.editable)) {\n if (draft && one) actions.push({ title: t('announcement.button.delete'), icon: 'delete', action: () => this.deleteDraft() })\n actions.push({ title: draft ? t('announcement.button.save-draft') : t('announcement.button.save'), icon: 'save', action: () => this.save(false) })\n if (draft) {\n const later = !!this.form.startsAt && new Date(this.form.startsAt).getTime() > Date.now()\n actions.push({ title: later ? t('announcement.button.schedule') : t('announcement.button.publish'), icon: 'campaign', emphasis: { raised: true }, action: () => this.save(true) })\n }\n }\n return {\n title: one ? `${t('announcement.title.edit')} · ${one.title}` : t('announcement.title.new'),\n ...(one ? { description: statusWord(one.status) } : {}),\n frame: 'document',\n /* Opened from 공지사항 or 공지 관리; the menu marks 공지사항. */\n menu: 'announcement-list',\n actions\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active || !(changes.active || changes.params)) return\n const { id, from } = lifecycle?.params ?? {}\n const address = id ? { id } : from ? { from } : {}\n if (JSON.stringify(address) === JSON.stringify(this.address)) return\n this.address = address\n this.preview = false\n }\n\n render() {\n const form = this.form\n const set = (patch: Partial<Form>) => {\n for (const [name, value] of Object.entries(patch)) this.draft.set(name as keyof Form, value)\n this.updateContext()\n }\n const editable = !this.busy && (!this.announcement || !!this.announcement.editable)\n return html`<ox-page-state .loading=${this.loading} .error=${this.error} @retry=${() => this.record.refetch()}>\n <div class=\"page\">\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.text.section-what')}</h3></header>\n <div class=\"form\">\n <label class=\"wide\"\n >${t('announcement.field.title')}\n <input .value=${form.title} maxlength=\"200\" ?disabled=${!editable} @input=${(e: any) => set({ title: e.target.value })}\n /></label>\n <label\n >${t('announcement.field.category')}\n ${chooser(\n CATEGORIES.map(code => ({ value: code, display: categoryWord(code) })),\n form.category,\n value => set({ category: value }),\n '—',\n t('announcement.field.category')\n )}\n </label>\n <label\n >${t('announcement.field.importance')}\n ${chooser(\n IMPORTANCES.map(code => ({ value: code, display: importanceWord(code) })),\n form.importance,\n /* An urgent one pops up unless its writer says not to. */\n value => set({ importance: value, ...(value === 'URGENT' ? { popup: true } : {}) }),\n '—',\n t('announcement.field.importance')\n )}\n </label>\n <div class=\"wide\">\n <div class=\"tabs\" role=\"tablist\">\n <button role=\"tab\" aria-selected=${String(!this.preview)} @click=${() => (this.preview = false)}>${t('announcement.text.write')}</button>\n <button role=\"tab\" aria-selected=${String(this.preview)} @click=${() => (this.preview = true)}>${t('announcement.text.preview')}</button>\n </div>\n ${this.preview\n ? html`<div class=\"preview markdown\">${unsafeHTML(renderMarkdown(form.body))}</div>`\n : html`<textarea class=\"body\" .value=${form.body} ?disabled=${!editable} placeholder=${t('announcement.text.body-placeholder')} @input=${(e: any) => set({ body: e.target.value })}></textarea>\n <span class=\"hint\">${t('announcement.text.markdown-hint')}</span>`}\n </div>\n </div>\n </section>\n\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.field.audience')}</h3></header>\n <announcement-audience-picker .value=${form.audiences} ?disabled=${!editable} @change=${(e: CustomEvent) => set({ audiences: e.detail })}></announcement-audience-picker>\n </section>\n\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.text.section-when')}</h3></header>\n <div class=\"form\">\n <label\n >${t('announcement.field.starts-at')}\n <input type=\"datetime-local\" .value=${form.startsAt} ?disabled=${!editable || this.out} @input=${(e: any) => set({ startsAt: e.target.value })} />\n <span class=\"hint\">${t('announcement.text.starts-at-hint')}</span>\n </label>\n <label\n >${t('announcement.field.ends-at')}\n <input type=\"datetime-local\" .value=${form.endsAt} ?disabled=${!editable} @input=${(e: any) => set({ endsAt: e.target.value })} />\n <span class=\"hint\">${t('announcement.text.ends-at-hint')}</span>\n </label>\n <label class=\"check wide\"><input type=\"checkbox\" .checked=${form.pinned} ?disabled=${!editable} @change=${(e: any) => set({ pinned: e.target.checked })} />${t('announcement.text.pinned-label')}</label>\n <label class=\"check wide\"\n ><input\n type=\"checkbox\"\n .checked=${form.requiresAcknowledgement}\n ?disabled=${!editable}\n @change=${(e: any) => set({ requiresAcknowledgement: e.target.checked, ...(e.target.checked ? { popup: true } : { acknowledgeBy: '' }) })}\n />${t('announcement.text.acknowledge-label')}</label\n >\n ${form.requiresAcknowledgement\n ? html`<label\n >${t('announcement.field.acknowledge-by')}\n <input type=\"date\" .value=${form.acknowledgeBy} ?disabled=${!editable} @input=${(e: any) => set({ acknowledgeBy: e.target.value })}\n /></label>`\n : nothing}\n <label class=\"check wide\"><input type=\"checkbox\" .checked=${form.popup} ?disabled=${!editable} @change=${(e: any) => set({ popup: e.target.checked })} />${t('announcement.text.popup-label')}</label>\n <label class=\"check wide\"\n ><input type=\"checkbox\" .checked=${form.sendEmail} ?disabled=${!editable} @change=${(e: any) => set({ sendEmail: e.target.checked })} />${t('announcement.text.email-label')}</label\n >\n ${form.sendEmail ? html`<span class=\"hint wide\">${t('announcement.text.email-hint')}</span>` : nothing}\n </div>\n </section>\n\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.field.attachments')}</h3></header>\n <ul class=\"files\">\n ${this.files.map(\n file => html`<li class=${form.removed.includes(file.id) ? 'removed' : ''}>\n <md-icon>attach_file</md-icon>${file.name}\n ${editable\n ? form.removed.includes(file.id)\n ? html`<button @click=${() => set({ removed: form.removed.filter(id => id !== file.id) })}><md-icon>undo</md-icon></button>`\n : html`<button aria-label=${t('announcement.button.remove')} @click=${() => set({ removed: [...form.removed, file.id] })}><md-icon>close</md-icon></button>`\n : nothing}\n </li>`\n )}\n ${form.added.map(\n (file, index) => html`<li>\n <md-icon>upload_file</md-icon>${file.name}\n <button aria-label=${t('announcement.button.remove')} @click=${() => set({ added: form.added.filter((_, i) => i !== index) })}><md-icon>close</md-icon></button>\n </li>`\n )}\n </ul>\n ${editable ? html`<ox-input-file quiet hide-filelist multiple icon=\"attach_file\" .progress=${this.progress} @change=${(e: CustomEvent) => this.pick(e)}></ox-input-file>` : nothing}\n </section>\n\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.field.links')}</h3></header>\n <ul class=\"links\">\n ${form.links.map(\n (link, index) => html`<li>\n <input\n class=\"label\"\n .value=${link.label}\n maxlength=\"100\"\n placeholder=${t('announcement.text.link-label')}\n ?disabled=${!editable}\n @input=${(e: any) => set({ links: form.links.map((one, i) => (i === index ? { ...one, label: e.target.value } : one)) })}\n />\n <input\n .value=${link.url}\n placeholder=${t('announcement.text.link-url')}\n ?disabled=${!editable}\n @input=${(e: any) => set({ links: form.links.map((one, i) => (i === index ? { ...one, url: e.target.value } : one)) })}\n />\n ${editable ? html`<button aria-label=${t('announcement.button.remove')} @click=${() => set({ links: form.links.filter((_, i) => i !== index) })}><md-icon>close</md-icon></button>` : nothing}\n </li>`\n )}\n </ul>\n ${editable && form.links.length < 10\n ? html`<button class=\"add-link\" @click=${() => set({ links: [...form.links, { label: '', url: '' }] })}><md-icon>add_link</md-icon>${t('announcement.button.add-link')}</button>\n <span class=\"hint\">${t('announcement.text.link-hint')}</span>`\n : nothing}\n </section>\n\n ${this.out\n ? html`<section class=\"page-section\">\n <label class=\"check\"><input type=\"checkbox\" .checked=${form.notifyAgain} @change=${(e: any) => set({ notifyAgain: e.target.checked })} />${t('announcement.text.notify-again')}</label>\n <span class=\"hint\">${t('announcement.text.new-version', { version: (this.announcement?.version ?? 1) + 1 })}</span>\n </section>`\n : nothing}\n </div>\n </ox-page-state>`\n }\n\n private pick(e: CustomEvent) {\n const picked = [...((e.detail as File[]) ?? [])]\n /* The picker's own reset says `change` again, with nothing - that one is let go. */\n if (!picked.length) return\n ;(e.target as any).reset?.()\n this.draft.set('added', [...this.form.added, ...picked])\n }\n\n private input(): AnnouncementInput {\n const form = this.form\n return {\n title: form.title,\n body: form.body,\n category: form.category,\n importance: form.importance,\n startsAt: isoOf(form.startsAt),\n endsAt: isoOf(form.endsAt),\n pinned: form.pinned,\n requiresAcknowledgement: form.requiresAcknowledgement,\n acknowledgeBy: form.requiresAcknowledgement ? isoOf(form.acknowledgeBy, true) : null,\n popup: form.popup,\n sendEmail: form.sendEmail,\n links: form.links.filter(link => link.label.trim() || link.url.trim()),\n audiences: form.audiences.map(({ scope, targetId, targetName }) => ({ scope, targetId, targetName: targetName ?? undefined }))\n }\n }\n\n /**\n * Keeps it, then sends it out when asked - a draft that cannot go out stays kept, opened as one. Failures are told by\n * the GraphQL link.\n */\n private async save(publish: boolean) {\n if (this.busy) return\n const id = this.announcement?.id\n const { added, removed, notifyAgain } = this.form\n const context = added.length ? uploadContext(fraction => (this.progress = fraction)) : undefined\n const saving = this.draft.submit(() =>\n id\n ? this.saves.update.run({ id, input: this.input(), attach: added, remove: removed, notifyAgain }, { context })\n : this.saves.create.run({ input: this.input(), attach: added }, { context })\n )\n /* The actions wait while it is out. */\n this.updateContext()\n const saved = await saving\n this.progress = undefined\n this.updateContext()\n if (!saved) return\n const kept = id ?? saved.createAnnouncement.id\n if (publish) {\n const sent = await this.saves.publish.run({ id: kept })\n if (sent) {\n notify({ message: sent.publishAnnouncement.status === 'SCHEDULED' ? t('announcement.text.scheduled-done') : t('announcement.text.published-done') })\n navigate(`announcement-view?id=${kept}`)\n return\n }\n } else notify({ message: t('announcement.text.saved') })\n if (!id) navigate(`announcement-editor?id=${kept}`)\n }\n\n private async deleteDraft() {\n const sure = await OxPrompt.open({\n title: t('announcement.button.delete'),\n text: t('announcement.text.delete-confirm', { title: this.announcement!.title }),\n confirmButton: { text: t('announcement.button.delete') },\n cancelButton: { text: t('announcement.button.cancel') }\n })\n if (!sure) return\n if (!(await this.saves.remove.run({ id: this.announcement!.id }))) return\n notify({ message: t('announcement.text.deleted') })\n navigate('announcement-manage-list')\n }\n}\n"]}
@@ -10,9 +10,13 @@ declare const AnnouncementView_base: (new (...args: any[]) => import("lit").LitE
10
10
  */
11
11
  export declare class AnnouncementView extends AnnouncementView_base {
12
12
  static styles: import("lit").CSSResult[];
13
- announcement: AnnouncementItem | null;
14
- loading: boolean;
15
- error: unknown;
13
+ private announcementId;
14
+ private read;
15
+ private reminder;
16
+ get announcement(): AnnouncementItem | null;
17
+ private get error();
18
+ private readFor?;
19
+ updated(): Promise<void>;
16
20
  get context(): {
17
21
  frame: string;
18
22
  menu: string;
@@ -22,7 +26,6 @@ export declare class AnnouncementView extends AnnouncementView_base {
22
26
  };
23
27
  pageUpdated(changes: any, lifecycle: any): Promise<void>;
24
28
  render(): import("lit-html").TemplateResult<1>;
25
- private load;
26
29
  private openReceipts;
27
30
  private remind;
28
31
  private withdraw;
@@ -2,14 +2,16 @@ import { __decorate, __metadata } from "tslib";
2
2
  import '@operato/list-state/ox-page-state.js';
3
3
  import '../components/announcement-sheet.js';
4
4
  import '../components/announcement-receipts.js';
5
+ import gql from 'graphql-tag';
5
6
  import { css, html, nothing } from 'lit';
6
7
  import { customElement, state } from 'lit/decorators.js';
8
+ import { MutationController, QueryController } from '@operato/graphql';
7
9
  import { i18next, localize } from '@operato/i18n';
8
10
  import { notify, openPopup } from '@operato/layout';
9
11
  import { navigate, PageView } from '@operato/shell';
10
12
  import { DocumentPageStyles } from '@operato/styles';
11
- import { announcementApi } from '../utils/announcement-api.js';
12
- import { reasonOf, statusWord, t, when } from '../utils/announcement-words.js';
13
+ import { announcementApi, FULL_FIELDS } from '../utils/announcement-api.js';
14
+ import { statusWord, t, when } from '../utils/announcement-words.js';
13
15
  /**
14
16
  * 공지 보기 — one announcement. Opening it reads it for its audience (ADR-0163 decision 5). Its writers also see whom it
15
17
  * reached and who read it, and change, remind or withdraw it from here (decision 4).
@@ -17,9 +19,12 @@ import { reasonOf, statusWord, t, when } from '../utils/announcement-words.js';
17
19
  let AnnouncementView = class AnnouncementView extends localize(i18next)(PageView) {
18
20
  constructor() {
19
21
  super(...arguments);
20
- this.announcement = null;
21
- this.loading = false;
22
- this.error = null;
22
+ this.announcementId = '';
23
+ /* The announcement the address names, with its writers' counts (ADR-0190). */
24
+ this.read = new QueryController(this, gql `query ($id: String!) { announcement(id: $id) { ${FULL_FIELDS} readCount acknowledgedCount } }`, {
25
+ variables: () => (this.announcementId ? { id: this.announcementId } : undefined)
26
+ });
27
+ this.reminder = new MutationController(this, gql `mutation ($id: String!) { remindAnnouncement(id: $id) }`);
23
28
  }
24
29
  static { this.styles = [
25
30
  DocumentPageStyles,
@@ -50,6 +55,22 @@ let AnnouncementView = class AnnouncementView extends localize(i18next)(PageView
50
55
  }
51
56
  `
52
57
  ]; }
58
+ get announcement() {
59
+ return this.read.data?.announcement ?? null;
60
+ }
61
+ get error() {
62
+ if (this.read.error)
63
+ return this.read.error;
64
+ return this.read.data && !this.announcement ? new Error(t('announcement.refusal.unknown-announcement')) : null;
65
+ }
66
+ async updated() {
67
+ const one = this.announcement;
68
+ if (!one?.addressed || one.mine?.readAt || this.readFor === this.read.data)
69
+ return;
70
+ this.readFor = this.read.data;
71
+ await announcementApi.read(one.id).catch(() => { });
72
+ await this.read.refetch();
73
+ }
53
74
  get context() {
54
75
  const one = this.announcement;
55
76
  const actions = [];
@@ -77,18 +98,18 @@ let AnnouncementView = class AnnouncementView extends localize(i18next)(PageView
77
98
  return;
78
99
  const id = lifecycle?.params?.id;
79
100
  if (id)
80
- await this.load(id);
101
+ this.announcementId = id;
81
102
  }
82
103
  render() {
83
104
  const one = this.announcement;
84
- return html `<ox-page-state .loading=${this.loading} .error=${this.error} @retry=${() => one && this.load(one.id)}>
105
+ return html `<ox-page-state .loading=${this.read.loading} .error=${this.error} @retry=${() => this.read.refetch()}>
85
106
  ${one
86
107
  ? html `<div class="page">
87
108
  <section class="page-section">
88
109
  <h2>${one.title}</h2>
89
110
  ${one.status === 'WITHDRAWN' ? html `<p class="notice">${t('announcement.text.withdrawn', { when: when(one.withdrawnAt), reason: one.withdrawReason ?? '' })}</p>` : nothing}
90
111
  ${one.status === 'SCHEDULED' ? html `<p class="notice">${t('announcement.text.scheduled', { when: when(one.startsAt) })}</p>` : nothing}
91
- <announcement-sheet .announcement=${one} @announcement-acknowledged=${() => this.load(one.id)}></announcement-sheet>
112
+ <announcement-sheet .announcement=${one} @announcement-acknowledged=${() => this.read.refetch()}></announcement-sheet>
92
113
  </section>
93
114
  ${one.editable && one.audiences
94
115
  ? html `<section class="page-section">
@@ -118,29 +139,6 @@ let AnnouncementView = class AnnouncementView extends localize(i18next)(PageView
118
139
  : nothing}
119
140
  </ox-page-state>`;
120
141
  }
121
- async load(id) {
122
- this.loading = true;
123
- this.error = null;
124
- try {
125
- let one = await announcementApi.one(id);
126
- if (!one)
127
- throw new Error(t('announcement.refusal.unknown-announcement'));
128
- /* Opening it reads it - asked again after, so its writer's counts include this reading. */
129
- if (one.addressed && !one.mine?.readAt) {
130
- await announcementApi.read(id);
131
- one = (await announcementApi.one(id)) ?? one;
132
- }
133
- this.announcement = one;
134
- }
135
- catch (error) {
136
- this.announcement = null;
137
- this.error = error;
138
- }
139
- finally {
140
- this.loading = false;
141
- this.updateContext();
142
- }
143
- }
144
142
  openReceipts() {
145
143
  const one = this.announcement;
146
144
  const popup = openPopup(html `<announcement-receipts .announcement=${one} @done=${() => popup.close()}></announcement-receipts>`, {
@@ -150,31 +148,19 @@ let AnnouncementView = class AnnouncementView extends localize(i18next)(PageView
150
148
  });
151
149
  }
152
150
  async remind() {
153
- try {
154
- const told = await announcementApi.remind(this.announcement.id);
155
- notify({ message: t('announcement.text.reminded', { count: told }) });
156
- }
157
- catch (error) {
158
- notify({ level: 'error', message: reasonOf(error) });
159
- }
151
+ const done = await this.reminder.run({ id: this.announcement.id });
152
+ if (done)
153
+ notify({ message: t('announcement.text.reminded', { count: done.remindAnnouncement }) });
160
154
  }
161
155
  withdraw() {
162
156
  const one = this.announcement;
163
- const popup = openPopup(html `<announcement-withdraw-form .announcement=${one} @announcement-withdrawn=${() => this.load(one.id)} @done=${() => popup.close()}></announcement-withdraw-form>`, { backdrop: true, size: 'small', title: `${t('announcement.button.withdraw')} · ${one.title}` });
157
+ const popup = openPopup(html `<announcement-withdraw-form .announcement=${one} @announcement-withdrawn=${() => this.read.refetch()} @done=${() => popup.close()}></announcement-withdraw-form>`, { backdrop: true, size: 'small', title: `${t('announcement.button.withdraw')} · ${one.title}` });
164
158
  }
165
159
  };
166
160
  __decorate([
167
161
  state(),
168
162
  __metadata("design:type", Object)
169
- ], AnnouncementView.prototype, "announcement", void 0);
170
- __decorate([
171
- state(),
172
- __metadata("design:type", Object)
173
- ], AnnouncementView.prototype, "loading", void 0);
174
- __decorate([
175
- state(),
176
- __metadata("design:type", Object)
177
- ], AnnouncementView.prototype, "error", void 0);
163
+ ], AnnouncementView.prototype, "announcementId", void 0);
178
164
  AnnouncementView = __decorate([
179
165
  customElement('announcement-view')
180
166
  ], AnnouncementView);
@@ -1 +1 @@
1
- {"version":3,"file":"announcement-view.js","sourceRoot":"","sources":["../../client/pages/announcement-view.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/list-state/ox-page-state.js'\nimport '../components/announcement-sheet.js'\nimport '../components/announcement-receipts.js'\n\nimport { css, html, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { navigate, PageView } from '@operato/shell'\nimport { DocumentPageStyles } from '@operato/styles'\n\nimport { announcementApi, type AnnouncementItem } from '../utils/announcement-api.js'\nimport { reasonOf, statusWord, t, when } from '../utils/announcement-words.js'\n\n/**\n * 공지 보기 — one announcement. Opening it reads it for its audience (ADR-0163 decision 5). Its writers also see whom it\n * reached and who read it, and change, remind or withdraw it from here (decision 4).\n */\n@customElement('announcement-view')\nexport class AnnouncementView extends localize(i18next)(PageView) {\n static styles = [\n DocumentPageStyles,\n css`\n .notice {\n padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n border-radius: var(--border-radius, 4px);\n background: var(--md-sys-color-surface-container, rgba(0, 0, 0, 0.04));\n font-size: var(--ui-t-body, 14px);\n }\n .audience {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n font-size: var(--ui-t-small, 12px);\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n ul.deliveries {\n margin: var(--spacing-small, 4px) 0 0;\n padding: 0;\n list-style: none;\n font-size: var(--ui-t-small, 12px);\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n h2 {\n margin: 0;\n font-size: var(--ui-t-title-large, 22px);\n }\n `\n ]\n\n @state() announcement: AnnouncementItem | null = null\n @state() loading = false\n @state() error: unknown = null\n\n get context() {\n const one = this.announcement\n const actions: any[] = []\n if (one?.editable) {\n actions.push({ title: t('announcement.button.edit'), icon: 'edit', action: () => navigate(`announcement-editor?id=${one.id}`) })\n if (one.status === 'PUBLISHED') {\n actions.push({ title: t('announcement.button.receipts'), icon: 'groups', action: () => this.openReceipts() })\n actions.push({ title: t('announcement.button.remind'), icon: 'notifications_active', action: () => this.remind() })\n }\n if (one.status === 'PUBLISHED' || one.status === 'SCHEDULED') actions.push({ title: t('announcement.button.withdraw'), icon: 'unpublished', action: () => this.withdraw() })\n actions.push({ title: t('announcement.button.copy'), icon: 'content_copy', action: () => navigate(`announcement-editor?from=${one.id}`) })\n }\n return {\n title: t('announcement.title.view'),\n ...(one && one.status !== 'PUBLISHED' ? { description: statusWord(one.status) } : {}),\n frame: 'document',\n /* Opened from the list of announcements; the menu marks it. */\n menu: 'announcement-list',\n actions\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active || !(changes.active || changes.params)) return\n const id = lifecycle?.params?.id\n if (id) await this.load(id)\n }\n\n render() {\n const one = this.announcement\n return html`<ox-page-state .loading=${this.loading} .error=${this.error} @retry=${() => one && this.load(one.id)}>\n ${one\n ? html`<div class=\"page\">\n <section class=\"page-section\">\n <h2>${one.title}</h2>\n ${one.status === 'WITHDRAWN' ? html`<p class=\"notice\">${t('announcement.text.withdrawn', { when: when(one.withdrawnAt), reason: one.withdrawReason ?? '' })}</p>` : nothing}\n ${one.status === 'SCHEDULED' ? html`<p class=\"notice\">${t('announcement.text.scheduled', { when: when(one.startsAt) })}</p>` : nothing}\n <announcement-sheet .announcement=${one} @announcement-acknowledged=${() => this.load(one.id)}></announcement-sheet>\n </section>\n ${one.editable && one.audiences\n ? html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.field.audience')}</h3></header>\n <div class=\"audience\">\n ${one.audiences.map(target => html`<span>${t(`announcement.scope.${target.scope}`)} · ${target.targetName ?? target.targetId}</span>`)}\n </div>\n ${(one.deliveries ?? []).length\n ? html`<ul class=\"deliveries\">\n ${[...(one.deliveries ?? [])].reverse().map(\n sent => html`<li>\n ${when(sent.at)} · ${t(`announcement.delivery.${sent.kind}`)} ·\n ${sent.failed ? t('announcement.text.delivery-not-sent', { count: sent.receivers }) : t('announcement.text.delivery-app', { count: sent.receivers })}\n ${sent.email.sent || sent.email.failed ? html` · ${t('announcement.text.delivery-email', { sent: sent.email.sent, failed: sent.email.failed })}` : nothing}\n ${sent.teams.sent || sent.teams.failed ? html` · ${t('announcement.text.delivery-teams', { sent: sent.teams.sent, failed: sent.teams.failed })}` : nothing}\n </li>`\n )}\n </ul>`\n : nothing}\n ${one.status === 'PUBLISHED'\n ? html`<p class=\"audience\">\n ${t('announcement.text.reach', { size: one.audienceSize ?? 0, read: one.readCount ?? 0 })}\n ${one.requiresAcknowledgement ? t('announcement.text.reach-acknowledged', { acknowledged: one.acknowledgedCount ?? 0 }) : ''}\n </p>`\n : nothing}\n </section>`\n : nothing}\n </div>`\n : nothing}\n </ox-page-state>`\n }\n\n private async load(id: string) {\n this.loading = true\n this.error = null\n try {\n let one = await announcementApi.one(id)\n if (!one) throw new Error(t('announcement.refusal.unknown-announcement'))\n /* Opening it reads it - asked again after, so its writer's counts include this reading. */\n if (one.addressed && !one.mine?.readAt) {\n await announcementApi.read(id)\n one = (await announcementApi.one(id)) ?? one\n }\n this.announcement = one\n } catch (error) {\n this.announcement = null\n this.error = error\n } finally {\n this.loading = false\n this.updateContext()\n }\n }\n\n private openReceipts() {\n const one = this.announcement!\n const popup: any = openPopup(html`<announcement-receipts .announcement=${one} @done=${() => popup.close()}></announcement-receipts>`, {\n backdrop: true,\n size: 'large',\n title: `${t('announcement.button.receipts')} · ${one.title}`\n })\n }\n\n private async remind() {\n try {\n const told = await announcementApi.remind(this.announcement!.id)\n notify({ message: t('announcement.text.reminded', { count: told }) })\n } catch (error) {\n notify({ level: 'error', message: reasonOf(error) })\n }\n }\n\n private withdraw() {\n const one = this.announcement!\n const popup: any = openPopup(\n html`<announcement-withdraw-form .announcement=${one} @announcement-withdrawn=${() => this.load(one.id)} @done=${() => popup.close()}></announcement-withdraw-form>`,\n { backdrop: true, size: 'small', title: `${t('announcement.button.withdraw')} · ${one.title}` }\n )\n }\n}\n"]}
1
+ {"version":3,"file":"announcement-view.js","sourceRoot":"","sources":["../../client/pages/announcement-view.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/list-state/ox-page-state.js'\nimport '../components/announcement-sheet.js'\nimport '../components/announcement-receipts.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { navigate, PageView } from '@operato/shell'\nimport { DocumentPageStyles } from '@operato/styles'\n\nimport { announcementApi, FULL_FIELDS, type AnnouncementItem } from '../utils/announcement-api.js'\nimport { statusWord, t, when } from '../utils/announcement-words.js'\n\n/**\n * 공지 보기 — one announcement. Opening it reads it for its audience (ADR-0163 decision 5). Its writers also see whom it\n * reached and who read it, and change, remind or withdraw it from here (decision 4).\n */\n@customElement('announcement-view')\nexport class AnnouncementView extends localize(i18next)(PageView) {\n static styles = [\n DocumentPageStyles,\n css`\n .notice {\n padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n border-radius: var(--border-radius, 4px);\n background: var(--md-sys-color-surface-container, rgba(0, 0, 0, 0.04));\n font-size: var(--ui-t-body, 14px);\n }\n .audience {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n font-size: var(--ui-t-small, 12px);\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n ul.deliveries {\n margin: var(--spacing-small, 4px) 0 0;\n padding: 0;\n list-style: none;\n font-size: var(--ui-t-small, 12px);\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n h2 {\n margin: 0;\n font-size: var(--ui-t-title-large, 22px);\n }\n `\n ]\n\n @state() private announcementId = ''\n\n /* The announcement the address names, with its writers' counts (ADR-0190). */\n private read = new QueryController(this, gql`query ($id: String!) { announcement(id: $id) { ${FULL_FIELDS} readCount acknowledgedCount } }`, {\n variables: () => (this.announcementId ? { id: this.announcementId } : undefined)\n })\n\n private reminder = new MutationController(this, gql`mutation ($id: String!) { remindAnnouncement(id: $id) }`)\n\n get announcement(): AnnouncementItem | null {\n return this.read.data?.announcement ?? null\n }\n\n private get error(): unknown {\n if (this.read.error) return this.read.error\n return this.read.data && !this.announcement ? new Error(t('announcement.refusal.unknown-announcement')) : null\n }\n\n /* Opening it reads it - asked again after, so its writer's counts include this reading. */\n private readFor?: unknown\n\n async updated() {\n const one = this.announcement\n if (!one?.addressed || one.mine?.readAt || this.readFor === this.read.data) return\n this.readFor = this.read.data\n await announcementApi.read(one.id).catch(() => {})\n await this.read.refetch()\n }\n\n get context() {\n const one = this.announcement\n const actions: any[] = []\n if (one?.editable) {\n actions.push({ title: t('announcement.button.edit'), icon: 'edit', action: () => navigate(`announcement-editor?id=${one.id}`) })\n if (one.status === 'PUBLISHED') {\n actions.push({ title: t('announcement.button.receipts'), icon: 'groups', action: () => this.openReceipts() })\n actions.push({ title: t('announcement.button.remind'), icon: 'notifications_active', action: () => this.remind() })\n }\n if (one.status === 'PUBLISHED' || one.status === 'SCHEDULED') actions.push({ title: t('announcement.button.withdraw'), icon: 'unpublished', action: () => this.withdraw() })\n actions.push({ title: t('announcement.button.copy'), icon: 'content_copy', action: () => navigate(`announcement-editor?from=${one.id}`) })\n }\n return {\n title: t('announcement.title.view'),\n ...(one && one.status !== 'PUBLISHED' ? { description: statusWord(one.status) } : {}),\n frame: 'document',\n /* Opened from the list of announcements; the menu marks it. */\n menu: 'announcement-list',\n actions\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active || !(changes.active || changes.params)) return\n const id = lifecycle?.params?.id\n if (id) this.announcementId = id\n }\n\n render() {\n const one = this.announcement\n return html`<ox-page-state .loading=${this.read.loading} .error=${this.error} @retry=${() => this.read.refetch()}>\n ${one\n ? html`<div class=\"page\">\n <section class=\"page-section\">\n <h2>${one.title}</h2>\n ${one.status === 'WITHDRAWN' ? html`<p class=\"notice\">${t('announcement.text.withdrawn', { when: when(one.withdrawnAt), reason: one.withdrawReason ?? '' })}</p>` : nothing}\n ${one.status === 'SCHEDULED' ? html`<p class=\"notice\">${t('announcement.text.scheduled', { when: when(one.startsAt) })}</p>` : nothing}\n <announcement-sheet .announcement=${one} @announcement-acknowledged=${() => this.read.refetch()}></announcement-sheet>\n </section>\n ${one.editable && one.audiences\n ? html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${t('announcement.field.audience')}</h3></header>\n <div class=\"audience\">\n ${one.audiences.map(target => html`<span>${t(`announcement.scope.${target.scope}`)} · ${target.targetName ?? target.targetId}</span>`)}\n </div>\n ${(one.deliveries ?? []).length\n ? html`<ul class=\"deliveries\">\n ${[...(one.deliveries ?? [])].reverse().map(\n sent => html`<li>\n ${when(sent.at)} · ${t(`announcement.delivery.${sent.kind}`)} ·\n ${sent.failed ? t('announcement.text.delivery-not-sent', { count: sent.receivers }) : t('announcement.text.delivery-app', { count: sent.receivers })}\n ${sent.email.sent || sent.email.failed ? html` · ${t('announcement.text.delivery-email', { sent: sent.email.sent, failed: sent.email.failed })}` : nothing}\n ${sent.teams.sent || sent.teams.failed ? html` · ${t('announcement.text.delivery-teams', { sent: sent.teams.sent, failed: sent.teams.failed })}` : nothing}\n </li>`\n )}\n </ul>`\n : nothing}\n ${one.status === 'PUBLISHED'\n ? html`<p class=\"audience\">\n ${t('announcement.text.reach', { size: one.audienceSize ?? 0, read: one.readCount ?? 0 })}\n ${one.requiresAcknowledgement ? t('announcement.text.reach-acknowledged', { acknowledged: one.acknowledgedCount ?? 0 }) : ''}\n </p>`\n : nothing}\n </section>`\n : nothing}\n </div>`\n : nothing}\n </ox-page-state>`\n }\n\n private openReceipts() {\n const one = this.announcement!\n const popup: any = openPopup(html`<announcement-receipts .announcement=${one} @done=${() => popup.close()}></announcement-receipts>`, {\n backdrop: true,\n size: 'large',\n title: `${t('announcement.button.receipts')} · ${one.title}`\n })\n }\n\n private async remind() {\n const done = await this.reminder.run({ id: this.announcement!.id })\n if (done) notify({ message: t('announcement.text.reminded', { count: done.remindAnnouncement }) })\n }\n\n private withdraw() {\n const one = this.announcement!\n const popup: any = openPopup(\n html`<announcement-withdraw-form .announcement=${one} @announcement-withdrawn=${() => this.read.refetch()} @done=${() => popup.close()}></announcement-withdraw-form>`,\n { backdrop: true, size: 'small', title: `${t('announcement.button.withdraw')} · ${one.title}` }\n )\n }\n}\n"]}