@things-factory/compliance 10.1.268 → 10.1.269

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 (27) hide show
  1. package/dist-client/components/compliance-case-form.d.ts +1 -0
  2. package/dist-client/components/compliance-case-form.js +3 -2
  3. package/dist-client/components/compliance-case-form.js.map +1 -1
  4. package/dist-client/components/compliance-case-sheet.d.ts +1 -0
  5. package/dist-client/components/compliance-case-sheet.js +3 -2
  6. package/dist-client/components/compliance-case-sheet.js.map +1 -1
  7. package/dist-client/components/invention-report-form.d.ts +1 -0
  8. package/dist-client/components/invention-report-form.js +2 -1
  9. package/dist-client/components/invention-report-form.js.map +1 -1
  10. package/dist-client/components/seal-use-form.d.ts +1 -0
  11. package/dist-client/components/seal-use-form.js +4 -3
  12. package/dist-client/components/seal-use-form.js.map +1 -1
  13. package/dist-client/components/training-attendance-form.d.ts +1 -0
  14. package/dist-client/components/training-attendance-form.js +2 -1
  15. package/dist-client/components/training-attendance-form.js.map +1 -1
  16. package/dist-client/components/training-certificate-form.d.ts +1 -0
  17. package/dist-client/components/training-certificate-form.js +2 -1
  18. package/dist-client/components/training-certificate-form.js.map +1 -1
  19. package/dist-client/components/training-session-form.d.ts +1 -0
  20. package/dist-client/components/training-session-form.js +3 -2
  21. package/dist-client/components/training-session-form.js.map +1 -1
  22. package/dist-client/pages/regulation-detail.d.ts +1 -0
  23. package/dist-client/pages/regulation-detail.js +3 -2
  24. package/dist-client/pages/regulation-detail.js.map +1 -1
  25. package/dist-client/tsconfig.tsbuildinfo +1 -1
  26. package/dist-server/tsconfig.tsbuildinfo +1 -1
  27. package/package.json +16 -16
@@ -1,3 +1,4 @@
1
+ import '@operato/input/ox-input-date.js';
1
2
  import '@material/web/button/filled-button.js';
2
3
  import '@material/web/button/text-button.js';
3
4
  import '@material/web/icon/icon.js';
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@operato/input/ox-input-date.js';
2
3
  import '@material/web/button/filled-button.js';
3
4
  import '@material/web/button/text-button.js';
4
5
  import '@material/web/icon/icon.js';
@@ -167,7 +168,7 @@ let ComplianceCaseForm = class ComplianceCaseForm extends localize(i18next)(LitE
167
168
  ? html `${this.picker('reporter', this.reporter ? [this.reporter] : [], one => (this.reporter = one), () => (this.reporter = null))}
168
169
  <label class="field">
169
170
  <span>${i18next.t('field.compliance-case-received-on')}</span>
170
- <input type="date" .value=${this.receivedOn} @input=${(e) => (this.receivedOn = e.target.value)} />
171
+ <ox-input-date type="date" .value=${this.receivedOn} @change=${(e) => (this.receivedOn = e.target.value)}></ox-input-date>
171
172
  </label>`
172
173
  : nothing}
173
174
  ${this.picker('accused', this.accused, one => this.setAccused([...this.accused.filter(other => other.id !== one.id), one]), one => this.setAccused(this.accused.filter(other => other.id !== one.id)))}
@@ -180,7 +181,7 @@ let ComplianceCaseForm = class ComplianceCaseForm extends localize(i18next)(LitE
180
181
 
181
182
  <label class="field">
182
183
  <span>${i18next.t('field.compliance-case-occurred-on')}</span>
183
- <input type="date" .value=${this.occurredOn} @input=${(e) => (this.occurredOn = e.target.value)} />
184
+ <ox-input-date type="date" .value=${this.occurredOn} @change=${(e) => (this.occurredOn = e.target.value)}></ox-input-date>
184
185
  </label>
185
186
 
186
187
  <label class="field">
@@ -1 +1 @@
1
- {"version":3,"file":"compliance-case-form.js","sourceRoot":"","sources":["../../client/components/compliance-case-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-select-buttons.js'\nimport '@operato/popup/ox-popup-actions.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf, wordOf } from '../words.js'\n\nexport const CASE_KINDS = ['HARASSMENT', 'SEXUAL_HARASSMENT']\n\ntype Person = { id: string; name: string; note?: string }\n\n/**\n * Opens the report form; resolves with the written case, or null when closed. `handler` is the case handler writing a\n * report received another way - who reported it and the day it came.\n */\nexport function openComplianceCaseForm(handler = false): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const popup: any = openPopup(\n html`<compliance-case-form .handler=${handler} @close=${() => popup.close()} @reported=${(e: CustomEvent) => ((done = e.detail), popup.close())}></compliance-case-form>`,\n { backdrop: true, size: 'medium', title: i18next.t(handler ? 'title.compliance-case-record' : 'title.compliance-case-report') }\n )\n popup.onclosed = () => resolve(done)\n })\n}\n\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\n/**\n * 신고하기 (ADR-0187 decision 21) - what happened, to whom, by whom and when, with files. When every case handler is\n * among those named, the form says the investigation starts once the company names a case handler (amendment 5).\n */\n@customElement('compliance-case-form')\nexport class ComplianceCaseForm extends localize(i18next)(LitElement) {\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n [guide] p {\n margin: 0;\n color: var(--ui-muted);\n line-height: var(--popup-line-height);\n }\n [outside] {\n padding: var(--spacing-medium, 8px);\n border: 1px solid var(--ui-crit, var(--md-sys-color-error));\n border-radius: var(--md-sys-shape-corner-small, 4px);\n line-height: var(--popup-line-height);\n }\n [outside] p {\n margin: 0;\n }\n ox-input-select-buttons {\n align-self: flex-start;\n }\n .chips {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n .chips button,\n .found button {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 2px var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n background: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n .chips md-icon {\n --md-icon-size: 14px;\n }\n .found {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n textarea {\n min-height: 120px;\n }\n `\n ]\n\n @property({ type: Boolean }) handler = false\n\n @state() private kind = 'HARASSMENT'\n @state() private accused: Person[] = []\n @state() private victim: Person | null = null\n @state() private reporter: Person | null = null\n @state() private occurredOn = ''\n @state() private receivedOn = today()\n @state() private description = ''\n @state() private files: File[] = []\n /* The words typed to find a person, and the field they are typed in. */\n @state() private searched: { for: string; text: string } = { for: '', text: '' }\n\n /* The people the words find, and whether a case handler is left to take it once the accused are named (ADR-0190). */\n private people = new QueryController(\n this,\n gql`\n query ($text: String!) {\n complianceCasePeople(text: $text) { id name note }\n }\n `,\n { variables: () => (this.searched.text.trim() ? { text: this.searched.text } : undefined), keepPrevious: true }\n )\n\n private handlerLeft = new QueryController(\n this,\n gql`\n query ($ids: [String!]!) {\n complianceCaseHandlerLeft(accusedIds: $ids)\n }\n `,\n { variables: () => (this.accused.length ? { ids: this.accused.map(one => one.id) } : undefined) }\n )\n\n /* Its failure is drawn at the foot of the form. */\n private saves = {\n record: new MutationController(\n this,\n gql`\n mutation ($case: NewComplianceCase!, $attach: [Upload!]) {\n written: recordComplianceCase(case: $case, attach: $attach) { id noInsideHandler }\n }\n `,\n { showsError: true }\n ),\n report: new MutationController(\n this,\n gql`\n mutation ($report: NewComplianceCaseReport!, $attach: [Upload!]) {\n written: reportComplianceCase(report: $report, attach: $attach) { id noInsideHandler }\n }\n `,\n { showsError: true }\n )\n }\n\n private get found(): { for: string; people: Person[] } {\n if (!this.searched.text.trim()) return { for: '', people: [] }\n return { for: this.searched.for, people: this.people.data?.complianceCasePeople ?? [] }\n }\n\n private get noneInside() {\n return this.accused.length > 0 && this.handlerLeft.data?.complianceCaseHandlerLeft === false\n }\n\n private get save() {\n return this.handler ? this.saves.record : this.saves.report\n }\n\n private get working() {\n return this.save.pending\n }\n\n private get message() {\n return this.save.error ? failureOf(this.save.error) : ''\n }\n\n render() {\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.compliance-case-report-guide')}</p></div>\n\n <div class=\"field\">\n <ox-input-select-buttons\n .value=${this.kind}\n .options=${CASE_KINDS.map(code => ({ display: wordOf('compliance-case-kind', code), value: code }))}\n @change=${(e: CustomEvent) => e.detail && (this.kind = e.detail)}\n ></ox-input-select-buttons>\n </div>\n\n ${this.handler\n ? html`${this.picker('reporter', this.reporter ? [this.reporter] : [], one => (this.reporter = one), () => (this.reporter = null))}\n <label class=\"field\">\n <span>${i18next.t('field.compliance-case-received-on')}</span>\n <input type=\"date\" .value=${this.receivedOn} @input=${(e: any) => (this.receivedOn = e.target.value)} />\n </label>`\n : nothing}\n ${this.picker(\n 'accused',\n this.accused,\n one => this.setAccused([...this.accused.filter(other => other.id !== one.id), one]),\n one => this.setAccused(this.accused.filter(other => other.id !== one.id))\n )}\n ${this.noneInside\n ? html`<div outside>\n <p>${i18next.t('text.compliance-case-no-inside-handler')}</p>\n </div>`\n : nothing}\n ${this.picker('victim', this.victim ? [this.victim] : [], one => (this.victim = one), () => (this.victim = null))}\n\n <label class=\"field\">\n <span>${i18next.t('field.compliance-case-occurred-on')}</span>\n <input type=\"date\" .value=${this.occurredOn} @input=${(e: any) => (this.occurredOn = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.compliance-case-description')}</span>\n <textarea .value=${this.description} @input=${(e: any) => (this.description = e.target.value)}></textarea>\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.compliance-case-attachments')}</span>\n <ox-input-file multiple icon=\"attach_file\" @change=${(e: CustomEvent) => (this.files = [...((e.detail as File[]) ?? [])])}></ox-input-file>\n <span invalid>${this.message}</span>\n </div>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.submit()}>${i18next.t(this.handler ? 'button.compliance-case-record' : 'button.compliance-case-report')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n /** People named so far, and a name box that finds employees still working here. */\n private picker(field: string, chosen: Person[], add: (one: Person) => void, remove: (one: Person) => void) {\n const found = this.found.for === field ? this.found.people.filter(one => !chosen.some(other => other.id === one.id)) : []\n return html`<label class=\"field\">\n <span>${i18next.t(`field.compliance-case-${field}`)}</span>\n ${chosen.length\n ? html`<div class=\"chips\">\n ${chosen.map(one => html`<button type=\"button\" aria-label=${i18next.t('button.compliance-case-remove')} @click=${() => remove(one)}>${one.name}<md-icon>close</md-icon></button>`)}\n </div>`\n : nothing}\n <input placeholder=${i18next.t('text.compliance-case-find-person')} @input=${(e: any) => this.find(field, e.target.value)} />\n ${found.length\n ? html`<div class=\"found\">\n ${found.map(one => html`<button type=\"button\" @click=${() => ((this.searched = { for: '', text: '' }), add(one))}>${one.note ? `${one.name} · ${one.note}` : one.name}</button>`)}\n </div>`\n : nothing}\n </label>`\n }\n\n private find(field: string, text: string) {\n this.searched = { for: field, text }\n }\n\n /** The people named against - whether a case handler is left is read for them. */\n private setAccused(people: Person[]) {\n this.accused = people\n }\n\n private async submit() {\n const report = {\n kind: this.kind,\n accusedIds: this.accused.map(one => one.id),\n victimId: this.victim?.id ?? null,\n occurredOn: this.occurredOn || null,\n description: this.description\n }\n const context = this.files.length ? uploadContext(() => {}) : undefined\n const done = this.handler\n ? await this.saves.record.run({ case: { ...report, reporterId: this.reporter?.id ?? null, receivedOn: this.receivedOn }, attach: this.files }, { context })\n : await this.saves.report.run({ report, attach: this.files }, { context })\n if (!done) return\n const written = done.written\n notify({ message: i18next.t(written.noInsideHandler ? 'text.compliance-case-reported-outside' : 'text.compliance-case-reported') })\n this.dispatchEvent(new CustomEvent('reported', { detail: written }))\n }\n}\n"]}
1
+ {"version":3,"file":"compliance-case-form.js","sourceRoot":"","sources":["../../client/components/compliance-case-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-date.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-select-buttons.js'\nimport '@operato/popup/ox-popup-actions.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf, wordOf } from '../words.js'\n\nexport const CASE_KINDS = ['HARASSMENT', 'SEXUAL_HARASSMENT']\n\ntype Person = { id: string; name: string; note?: string }\n\n/**\n * Opens the report form; resolves with the written case, or null when closed. `handler` is the case handler writing a\n * report received another way - who reported it and the day it came.\n */\nexport function openComplianceCaseForm(handler = false): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const popup: any = openPopup(\n html`<compliance-case-form .handler=${handler} @close=${() => popup.close()} @reported=${(e: CustomEvent) => ((done = e.detail), popup.close())}></compliance-case-form>`,\n { backdrop: true, size: 'medium', title: i18next.t(handler ? 'title.compliance-case-record' : 'title.compliance-case-report') }\n )\n popup.onclosed = () => resolve(done)\n })\n}\n\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\n/**\n * 신고하기 (ADR-0187 decision 21) - what happened, to whom, by whom and when, with files. When every case handler is\n * among those named, the form says the investigation starts once the company names a case handler (amendment 5).\n */\n@customElement('compliance-case-form')\nexport class ComplianceCaseForm extends localize(i18next)(LitElement) {\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n [guide] p {\n margin: 0;\n color: var(--ui-muted);\n line-height: var(--popup-line-height);\n }\n [outside] {\n padding: var(--spacing-medium, 8px);\n border: 1px solid var(--ui-crit, var(--md-sys-color-error));\n border-radius: var(--md-sys-shape-corner-small, 4px);\n line-height: var(--popup-line-height);\n }\n [outside] p {\n margin: 0;\n }\n ox-input-select-buttons {\n align-self: flex-start;\n }\n .chips {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n .chips button,\n .found button {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 2px var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n background: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n .chips md-icon {\n --md-icon-size: 14px;\n }\n .found {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n textarea {\n min-height: 120px;\n }\n `\n ]\n\n @property({ type: Boolean }) handler = false\n\n @state() private kind = 'HARASSMENT'\n @state() private accused: Person[] = []\n @state() private victim: Person | null = null\n @state() private reporter: Person | null = null\n @state() private occurredOn = ''\n @state() private receivedOn = today()\n @state() private description = ''\n @state() private files: File[] = []\n /* The words typed to find a person, and the field they are typed in. */\n @state() private searched: { for: string; text: string } = { for: '', text: '' }\n\n /* The people the words find, and whether a case handler is left to take it once the accused are named (ADR-0190). */\n private people = new QueryController(\n this,\n gql`\n query ($text: String!) {\n complianceCasePeople(text: $text) { id name note }\n }\n `,\n { variables: () => (this.searched.text.trim() ? { text: this.searched.text } : undefined), keepPrevious: true }\n )\n\n private handlerLeft = new QueryController(\n this,\n gql`\n query ($ids: [String!]!) {\n complianceCaseHandlerLeft(accusedIds: $ids)\n }\n `,\n { variables: () => (this.accused.length ? { ids: this.accused.map(one => one.id) } : undefined) }\n )\n\n /* Its failure is drawn at the foot of the form. */\n private saves = {\n record: new MutationController(\n this,\n gql`\n mutation ($case: NewComplianceCase!, $attach: [Upload!]) {\n written: recordComplianceCase(case: $case, attach: $attach) { id noInsideHandler }\n }\n `,\n { showsError: true }\n ),\n report: new MutationController(\n this,\n gql`\n mutation ($report: NewComplianceCaseReport!, $attach: [Upload!]) {\n written: reportComplianceCase(report: $report, attach: $attach) { id noInsideHandler }\n }\n `,\n { showsError: true }\n )\n }\n\n private get found(): { for: string; people: Person[] } {\n if (!this.searched.text.trim()) return { for: '', people: [] }\n return { for: this.searched.for, people: this.people.data?.complianceCasePeople ?? [] }\n }\n\n private get noneInside() {\n return this.accused.length > 0 && this.handlerLeft.data?.complianceCaseHandlerLeft === false\n }\n\n private get save() {\n return this.handler ? this.saves.record : this.saves.report\n }\n\n private get working() {\n return this.save.pending\n }\n\n private get message() {\n return this.save.error ? failureOf(this.save.error) : ''\n }\n\n render() {\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.compliance-case-report-guide')}</p></div>\n\n <div class=\"field\">\n <ox-input-select-buttons\n .value=${this.kind}\n .options=${CASE_KINDS.map(code => ({ display: wordOf('compliance-case-kind', code), value: code }))}\n @change=${(e: CustomEvent) => e.detail && (this.kind = e.detail)}\n ></ox-input-select-buttons>\n </div>\n\n ${this.handler\n ? html`${this.picker('reporter', this.reporter ? [this.reporter] : [], one => (this.reporter = one), () => (this.reporter = null))}\n <label class=\"field\">\n <span>${i18next.t('field.compliance-case-received-on')}</span>\n <ox-input-date type=\"date\" .value=${this.receivedOn} @change=${(e: any) => (this.receivedOn = e.target.value)}></ox-input-date>\n </label>`\n : nothing}\n ${this.picker(\n 'accused',\n this.accused,\n one => this.setAccused([...this.accused.filter(other => other.id !== one.id), one]),\n one => this.setAccused(this.accused.filter(other => other.id !== one.id))\n )}\n ${this.noneInside\n ? html`<div outside>\n <p>${i18next.t('text.compliance-case-no-inside-handler')}</p>\n </div>`\n : nothing}\n ${this.picker('victim', this.victim ? [this.victim] : [], one => (this.victim = one), () => (this.victim = null))}\n\n <label class=\"field\">\n <span>${i18next.t('field.compliance-case-occurred-on')}</span>\n <ox-input-date type=\"date\" .value=${this.occurredOn} @change=${(e: any) => (this.occurredOn = e.target.value)}></ox-input-date>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.compliance-case-description')}</span>\n <textarea .value=${this.description} @input=${(e: any) => (this.description = e.target.value)}></textarea>\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.compliance-case-attachments')}</span>\n <ox-input-file multiple icon=\"attach_file\" @change=${(e: CustomEvent) => (this.files = [...((e.detail as File[]) ?? [])])}></ox-input-file>\n <span invalid>${this.message}</span>\n </div>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.submit()}>${i18next.t(this.handler ? 'button.compliance-case-record' : 'button.compliance-case-report')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n /** People named so far, and a name box that finds employees still working here. */\n private picker(field: string, chosen: Person[], add: (one: Person) => void, remove: (one: Person) => void) {\n const found = this.found.for === field ? this.found.people.filter(one => !chosen.some(other => other.id === one.id)) : []\n return html`<label class=\"field\">\n <span>${i18next.t(`field.compliance-case-${field}`)}</span>\n ${chosen.length\n ? html`<div class=\"chips\">\n ${chosen.map(one => html`<button type=\"button\" aria-label=${i18next.t('button.compliance-case-remove')} @click=${() => remove(one)}>${one.name}<md-icon>close</md-icon></button>`)}\n </div>`\n : nothing}\n <input placeholder=${i18next.t('text.compliance-case-find-person')} @input=${(e: any) => this.find(field, e.target.value)} />\n ${found.length\n ? html`<div class=\"found\">\n ${found.map(one => html`<button type=\"button\" @click=${() => ((this.searched = { for: '', text: '' }), add(one))}>${one.note ? `${one.name} · ${one.note}` : one.name}</button>`)}\n </div>`\n : nothing}\n </label>`\n }\n\n private find(field: string, text: string) {\n this.searched = { for: field, text }\n }\n\n /** The people named against - whether a case handler is left is read for them. */\n private setAccused(people: Person[]) {\n this.accused = people\n }\n\n private async submit() {\n const report = {\n kind: this.kind,\n accusedIds: this.accused.map(one => one.id),\n victimId: this.victim?.id ?? null,\n occurredOn: this.occurredOn || null,\n description: this.description\n }\n const context = this.files.length ? uploadContext(() => {}) : undefined\n const done = this.handler\n ? await this.saves.record.run({ case: { ...report, reporterId: this.reporter?.id ?? null, receivedOn: this.receivedOn }, attach: this.files }, { context })\n : await this.saves.report.run({ report, attach: this.files }, { context })\n if (!done) return\n const written = done.written\n notify({ message: i18next.t(written.noInsideHandler ? 'text.compliance-case-reported-outside' : 'text.compliance-case-reported') })\n this.dispatchEvent(new CustomEvent('reported', { detail: written }))\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@operato/input/ox-input-date.js';
1
2
  import '@material/web/button/filled-button.js';
2
3
  import '@material/web/button/text-button.js';
3
4
  import '@material/web/icon/icon.js';
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@operato/input/ox-input-date.js';
2
3
  import '@material/web/button/filled-button.js';
3
4
  import '@material/web/button/text-button.js';
4
5
  import '@material/web/icon/icon.js';
@@ -209,7 +210,7 @@ let ComplianceCaseSheet = class ComplianceCaseSheet extends localize(i18next)(Li
209
210
  ${HANDLING.map(field => DAYS.includes(field)
210
211
  ? html `<label class="field">
211
212
  <span>${i18next.t(`field.compliance-case-${kebab(field)}`)}</span>
212
- <input type="date" ?disabled=${closed} .value=${this.handling.value(field) ?? ''} @input=${(e) => this.handling.set(field, e.target.value)} />
213
+ <ox-input-date type="date" ?disabled=${closed} .value=${this.handling.value(field) ?? ''} @change=${(e) => this.handling.set(field, e.target.value)}></ox-input-date>
213
214
  </label>`
214
215
  : html `<label class="field">
215
216
  <span>${i18next.t(`field.compliance-case-${kebab(field)}`)}</span>
@@ -229,7 +230,7 @@ let ComplianceCaseSheet = class ComplianceCaseSheet extends localize(i18next)(Li
229
230
  ? nothing
230
231
  : html `<label class="field">
231
232
  <span>${i18next.t('field.compliance-case-entry-written-on')}</span>
232
- <input type="date" .value=${this.entry.value('writtenOn') ?? ''} @input=${(e) => this.entry.set('writtenOn', e.target.value)} />
233
+ <ox-input-date type="date" .value=${this.entry.value('writtenOn') ?? ''} @change=${(e) => this.entry.set('writtenOn', e.target.value)}></ox-input-date>
233
234
  </label>
234
235
  <label class="field">
235
236
  <span>${i18next.t('field.compliance-case-entry-body')}</span>
@@ -1 +1 @@
1
- {"version":3,"file":"compliance-case-sheet.js","sourceRoot":"","sources":["../../client/components/compliance-case-sheet.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/popup/ox-popup-actions.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { DraftController } from '@operato/shell'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf, wordOf } from '../words.js'\n\n/** Opens one case's sheet; resolves when it closes. */\nexport function openComplianceCaseSheet(id: string): Promise<void> {\n return new Promise(resolve => {\n const popup: any = openPopup(html`<compliance-case-sheet .caseId=${id} @close=${() => popup.close()}></compliance-case-sheet>`, {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.compliance-case-sheet')\n })\n popup.onclosed = () => resolve()\n })\n}\n\nconst HANDLING = ['investigationStartedOn', 'protectionMeasures', 'victimOpinion', 'finding', 'actionOnAccused', 'resultNotice', 'resultToldOn', 'closedOn']\nconst DAYS = ['investigationStartedOn', 'resultToldOn', 'closedOn']\nconst kebab = (name: string) => name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\ntype Person = { id: string; name: string; note?: string }\ntype Handling = Record<string, any> & { investigators: Person[] }\ntype Entry = { writtenOn: string; body: string; files: File[] }\n\n/**\n * 사건 처리 (ADR-0187 decision 21) - one case whole, for its handlers and investigators: the report, who investigates\n * it, the investigation record, the protection of the victim with their view, the finding, what was done to those\n * reported against, the result told and the closing. A value changed keeps a correction; nothing is deleted.\n */\n@customElement('compliance-case-sheet')\nexport class ComplianceCaseSheet extends localize(i18next)(LitElement) {\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n dl {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: 2px var(--spacing-large, 12px);\n margin: 0;\n }\n dt {\n color: var(--ui-muted);\n }\n dd {\n margin: 0;\n white-space: pre-wrap;\n }\n h4 {\n margin: var(--spacing-medium, 8px) 0 0;\n }\n ul {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n li {\n padding: var(--spacing-small, 4px) 0;\n border-top: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n white-space: pre-wrap;\n }\n .muted {\n color: var(--ui-muted);\n }\n .chips,\n .found {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n .chips button,\n .found button {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 2px var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n background: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n .chips md-icon {\n --md-icon-size: 14px;\n }\n textarea {\n min-height: 64px;\n }\n `\n ]\n\n @property({ type: String }) caseId = ''\n\n /* The words typed to find an investigator. */\n @state() private searched = ''\n\n /* The case, read for the case the sheet opens (ADR-0190). */\n private record = new QueryController(\n this,\n gql`\n query ($id: String!) {\n complianceCase(id: $id) {\n id kind status receivedOn investigationDueOn occurredOn description\n investigationStartedOn protectionMeasures victimOpinion finding actionOnAccused resultNotice resultToldOn closedOn\n reporter { id name } victim { id name } accused { id name } investigators { id name email }\n attachments { id name fullpath }\n entries { id writtenOn body creator { id name } attachments { id name fullpath } }\n corrections { id field before after createdAt creator { id name } }\n }\n }\n `,\n { variables: () => (this.caseId ? { id: this.caseId } : undefined) }\n )\n\n /* What is typed over the handling read, and the investigation entry being written. */\n private handling = new DraftController<Handling>(this, {\n read: () => {\n const one = this.one\n if (!one) return undefined\n return {\n ...Object.fromEntries(HANDLING.map(field => [field, one[field] ?? ''])),\n investigators: (one.investigators ?? []).map((person: any) => ({ id: person.id, name: person.name, note: person.email }))\n } as Handling\n },\n key: () => this.caseId\n })\n private entry = new DraftController<Entry>(this, { read: () => ({ writtenOn: today(), body: '', files: [] }), key: () => this.caseId })\n\n /* Each save reads the case again; its refusal is said in the sheet. */\n private saves = {\n handle: this.saving(gql`mutation ($patch: ComplianceCaseHandling!) { handleComplianceCase(patch: $patch) { id } }`),\n entry: this.saving(gql`\n mutation ($caseId: String!, $writtenOn: String!, $body: String!, $attach: [Upload!]) {\n addComplianceCaseEntry(caseId: $caseId, writtenOn: $writtenOn, body: $body, attach: $attach) { id }\n }\n `)\n }\n\n private saving(mutation: any) {\n return new MutationController(this, mutation, { refetch: () => [this.record], showsError: true })\n }\n\n private get one(): any {\n return this.record.data?.complianceCase ?? null\n }\n\n private get investigators(): Person[] {\n return this.handling.value('investigators') ?? []\n }\n\n private get working() {\n return Object.values(this.saves).some(save => save.pending)\n }\n\n /** What went wrong last: the read, or a save. */\n private get message() {\n const failed = this.record.error ?? this.saves.handle.error ?? this.saves.entry.error\n return failed ? failureOf(failed) : ''\n }\n\n /* The users the words find (ADR-0190). */\n private choices = new QueryController(\n this,\n gql`\n query ($text: String!) {\n complianceCaseInvestigatorChoices(text: $text) { id name note }\n }\n `,\n { variables: () => (this.searched.trim() ? { text: this.searched } : undefined), keepPrevious: true }\n )\n\n private get found(): Person[] {\n return this.searched.trim() ? (this.choices.data?.complianceCaseInvestigatorChoices ?? []) : []\n }\n\n render() {\n const one = this.one\n if (!one) return html`<div class=\"body\"><span invalid>${this.message}</span></div>`\n const closed = !!one.closedOn\n const fact = (field: string, value: any) => (value ? html`<dt>${i18next.t(`field.compliance-case-${field}`)}</dt><dd>${value}</dd>` : nothing)\n return html`\n <div class=\"body\">\n <dl>\n ${fact('kind', wordOf('compliance-case-kind', one.kind))} ${fact('status', wordOf('compliance-case-status', one.status))} ${fact('received-on', one.receivedOn)}\n ${fact('investigation-due-on', one.investigationDueOn)} ${fact('reporter', one.reporter?.name)} ${fact('victim', one.victim?.name)}\n ${fact('accused', (one.accused ?? []).map((person: any) => person.name).join(', '))} ${fact('occurred-on', one.occurredOn)} ${fact('description', one.description)}\n ${fact('attachments', (one.attachments ?? []).length ? html`${one.attachments.map((file: any) => html`<a href=${file.fullpath} target=\"_blank\">${file.name}</a> `)}` : '')}\n </dl>\n\n <div class=\"field\">\n <span>${i18next.t('field.compliance-case-investigators')}</span>\n <div class=\"chips\">\n ${this.investigators.map(\n person =>\n html`<button type=\"button\" ?disabled=${closed} aria-label=${i18next.t('button.compliance-case-remove')} @click=${() => this.handling.set('investigators', this.investigators.filter(other => other.id !== person.id))}>\n ${person.name}<md-icon>close</md-icon>\n </button>`\n )}\n </div>\n ${closed\n ? nothing\n : html`<input placeholder=${i18next.t('text.compliance-case-find-person')} @input=${(e: any) => this.find(e.target.value)} />\n <div class=\"found\">\n ${this.found\n .filter(person => !this.investigators.some(other => other.id === person.id))\n .map(person => html`<button type=\"button\" @click=${() => (this.handling.set('investigators', [...this.investigators, person]), (this.searched = ''))}>${person.note ? `${person.name} · ${person.note}` : person.name}</button>`)}\n </div>`}\n </div>\n\n ${HANDLING.map(field =>\n DAYS.includes(field)\n ? html`<label class=\"field\">\n <span>${i18next.t(`field.compliance-case-${kebab(field)}`)}</span>\n <input type=\"date\" ?disabled=${closed} .value=${this.handling.value(field) ?? ''} @input=${(e: any) => this.handling.set(field, e.target.value)} />\n </label>`\n : html`<label class=\"field\">\n <span>${i18next.t(`field.compliance-case-${kebab(field)}`)}</span>\n <textarea ?disabled=${closed} .value=${this.handling.value(field) ?? ''} @input=${(e: any) => this.handling.set(field, e.target.value)}></textarea>\n </label>`\n )}\n\n <h4>${i18next.t('field.compliance-case-entries')}</h4>\n ${(one.entries ?? []).length\n ? html`<ul>\n ${one.entries.map(\n (entry: any) => html`<li>\n <span class=\"muted\">${entry.writtenOn} · ${entry.creator?.name ?? ''}</span><br />${entry.body}\n ${(entry.attachments ?? []).map((file: any) => html` <a href=${file.fullpath} target=\"_blank\">${file.name}</a>`)}\n </li>`\n )}\n </ul>`\n : html`<span class=\"muted\">${i18next.t('text.compliance-case-entries-empty')}</span>`}\n ${closed\n ? nothing\n : html`<label class=\"field\">\n <span>${i18next.t('field.compliance-case-entry-written-on')}</span>\n <input type=\"date\" .value=${this.entry.value('writtenOn') ?? ''} @input=${(e: any) => this.entry.set('writtenOn', e.target.value)} />\n </label>\n <label class=\"field\">\n <span>${i18next.t('field.compliance-case-entry-body')}</span>\n <textarea .value=${this.entry.value('body') ?? ''} @input=${(e: any) => this.entry.set('body', e.target.value)}></textarea>\n </label>\n <div class=\"field\">\n <ox-input-file multiple icon=\"attach_file\" @change=${(e: CustomEvent) => this.entry.set('files', [...((e.detail as File[]) ?? [])])}></ox-input-file>\n <md-text-button ?disabled=${this.working || !(this.entry.value('body') ?? '').trim()} @click=${() => this.addEntry()}>${i18next.t('button.compliance-case-add-entry')}</md-text-button>\n </div>`}\n ${(one.corrections ?? []).length\n ? html`<h4>${i18next.t('field.compliance-case-corrections')}</h4>\n <ul>\n ${one.corrections.map(\n (row: any) =>\n html`<li class=\"muted\">${new Date(row.createdAt).toLocaleString()} · ${row.creator?.name ?? ''} · ${i18next.t(`field.compliance-case-${kebab(row.field === 'investigatorIds' ? 'investigators' : row.field)}`)}: ${row.before ?? ''} → ${row.after ?? ''}</li>`\n )}\n </ul>`\n : nothing}\n <span invalid>${this.message}</span>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.close')}</md-text-button>\n ${closed ? nothing : html`<md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.save()}>${i18next.t('button.save')}</md-filled-button>`}\n </ox-popup-actions>\n `\n }\n\n private find(text: string) {\n this.searched = text\n }\n\n /** Only what was changed goes, as a correction of what was read. */\n private async save() {\n const one = this.one\n const changed = HANDLING.filter(field => (this.handling.value(field) ?? '') !== (one[field] ?? ''))\n const before = (one.investigators ?? []).map((person: any) => person.id).sort().join()\n const after = this.investigators.map(person => person.id).sort().join()\n const patch: any = { id: one.id, ...Object.fromEntries(changed.map(field => [field, this.handling.value(field) || null])) }\n if (before !== after) patch.investigatorIds = this.investigators.map(person => person.id)\n const saved = await this.handling.submit(() => this.saves.handle.run({ patch }))\n if (saved) notify({ message: i18next.t('text.compliance-case-saved') })\n }\n\n private async addEntry() {\n const writtenOn = this.entry.value('writtenOn')\n const body = this.entry.value('body')\n const files = this.entry.value('files') ?? []\n const added = await this.entry.submit(() =>\n this.saves.entry.run({ caseId: this.one.id, writtenOn, body, attach: files }, { context: files.length ? uploadContext(() => {}) : undefined })\n )\n if (added) notify({ message: i18next.t('text.compliance-case-saved') })\n }\n}\n"]}
1
+ {"version":3,"file":"compliance-case-sheet.js","sourceRoot":"","sources":["../../client/components/compliance-case-sheet.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-date.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/popup/ox-popup-actions.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { DraftController } from '@operato/shell'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf, wordOf } from '../words.js'\n\n/** Opens one case's sheet; resolves when it closes. */\nexport function openComplianceCaseSheet(id: string): Promise<void> {\n return new Promise(resolve => {\n const popup: any = openPopup(html`<compliance-case-sheet .caseId=${id} @close=${() => popup.close()}></compliance-case-sheet>`, {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.compliance-case-sheet')\n })\n popup.onclosed = () => resolve()\n })\n}\n\nconst HANDLING = ['investigationStartedOn', 'protectionMeasures', 'victimOpinion', 'finding', 'actionOnAccused', 'resultNotice', 'resultToldOn', 'closedOn']\nconst DAYS = ['investigationStartedOn', 'resultToldOn', 'closedOn']\nconst kebab = (name: string) => name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\ntype Person = { id: string; name: string; note?: string }\ntype Handling = Record<string, any> & { investigators: Person[] }\ntype Entry = { writtenOn: string; body: string; files: File[] }\n\n/**\n * 사건 처리 (ADR-0187 decision 21) - one case whole, for its handlers and investigators: the report, who investigates\n * it, the investigation record, the protection of the victim with their view, the finding, what was done to those\n * reported against, the result told and the closing. A value changed keeps a correction; nothing is deleted.\n */\n@customElement('compliance-case-sheet')\nexport class ComplianceCaseSheet extends localize(i18next)(LitElement) {\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n dl {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: 2px var(--spacing-large, 12px);\n margin: 0;\n }\n dt {\n color: var(--ui-muted);\n }\n dd {\n margin: 0;\n white-space: pre-wrap;\n }\n h4 {\n margin: var(--spacing-medium, 8px) 0 0;\n }\n ul {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n li {\n padding: var(--spacing-small, 4px) 0;\n border-top: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n white-space: pre-wrap;\n }\n .muted {\n color: var(--ui-muted);\n }\n .chips,\n .found {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n .chips button,\n .found button {\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 2px var(--spacing-medium, 8px);\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n background: none;\n color: inherit;\n font: inherit;\n cursor: pointer;\n }\n .chips md-icon {\n --md-icon-size: 14px;\n }\n textarea {\n min-height: 64px;\n }\n `\n ]\n\n @property({ type: String }) caseId = ''\n\n /* The words typed to find an investigator. */\n @state() private searched = ''\n\n /* The case, read for the case the sheet opens (ADR-0190). */\n private record = new QueryController(\n this,\n gql`\n query ($id: String!) {\n complianceCase(id: $id) {\n id kind status receivedOn investigationDueOn occurredOn description\n investigationStartedOn protectionMeasures victimOpinion finding actionOnAccused resultNotice resultToldOn closedOn\n reporter { id name } victim { id name } accused { id name } investigators { id name email }\n attachments { id name fullpath }\n entries { id writtenOn body creator { id name } attachments { id name fullpath } }\n corrections { id field before after createdAt creator { id name } }\n }\n }\n `,\n { variables: () => (this.caseId ? { id: this.caseId } : undefined) }\n )\n\n /* What is typed over the handling read, and the investigation entry being written. */\n private handling = new DraftController<Handling>(this, {\n read: () => {\n const one = this.one\n if (!one) return undefined\n return {\n ...Object.fromEntries(HANDLING.map(field => [field, one[field] ?? ''])),\n investigators: (one.investigators ?? []).map((person: any) => ({ id: person.id, name: person.name, note: person.email }))\n } as Handling\n },\n key: () => this.caseId\n })\n private entry = new DraftController<Entry>(this, { read: () => ({ writtenOn: today(), body: '', files: [] }), key: () => this.caseId })\n\n /* Each save reads the case again; its refusal is said in the sheet. */\n private saves = {\n handle: this.saving(gql`mutation ($patch: ComplianceCaseHandling!) { handleComplianceCase(patch: $patch) { id } }`),\n entry: this.saving(gql`\n mutation ($caseId: String!, $writtenOn: String!, $body: String!, $attach: [Upload!]) {\n addComplianceCaseEntry(caseId: $caseId, writtenOn: $writtenOn, body: $body, attach: $attach) { id }\n }\n `)\n }\n\n private saving(mutation: any) {\n return new MutationController(this, mutation, { refetch: () => [this.record], showsError: true })\n }\n\n private get one(): any {\n return this.record.data?.complianceCase ?? null\n }\n\n private get investigators(): Person[] {\n return this.handling.value('investigators') ?? []\n }\n\n private get working() {\n return Object.values(this.saves).some(save => save.pending)\n }\n\n /** What went wrong last: the read, or a save. */\n private get message() {\n const failed = this.record.error ?? this.saves.handle.error ?? this.saves.entry.error\n return failed ? failureOf(failed) : ''\n }\n\n /* The users the words find (ADR-0190). */\n private choices = new QueryController(\n this,\n gql`\n query ($text: String!) {\n complianceCaseInvestigatorChoices(text: $text) { id name note }\n }\n `,\n { variables: () => (this.searched.trim() ? { text: this.searched } : undefined), keepPrevious: true }\n )\n\n private get found(): Person[] {\n return this.searched.trim() ? (this.choices.data?.complianceCaseInvestigatorChoices ?? []) : []\n }\n\n render() {\n const one = this.one\n if (!one) return html`<div class=\"body\"><span invalid>${this.message}</span></div>`\n const closed = !!one.closedOn\n const fact = (field: string, value: any) => (value ? html`<dt>${i18next.t(`field.compliance-case-${field}`)}</dt><dd>${value}</dd>` : nothing)\n return html`\n <div class=\"body\">\n <dl>\n ${fact('kind', wordOf('compliance-case-kind', one.kind))} ${fact('status', wordOf('compliance-case-status', one.status))} ${fact('received-on', one.receivedOn)}\n ${fact('investigation-due-on', one.investigationDueOn)} ${fact('reporter', one.reporter?.name)} ${fact('victim', one.victim?.name)}\n ${fact('accused', (one.accused ?? []).map((person: any) => person.name).join(', '))} ${fact('occurred-on', one.occurredOn)} ${fact('description', one.description)}\n ${fact('attachments', (one.attachments ?? []).length ? html`${one.attachments.map((file: any) => html`<a href=${file.fullpath} target=\"_blank\">${file.name}</a> `)}` : '')}\n </dl>\n\n <div class=\"field\">\n <span>${i18next.t('field.compliance-case-investigators')}</span>\n <div class=\"chips\">\n ${this.investigators.map(\n person =>\n html`<button type=\"button\" ?disabled=${closed} aria-label=${i18next.t('button.compliance-case-remove')} @click=${() => this.handling.set('investigators', this.investigators.filter(other => other.id !== person.id))}>\n ${person.name}<md-icon>close</md-icon>\n </button>`\n )}\n </div>\n ${closed\n ? nothing\n : html`<input placeholder=${i18next.t('text.compliance-case-find-person')} @input=${(e: any) => this.find(e.target.value)} />\n <div class=\"found\">\n ${this.found\n .filter(person => !this.investigators.some(other => other.id === person.id))\n .map(person => html`<button type=\"button\" @click=${() => (this.handling.set('investigators', [...this.investigators, person]), (this.searched = ''))}>${person.note ? `${person.name} · ${person.note}` : person.name}</button>`)}\n </div>`}\n </div>\n\n ${HANDLING.map(field =>\n DAYS.includes(field)\n ? html`<label class=\"field\">\n <span>${i18next.t(`field.compliance-case-${kebab(field)}`)}</span>\n <ox-input-date type=\"date\" ?disabled=${closed} .value=${this.handling.value(field) ?? ''} @change=${(e: any) => this.handling.set(field, e.target.value)}></ox-input-date>\n </label>`\n : html`<label class=\"field\">\n <span>${i18next.t(`field.compliance-case-${kebab(field)}`)}</span>\n <textarea ?disabled=${closed} .value=${this.handling.value(field) ?? ''} @input=${(e: any) => this.handling.set(field, e.target.value)}></textarea>\n </label>`\n )}\n\n <h4>${i18next.t('field.compliance-case-entries')}</h4>\n ${(one.entries ?? []).length\n ? html`<ul>\n ${one.entries.map(\n (entry: any) => html`<li>\n <span class=\"muted\">${entry.writtenOn} · ${entry.creator?.name ?? ''}</span><br />${entry.body}\n ${(entry.attachments ?? []).map((file: any) => html` <a href=${file.fullpath} target=\"_blank\">${file.name}</a>`)}\n </li>`\n )}\n </ul>`\n : html`<span class=\"muted\">${i18next.t('text.compliance-case-entries-empty')}</span>`}\n ${closed\n ? nothing\n : html`<label class=\"field\">\n <span>${i18next.t('field.compliance-case-entry-written-on')}</span>\n <ox-input-date type=\"date\" .value=${this.entry.value('writtenOn') ?? ''} @change=${(e: any) => this.entry.set('writtenOn', e.target.value)}></ox-input-date>\n </label>\n <label class=\"field\">\n <span>${i18next.t('field.compliance-case-entry-body')}</span>\n <textarea .value=${this.entry.value('body') ?? ''} @input=${(e: any) => this.entry.set('body', e.target.value)}></textarea>\n </label>\n <div class=\"field\">\n <ox-input-file multiple icon=\"attach_file\" @change=${(e: CustomEvent) => this.entry.set('files', [...((e.detail as File[]) ?? [])])}></ox-input-file>\n <md-text-button ?disabled=${this.working || !(this.entry.value('body') ?? '').trim()} @click=${() => this.addEntry()}>${i18next.t('button.compliance-case-add-entry')}</md-text-button>\n </div>`}\n ${(one.corrections ?? []).length\n ? html`<h4>${i18next.t('field.compliance-case-corrections')}</h4>\n <ul>\n ${one.corrections.map(\n (row: any) =>\n html`<li class=\"muted\">${new Date(row.createdAt).toLocaleString()} · ${row.creator?.name ?? ''} · ${i18next.t(`field.compliance-case-${kebab(row.field === 'investigatorIds' ? 'investigators' : row.field)}`)}: ${row.before ?? ''} → ${row.after ?? ''}</li>`\n )}\n </ul>`\n : nothing}\n <span invalid>${this.message}</span>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.close')}</md-text-button>\n ${closed ? nothing : html`<md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.save()}>${i18next.t('button.save')}</md-filled-button>`}\n </ox-popup-actions>\n `\n }\n\n private find(text: string) {\n this.searched = text\n }\n\n /** Only what was changed goes, as a correction of what was read. */\n private async save() {\n const one = this.one\n const changed = HANDLING.filter(field => (this.handling.value(field) ?? '') !== (one[field] ?? ''))\n const before = (one.investigators ?? []).map((person: any) => person.id).sort().join()\n const after = this.investigators.map(person => person.id).sort().join()\n const patch: any = { id: one.id, ...Object.fromEntries(changed.map(field => [field, this.handling.value(field) || null])) }\n if (before !== after) patch.investigatorIds = this.investigators.map(person => person.id)\n const saved = await this.handling.submit(() => this.saves.handle.run({ patch }))\n if (saved) notify({ message: i18next.t('text.compliance-case-saved') })\n }\n\n private async addEntry() {\n const writtenOn = this.entry.value('writtenOn')\n const body = this.entry.value('body')\n const files = this.entry.value('files') ?? []\n const added = await this.entry.submit(() =>\n this.saves.entry.run({ caseId: this.one.id, writtenOn, body, attach: files }, { context: files.length ? uploadContext(() => {}) : undefined })\n )\n if (added) notify({ message: i18next.t('text.compliance-case-saved') })\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@operato/input/ox-input-date.js';
1
2
  import '@material/web/button/filled-button.js';
2
3
  import '@material/web/button/text-button.js';
3
4
  import '@operato/input/ox-input-file.js';
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@operato/input/ox-input-date.js';
2
3
  import '@material/web/button/filled-button.js';
3
4
  import '@material/web/button/text-button.js';
4
5
  import '@operato/input/ox-input-file.js';
@@ -102,7 +103,7 @@ let InventionReportForm = class InventionReportForm extends localize(i18next)(Li
102
103
 
103
104
  <label class="field">
104
105
  <span>${i18next.t('field.invention-reported-on')}</span>
105
- <input type="date" .value=${this.reportedOn} @input=${(e) => (this.reportedOn = e.target.value)} />
106
+ <ox-input-date type="date" .value=${this.reportedOn} @change=${(e) => (this.reportedOn = e.target.value)}></ox-input-date>
106
107
  </label>
107
108
 
108
109
  <label class="field">
@@ -1 +1 @@
1
- {"version":3,"file":"invention-report-form.js","sourceRoot":"","sources":["../../client/components/invention-report-form.ts"],"names":[],"mappings":";AAAA,OAAO,uCAAuC,CAAA;AAC9C,OAAO,qCAAqC,CAAA;AAC5C,OAAO,iCAAiC,CAAA;AACxC,OAAO,6BAA6B,CAAA;AACpC,OAAO,oCAAoC,CAAA;AAC3C,OAAO,iCAAiC,CAAA;AAExC,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAIvC,+FAA+F;AAC/F,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,IAAI,IAAI,GAAQ,IAAI,CAAA;QACpB,MAAM,MAAM,GAAQ,SAAS,CAC3B,IAAI,CAAA,iCAAiC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,2BAA2B,EACzJ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,EAAE,CAC/E,CAAA;QACD,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,KAAK,GAAG,GAAG,EAAE;IACjB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC7F,CAAC,CAAA;AAED;;;GAGG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAA/D;;QA+BY,mBAAc,GAAG,EAAE,CAAA;QACnB,YAAO,GAAG,EAAE,CAAA;QACZ,eAAU,GAAG,KAAK,EAAE,CAAA;QACpB,kBAAa,GAAa,EAAE,CAAA;QAC5B,UAAK,GAAW,EAAE,CAAA;QAGnC,8DAA8D;QACtD,eAAU,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,GAAG,CAAA,0DAA0D,CAAC,CAAA;QAE7G,4DAA4D;QACpD,cAAS,GAAG,IAAI,kBAAkB,CACxC,IAAI,EACJ,GAAG,CAAA;;;;KAIF,EACD,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAA;IAoEH,CAAC;IArHC;2DACuD;aAChD,WAAM,GAAG;QACd,iBAAiB;QACjB,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;KAoBF;KACF,AA1BY,CA0BZ;IAuBD,IAAY,MAAM;QAChB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,mBAAmB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACjL,CAAC;IAED,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAA;IAC/B,CAAC;IAED,IAAY,OAAO;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACpE,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACvG,OAAO,IAAI,CAAA;;wBAES,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;;;kBAG9C,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;0BAC1B,IAAI,CAAC,cAAc,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;kBAIxF,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;6BACzB,IAAI,CAAC,OAAO,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;kBAI7E,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;sCACpB,IAAI,CAAC,UAAU,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;kBAI5F,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC;uCACpB,IAAI,CAAC,aAAa,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;iCACxH,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG;oEACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA,qBAAqB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,QAAQ,CAAC;;;;;kBAKnI,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;8CACN,IAAI,CAAC,QAAQ,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;0BACrG,IAAI,CAAC,OAAO;;;;;+CAKS,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;qDAC1E,IAAI,CAAC,OAAO,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;;KAElI,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CACnC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAC/J,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAC7G,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;QACzB,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAA;QACrC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1F,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IACvE,CAAC;;AAtFgB;IAAhB,KAAK,EAAE;;2DAA4B;AACnB;IAAhB,KAAK,EAAE;;oDAAqB;AACZ;IAAhB,KAAK,EAAE;;uDAA6B;AACpB;IAAhB,KAAK,EAAE;;0DAAqC;AAC5B;IAAhB,KAAK,EAAE;;kDAA2B;AAClB;IAAhB,KAAK,EAAE;;qDAA0B;AApCvB,mBAAmB;IAD/B,aAAa,CAAC,uBAAuB,CAAC;GAC1B,mBAAmB,CAsH/B","sourcesContent":["import '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-select.js'\nimport '@operato/popup/ox-popup-actions.js'\nimport '@operato/popup/ox-popup-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf } from '../words.js'\n\ntype Choice = { value: string; display: string }\n\n/** Opens the form; resolves with the reported invention, or null when the person closed it. */\nexport function openInventionReportForm(): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const handle: any = openPopup(\n html`<invention-report-form @close=${() => handle.close()} @reported=${(e: CustomEvent) => ((done = e.detail), handle.close())}></invention-report-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.invention-report') }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\n/**\n * 직무발명 신고 (ADR-0187 decision 24 · 발명진흥법 §12) - what the invention is, who invented it with the reporter, the\n * papers that show it. The company tells whether it succeeds to the right within four months of the report.\n */\n@customElement('invention-report-form')\nexport class InventionReportForm extends localize(i18next)(LitElement) {\n /* The house shape of a popup (page-standard sections 7, 8): only the body scrolls, fields are labels above native\n inputs, the one button row is `ox-popup-actions`. */\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n [guide] p {\n margin: 0;\n color: var(--ui-muted);\n line-height: var(--popup-line-height);\n }\n textarea {\n min-height: 8em;\n resize: vertical;\n }\n ox-select {\n width: 100%;\n }\n `\n ]\n\n @state() private inventionTitle = ''\n @state() private content = ''\n @state() private reportedOn = today()\n @state() private coInventorIds: string[] = []\n @state() private files: File[] = []\n @state() private progress?: number\n\n /* The colleagues who may be named co-inventors (ADR-0190). */\n private colleagues = new QueryController(this, gql`query { inventionColleagues { id name departmentName } }`)\n\n /* Its failure is drawn under the files, beside the form. */\n private reporting = new MutationController(\n this,\n gql`\n mutation ($invention: NewInvention!, $files: [Upload!]) {\n reportInvention(invention: $invention, files: $files) { id decisionDueOn }\n }\n `,\n { showsError: true }\n )\n\n private get people(): Choice[] {\n return (this.colleagues.data?.inventionColleagues ?? []).map((one: any) => ({ value: one.id, display: one.departmentName ? `${one.name} · ${one.departmentName}` : one.name }))\n }\n\n private get working() {\n return this.reporting.pending\n }\n\n private get message() {\n return this.reporting.error ? failureOf(this.reporting.error) : ''\n }\n\n render() {\n const named = this.people.filter(one => this.coInventorIds.includes(one.value)).map(one => one.display)\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.invention-report-guide')}</p></div>\n\n <label class=\"field\">\n <span>${i18next.t('field.invention-title')}</span>\n <input .value=${this.inventionTitle} @input=${(e: any) => (this.inventionTitle = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.invention-content')}</span>\n <textarea .value=${this.content} @input=${(e: any) => (this.content = e.target.value)}></textarea>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.invention-reported-on')}</span>\n <input type=\"date\" .value=${this.reportedOn} @input=${(e: any) => (this.reportedOn = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.invention-co-inventors')}</span>\n <ox-select multiple .value=${this.coInventorIds} @change=${(e: CustomEvent) => (this.coInventorIds = [].concat(e.detail ?? []).filter(Boolean))}>\n <span slot=\"label\">${named.length ? named.join(', ') : '—'}</span>\n <ox-popup-list align-left nowrap with-search multiple>${this.people.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.invention-files')}</span>\n <ox-input-file multiple .progress=${this.progress} @change=${(e: CustomEvent) => (this.files = [...(e.detail ?? [])])}></ox-input-file>\n <span invalid>${this.message}</span>\n </div>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.report()}>${i18next.t('button.invention-report')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n private async report() {\n const done = await this.reporting.run(\n { invention: { title: this.inventionTitle, content: this.content, reportedOn: this.reportedOn || null, coInventorIds: this.coInventorIds }, files: this.files },\n { context: this.files.length ? uploadContext((fraction: number) => (this.progress = fraction)) : undefined }\n )\n this.progress = undefined\n if (!done) return\n const reported = done.reportInvention\n notify({ message: i18next.t('text.invention-reported', { day: reported.decisionDueOn }) })\n this.dispatchEvent(new CustomEvent('reported', { detail: reported }))\n }\n}\n"]}
1
+ {"version":3,"file":"invention-report-form.js","sourceRoot":"","sources":["../../client/components/invention-report-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-date.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-select.js'\nimport '@operato/popup/ox-popup-actions.js'\nimport '@operato/popup/ox-popup-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf } from '../words.js'\n\ntype Choice = { value: string; display: string }\n\n/** Opens the form; resolves with the reported invention, or null when the person closed it. */\nexport function openInventionReportForm(): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const handle: any = openPopup(\n html`<invention-report-form @close=${() => handle.close()} @reported=${(e: CustomEvent) => ((done = e.detail), handle.close())}></invention-report-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.invention-report') }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\n/**\n * 직무발명 신고 (ADR-0187 decision 24 · 발명진흥법 §12) - what the invention is, who invented it with the reporter, the\n * papers that show it. The company tells whether it succeeds to the right within four months of the report.\n */\n@customElement('invention-report-form')\nexport class InventionReportForm extends localize(i18next)(LitElement) {\n /* The house shape of a popup (page-standard sections 7, 8): only the body scrolls, fields are labels above native\n inputs, the one button row is `ox-popup-actions`. */\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n [guide] p {\n margin: 0;\n color: var(--ui-muted);\n line-height: var(--popup-line-height);\n }\n textarea {\n min-height: 8em;\n resize: vertical;\n }\n ox-select {\n width: 100%;\n }\n `\n ]\n\n @state() private inventionTitle = ''\n @state() private content = ''\n @state() private reportedOn = today()\n @state() private coInventorIds: string[] = []\n @state() private files: File[] = []\n @state() private progress?: number\n\n /* The colleagues who may be named co-inventors (ADR-0190). */\n private colleagues = new QueryController(this, gql`query { inventionColleagues { id name departmentName } }`)\n\n /* Its failure is drawn under the files, beside the form. */\n private reporting = new MutationController(\n this,\n gql`\n mutation ($invention: NewInvention!, $files: [Upload!]) {\n reportInvention(invention: $invention, files: $files) { id decisionDueOn }\n }\n `,\n { showsError: true }\n )\n\n private get people(): Choice[] {\n return (this.colleagues.data?.inventionColleagues ?? []).map((one: any) => ({ value: one.id, display: one.departmentName ? `${one.name} · ${one.departmentName}` : one.name }))\n }\n\n private get working() {\n return this.reporting.pending\n }\n\n private get message() {\n return this.reporting.error ? failureOf(this.reporting.error) : ''\n }\n\n render() {\n const named = this.people.filter(one => this.coInventorIds.includes(one.value)).map(one => one.display)\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.invention-report-guide')}</p></div>\n\n <label class=\"field\">\n <span>${i18next.t('field.invention-title')}</span>\n <input .value=${this.inventionTitle} @input=${(e: any) => (this.inventionTitle = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.invention-content')}</span>\n <textarea .value=${this.content} @input=${(e: any) => (this.content = e.target.value)}></textarea>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.invention-reported-on')}</span>\n <ox-input-date type=\"date\" .value=${this.reportedOn} @change=${(e: any) => (this.reportedOn = e.target.value)}></ox-input-date>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.invention-co-inventors')}</span>\n <ox-select multiple .value=${this.coInventorIds} @change=${(e: CustomEvent) => (this.coInventorIds = [].concat(e.detail ?? []).filter(Boolean))}>\n <span slot=\"label\">${named.length ? named.join(', ') : '—'}</span>\n <ox-popup-list align-left nowrap with-search multiple>${this.people.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.invention-files')}</span>\n <ox-input-file multiple .progress=${this.progress} @change=${(e: CustomEvent) => (this.files = [...(e.detail ?? [])])}></ox-input-file>\n <span invalid>${this.message}</span>\n </div>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.report()}>${i18next.t('button.invention-report')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n private async report() {\n const done = await this.reporting.run(\n { invention: { title: this.inventionTitle, content: this.content, reportedOn: this.reportedOn || null, coInventorIds: this.coInventorIds }, files: this.files },\n { context: this.files.length ? uploadContext((fraction: number) => (this.progress = fraction)) : undefined }\n )\n this.progress = undefined\n if (!done) return\n const reported = done.reportInvention\n notify({ message: i18next.t('text.invention-reported', { day: reported.decisionDueOn }) })\n this.dispatchEvent(new CustomEvent('reported', { detail: reported }))\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@operato/input/ox-input-date.js';
1
2
  import '@material/web/button/filled-button.js';
2
3
  import '@material/web/button/text-button.js';
3
4
  import '@operato/input/ox-input-file.js';
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@operato/input/ox-input-date.js';
2
3
  import '@material/web/button/filled-button.js';
3
4
  import '@material/web/button/text-button.js';
4
5
  import '@operato/input/ox-input-file.js';
@@ -144,7 +145,7 @@ let SealUseForm = class SealUseForm extends localize(i18next)(LitElement) {
144
145
 
145
146
  <label class="field">
146
147
  <span>${i18next.t(`field.seal-use-used-on-${this.kind.toLowerCase().replace('_', '-')}`)}</span>
147
- <input type="date" .value=${this.usedOn} @input=${(e) => (this.usedOn = e.target.value)} />
148
+ <ox-input-date type="date" .value=${this.usedOn} @change=${(e) => (this.usedOn = e.target.value)}></ox-input-date>
148
149
  </label>
149
150
 
150
151
  ${certificate
@@ -167,7 +168,7 @@ let SealUseForm = class SealUseForm extends localize(i18next)(LitElement) {
167
168
  ${this.kind === 'TAKE_OUT'
168
169
  ? html `<label class="field">
169
170
  <span>${i18next.t('field.seal-use-return-due-on')}</span>
170
- <input type="date" .value=${this.returnDueOn} @input=${(e) => (this.returnDueOn = e.target.value)} />
171
+ <ox-input-date type="date" .value=${this.returnDueOn} @change=${(e) => (this.returnDueOn = e.target.value)}></ox-input-date>
171
172
  </label>`
172
173
  : nothing}
173
174
  ${certificate
@@ -177,7 +178,7 @@ let SealUseForm = class SealUseForm extends localize(i18next)(LitElement) {
177
178
  </label>
178
179
  <label class="field">
179
180
  <span>${i18next.t('field.seal-use-usable-until')}</span>
180
- <input type="date" .value=${this.usableUntil} @input=${(e) => (this.usableUntil = e.target.value)} />
181
+ <ox-input-date type="date" .value=${this.usableUntil} @change=${(e) => (this.usableUntil = e.target.value)}></ox-input-date>
181
182
  <span>${i18next.t('text.seal-use-usable-until-hint')}</span>
182
183
  </label>`
183
184
  : nothing}
@@ -1 +1 @@
1
- {"version":3,"file":"seal-use-form.js","sourceRoot":"","sources":["../../client/components/seal-use-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-select-buttons.js'\nimport '@operato/input/ox-select.js'\nimport '@operato/popup/ox-popup-actions.js'\nimport '@operato/popup/ox-popup-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf, USE_KINDS, wordOf } from '../words.js'\n\n/** What the form is opened with - a 사용인감계 just issued asks for the corporate seal's stamp on it. */\nexport interface SealUsePrefill {\n kind?: string\n sealKind?: string\n document?: string\n purpose?: string\n submittedTo?: string\n}\n\ntype Choice = { value: string; display: string; kind?: string }\n\n/** Opens the form; resolves with the written use, or null when the person closed it. */\nexport function openSealUseForm(prefill: SealUsePrefill = {}): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const handle: any = openPopup(\n html`<seal-use-form .prefill=${prefill} @close=${() => handle.close()} @recorded=${(e: CustomEvent) => ((done = e.detail), handle.close())}></seal-use-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.seal-use-record') }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\n/**\n * 날인 기록 쓰기 (ADR-0188 decision 2) - which seal, what was done with it, who asked, for which paper and where it goes.\n * The server decides whether it goes up for approval; the guide says when.\n */\n@customElement('seal-use-form')\nexport class SealUseForm extends localize(i18next)(LitElement) {\n /* The house shape of a popup (page-standard sections 7, 8): only the body scrolls, fields are labels above native\n inputs, the one button row is `ox-popup-actions`. */\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n [guide] p {\n margin: 0;\n color: var(--ui-muted);\n line-height: var(--popup-line-height);\n }\n ox-input-select-buttons {\n align-self: flex-start;\n }\n ox-select {\n width: 100%;\n }\n `\n ]\n\n @property({ type: Object }) prefill: SealUsePrefill = {}\n\n @state() private kind = 'STAMP'\n /* The seal chosen - undefined until one is, while the one the prefill names stands. */\n @state() private chosenSeal?: string\n @state() private requesterId = ''\n @state() private usedOn = today()\n @state() private document = ''\n @state() private purpose = ''\n @state() private submittedTo = ''\n @state() private returnDueOn = ''\n @state() private copies = '1'\n @state() private usableUntil = ''\n @state() private notes = ''\n /* The paper to be stamped - a copy the approver opens from the approval (2026-11-10). */\n @state() private files: File[] = []\n @state() private progress?: number\n /* The seals in use and the employees who may ask for one (ADR-0190). */\n private choices = new QueryController(\n this,\n gql`\n query {\n companySeals(filters: [{ name: \"disposedOn\", operator: \"is_null\" }], pagination: { page: 1, limit: 100 }) {\n items { id kind name }\n }\n employees(filters: [{ name: \"retiredOn\", operator: \"is_null\" }], pagination: { page: 1, limit: 500 }, sortings: [{ name: \"name\" }]) {\n items { id name controlNo }\n }\n }\n `\n )\n\n /* Its failure is drawn under the notes, beside the form. */\n private recording = new MutationController(\n this,\n gql`\n mutation ($use: NewSealUse!, $files: [Upload!]) {\n recordSealUse(use: $use, files: $files) { id status }\n }\n `,\n { showsError: true }\n )\n\n connectedCallback() {\n super.connectedCallback()\n const { kind, document, purpose, submittedTo } = this.prefill ?? {}\n Object.assign(this, { kind: kind ?? this.kind, document: document ?? '', purpose: purpose ?? '', submittedTo: submittedTo ?? '' })\n }\n\n private get seals(): Choice[] {\n /* The kind is said beside a name that does not say it already - 「사용인감 1호」, not 「법인인감 (법인인감)」. */\n const named = (one: any) => (one.name.includes(wordOf('company-seal-kind', one.kind)) ? one.name : `${one.name} (${wordOf('company-seal-kind', one.kind)})`)\n return (this.choices.data?.companySeals?.items ?? []).map((one: any) => ({ value: one.id, display: named(one), kind: one.kind }))\n }\n\n private get people(): Choice[] {\n return (this.choices.data?.employees?.items ?? []).map((one: any) => ({ value: one.id, display: one.controlNo ? `${one.name} · ${one.controlNo}` : one.name }))\n }\n\n private get sealId(): string {\n if (this.chosenSeal !== undefined) return this.chosenSeal\n const wanted = this.prefill?.sealKind\n return (wanted && this.seals.find(one => one.kind === wanted)?.value) || ''\n }\n\n private get working() {\n return this.recording.pending\n }\n\n private get message() {\n return this.recording.error ? failureOf(this.recording.error) : ''\n }\n\n render() {\n const certificate = this.kind === 'CERTIFICATE'\n const seals = certificate ? this.seals.filter(one => one.kind === 'CORPORATE') : this.seals\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.seal-use-approval-guide')}</p></div>\n\n <div class=\"field\">\n <ox-input-select-buttons\n .value=${this.kind}\n .options=${USE_KINDS.map(code => ({ display: wordOf('seal-use-kind', code), value: code }))}\n @change=${(e: CustomEvent) => e.detail && (this.kind = e.detail)}\n ></ox-input-select-buttons>\n </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-seal')}</span>\n ${this.chooser(seals, this.sealId, value => (this.chosenSeal = value))}\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-requester')}</span>\n ${this.chooser(this.people, this.requesterId, value => (this.requesterId = value))}\n </label>\n\n <label class=\"field\">\n <span>${i18next.t(`field.seal-use-used-on-${this.kind.toLowerCase().replace('_', '-')}`)}</span>\n <input type=\"date\" .value=${this.usedOn} @input=${(e: any) => (this.usedOn = e.target.value)} />\n </label>\n\n ${certificate\n ? nothing\n : html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-document')}</span>\n <input .value=${this.document} @input=${(e: any) => (this.document = e.target.value)} />\n </label>`}\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-purpose')}</span>\n <input .value=${this.purpose} @input=${(e: any) => (this.purpose = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-submitted-to')}</span>\n <input .value=${this.submittedTo} @input=${(e: any) => (this.submittedTo = e.target.value)} />\n </label>\n\n ${this.kind === 'TAKE_OUT'\n ? html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-return-due-on')}</span>\n <input type=\"date\" .value=${this.returnDueOn} @input=${(e: any) => (this.returnDueOn = e.target.value)} />\n </label>`\n : nothing}\n ${certificate\n ? html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-copies')}</span>\n <input type=\"number\" min=\"1\" .value=${this.copies} @input=${(e: any) => (this.copies = e.target.value)} />\n </label>\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-usable-until')}</span>\n <input type=\"date\" .value=${this.usableUntil} @input=${(e: any) => (this.usableUntil = e.target.value)} />\n <span>${i18next.t('text.seal-use-usable-until-hint')}</span>\n </label>`\n : nothing}\n\n <div class=\"field\">\n <span>${i18next.t('field.seal-use-papers')}</span>\n ${this.files.length ? html`<ul>${this.files.map(one => html`<li>${one.name}</li>`)}</ul>` : nothing}\n <ox-input-file quiet hide-filelist multiple icon=\"attach_file\" .dropTarget=${this} .progress=${this.progress} @change=${(e: CustomEvent) => this.pick(e)}></ox-input-file>\n <span>${i18next.t('text.seal-use-papers-hint')}</span>\n </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-notes')}</span>\n <input .value=${this.notes} @input=${(e: any) => (this.notes = e.target.value)} />\n <span invalid>${this.message}</span>\n </label>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.record()}>${i18next.t('button.seal-use-record')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n /** One value among many - the framework popup list with its search box on top. */\n private chooser(options: Choice[], value: string, change: (value: string) => void) {\n const shown = options.find(one => one.value === value)?.display ?? '—'\n return html`<ox-select .value=${value} @change=${(e: CustomEvent) => String(e.detail ?? '') !== value && change(String(e.detail ?? ''))}>\n <span slot=\"label\">${shown}</span>\n <ox-popup-list align-left nowrap with-search>${options.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>`\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.files = [...this.files, ...picked]\n }\n\n private async record() {\n const certificate = this.kind === 'CERTIFICATE'\n /* The paper goes with the use, its upload's progress drawn on the picker. */\n const upload = this.files.length ? { context: uploadContext((fraction: number) => (this.progress = fraction)) } : undefined\n const done = await this.recording.run({\n files: this.files,\n use: {\n kind: this.kind,\n sealId: this.sealId,\n requesterId: this.requesterId || null,\n usedOn: this.usedOn,\n document: certificate ? null : this.document,\n purpose: this.purpose,\n submittedTo: this.submittedTo,\n returnDueOn: this.kind === 'TAKE_OUT' ? this.returnDueOn || null : null,\n copies: certificate ? Number(this.copies) || null : null,\n usableUntil: certificate ? this.usableUntil || null : null,\n notes: this.notes\n }\n }, upload)\n if (!done) return\n const written = done.recordSealUse\n notify({ message: i18next.t(written.status === 'SUBMITTED' ? 'text.seal-use-submitted' : 'text.seal-use-recorded') })\n this.dispatchEvent(new CustomEvent('recorded', { detail: written }))\n }\n}\n"]}
1
+ {"version":3,"file":"seal-use-form.js","sourceRoot":"","sources":["../../client/components/seal-use-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-date.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-select-buttons.js'\nimport '@operato/input/ox-select.js'\nimport '@operato/popup/ox-popup-actions.js'\nimport '@operato/popup/ox-popup-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf, USE_KINDS, wordOf } from '../words.js'\n\n/** What the form is opened with - a 사용인감계 just issued asks for the corporate seal's stamp on it. */\nexport interface SealUsePrefill {\n kind?: string\n sealKind?: string\n document?: string\n purpose?: string\n submittedTo?: string\n}\n\ntype Choice = { value: string; display: string; kind?: string }\n\n/** Opens the form; resolves with the written use, or null when the person closed it. */\nexport function openSealUseForm(prefill: SealUsePrefill = {}): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const handle: any = openPopup(\n html`<seal-use-form .prefill=${prefill} @close=${() => handle.close()} @recorded=${(e: CustomEvent) => ((done = e.detail), handle.close())}></seal-use-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.seal-use-record') }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\n/**\n * 날인 기록 쓰기 (ADR-0188 decision 2) - which seal, what was done with it, who asked, for which paper and where it goes.\n * The server decides whether it goes up for approval; the guide says when.\n */\n@customElement('seal-use-form')\nexport class SealUseForm extends localize(i18next)(LitElement) {\n /* The house shape of a popup (page-standard sections 7, 8): only the body scrolls, fields are labels above native\n inputs, the one button row is `ox-popup-actions`. */\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n [guide] p {\n margin: 0;\n color: var(--ui-muted);\n line-height: var(--popup-line-height);\n }\n ox-input-select-buttons {\n align-self: flex-start;\n }\n ox-select {\n width: 100%;\n }\n `\n ]\n\n @property({ type: Object }) prefill: SealUsePrefill = {}\n\n @state() private kind = 'STAMP'\n /* The seal chosen - undefined until one is, while the one the prefill names stands. */\n @state() private chosenSeal?: string\n @state() private requesterId = ''\n @state() private usedOn = today()\n @state() private document = ''\n @state() private purpose = ''\n @state() private submittedTo = ''\n @state() private returnDueOn = ''\n @state() private copies = '1'\n @state() private usableUntil = ''\n @state() private notes = ''\n /* The paper to be stamped - a copy the approver opens from the approval (2026-11-10). */\n @state() private files: File[] = []\n @state() private progress?: number\n /* The seals in use and the employees who may ask for one (ADR-0190). */\n private choices = new QueryController(\n this,\n gql`\n query {\n companySeals(filters: [{ name: \"disposedOn\", operator: \"is_null\" }], pagination: { page: 1, limit: 100 }) {\n items { id kind name }\n }\n employees(filters: [{ name: \"retiredOn\", operator: \"is_null\" }], pagination: { page: 1, limit: 500 }, sortings: [{ name: \"name\" }]) {\n items { id name controlNo }\n }\n }\n `\n )\n\n /* Its failure is drawn under the notes, beside the form. */\n private recording = new MutationController(\n this,\n gql`\n mutation ($use: NewSealUse!, $files: [Upload!]) {\n recordSealUse(use: $use, files: $files) { id status }\n }\n `,\n { showsError: true }\n )\n\n connectedCallback() {\n super.connectedCallback()\n const { kind, document, purpose, submittedTo } = this.prefill ?? {}\n Object.assign(this, { kind: kind ?? this.kind, document: document ?? '', purpose: purpose ?? '', submittedTo: submittedTo ?? '' })\n }\n\n private get seals(): Choice[] {\n /* The kind is said beside a name that does not say it already - 「사용인감 1호」, not 「법인인감 (법인인감)」. */\n const named = (one: any) => (one.name.includes(wordOf('company-seal-kind', one.kind)) ? one.name : `${one.name} (${wordOf('company-seal-kind', one.kind)})`)\n return (this.choices.data?.companySeals?.items ?? []).map((one: any) => ({ value: one.id, display: named(one), kind: one.kind }))\n }\n\n private get people(): Choice[] {\n return (this.choices.data?.employees?.items ?? []).map((one: any) => ({ value: one.id, display: one.controlNo ? `${one.name} · ${one.controlNo}` : one.name }))\n }\n\n private get sealId(): string {\n if (this.chosenSeal !== undefined) return this.chosenSeal\n const wanted = this.prefill?.sealKind\n return (wanted && this.seals.find(one => one.kind === wanted)?.value) || ''\n }\n\n private get working() {\n return this.recording.pending\n }\n\n private get message() {\n return this.recording.error ? failureOf(this.recording.error) : ''\n }\n\n render() {\n const certificate = this.kind === 'CERTIFICATE'\n const seals = certificate ? this.seals.filter(one => one.kind === 'CORPORATE') : this.seals\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.seal-use-approval-guide')}</p></div>\n\n <div class=\"field\">\n <ox-input-select-buttons\n .value=${this.kind}\n .options=${USE_KINDS.map(code => ({ display: wordOf('seal-use-kind', code), value: code }))}\n @change=${(e: CustomEvent) => e.detail && (this.kind = e.detail)}\n ></ox-input-select-buttons>\n </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-seal')}</span>\n ${this.chooser(seals, this.sealId, value => (this.chosenSeal = value))}\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-requester')}</span>\n ${this.chooser(this.people, this.requesterId, value => (this.requesterId = value))}\n </label>\n\n <label class=\"field\">\n <span>${i18next.t(`field.seal-use-used-on-${this.kind.toLowerCase().replace('_', '-')}`)}</span>\n <ox-input-date type=\"date\" .value=${this.usedOn} @change=${(e: any) => (this.usedOn = e.target.value)}></ox-input-date>\n </label>\n\n ${certificate\n ? nothing\n : html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-document')}</span>\n <input .value=${this.document} @input=${(e: any) => (this.document = e.target.value)} />\n </label>`}\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-purpose')}</span>\n <input .value=${this.purpose} @input=${(e: any) => (this.purpose = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-submitted-to')}</span>\n <input .value=${this.submittedTo} @input=${(e: any) => (this.submittedTo = e.target.value)} />\n </label>\n\n ${this.kind === 'TAKE_OUT'\n ? html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-return-due-on')}</span>\n <ox-input-date type=\"date\" .value=${this.returnDueOn} @change=${(e: any) => (this.returnDueOn = e.target.value)}></ox-input-date>\n </label>`\n : nothing}\n ${certificate\n ? html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-copies')}</span>\n <input type=\"number\" min=\"1\" .value=${this.copies} @input=${(e: any) => (this.copies = e.target.value)} />\n </label>\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-usable-until')}</span>\n <ox-input-date type=\"date\" .value=${this.usableUntil} @change=${(e: any) => (this.usableUntil = e.target.value)}></ox-input-date>\n <span>${i18next.t('text.seal-use-usable-until-hint')}</span>\n </label>`\n : nothing}\n\n <div class=\"field\">\n <span>${i18next.t('field.seal-use-papers')}</span>\n ${this.files.length ? html`<ul>${this.files.map(one => html`<li>${one.name}</li>`)}</ul>` : nothing}\n <ox-input-file quiet hide-filelist multiple icon=\"attach_file\" .dropTarget=${this} .progress=${this.progress} @change=${(e: CustomEvent) => this.pick(e)}></ox-input-file>\n <span>${i18next.t('text.seal-use-papers-hint')}</span>\n </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-notes')}</span>\n <input .value=${this.notes} @input=${(e: any) => (this.notes = e.target.value)} />\n <span invalid>${this.message}</span>\n </label>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.record()}>${i18next.t('button.seal-use-record')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n /** One value among many - the framework popup list with its search box on top. */\n private chooser(options: Choice[], value: string, change: (value: string) => void) {\n const shown = options.find(one => one.value === value)?.display ?? '—'\n return html`<ox-select .value=${value} @change=${(e: CustomEvent) => String(e.detail ?? '') !== value && change(String(e.detail ?? ''))}>\n <span slot=\"label\">${shown}</span>\n <ox-popup-list align-left nowrap with-search>${options.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>`\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.files = [...this.files, ...picked]\n }\n\n private async record() {\n const certificate = this.kind === 'CERTIFICATE'\n /* The paper goes with the use, its upload's progress drawn on the picker. */\n const upload = this.files.length ? { context: uploadContext((fraction: number) => (this.progress = fraction)) } : undefined\n const done = await this.recording.run({\n files: this.files,\n use: {\n kind: this.kind,\n sealId: this.sealId,\n requesterId: this.requesterId || null,\n usedOn: this.usedOn,\n document: certificate ? null : this.document,\n purpose: this.purpose,\n submittedTo: this.submittedTo,\n returnDueOn: this.kind === 'TAKE_OUT' ? this.returnDueOn || null : null,\n copies: certificate ? Number(this.copies) || null : null,\n usableUntil: certificate ? this.usableUntil || null : null,\n notes: this.notes\n }\n }, upload)\n if (!done) return\n const written = done.recordSealUse\n notify({ message: i18next.t(written.status === 'SUBMITTED' ? 'text.seal-use-submitted' : 'text.seal-use-recorded') })\n this.dispatchEvent(new CustomEvent('recorded', { detail: written }))\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@operato/input/ox-input-date.js';
1
2
  import '@material/web/button/filled-button.js';
2
3
  import '@material/web/button/text-button.js';
3
4
  import '@material/web/icon/icon.js';
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@operato/input/ox-input-date.js';
2
3
  import '@material/web/button/filled-button.js';
3
4
  import '@material/web/button/text-button.js';
4
5
  import '@material/web/icon/icon.js';
@@ -114,7 +115,7 @@ let TrainingAttendanceForm = class TrainingAttendanceForm extends localize(i18ne
114
115
 
115
116
  <label class="field">
116
117
  <span>${i18next.t('field.training-completed-on')}</span>
117
- <input type="date" .value=${this.completedOn} min=${this.session.startsOn} @input=${(e) => (this.completedOn = e.target.value)} />
118
+ <ox-input-date type="date" .value=${this.completedOn} min=${this.session.startsOn} @change=${(e) => (this.completedOn = e.target.value)}></ox-input-date>
118
119
  </label>
119
120
 
120
121
  <div class="field">