@things-factory/compliance 10.1.268 → 10.1.270

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 (33) 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/activities/legal-todo-activity.d.ts +19 -2
  27. package/dist-server/activities/legal-todo-activity.js +4 -1
  28. package/dist-server/activities/legal-todo-activity.js.map +1 -1
  29. package/dist-server/service/common/legal-todo.d.ts +6 -2
  30. package/dist-server/service/common/legal-todo.js +8 -4
  31. package/dist-server/service/common/legal-todo.js.map +1 -1
  32. package/dist-server/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +19 -19
@@ -1 +1 @@
1
- {"version":3,"file":"training-attendance-form.js","sourceRoot":"","sources":["../../client/components/training-attendance-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-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, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { 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 for a session; resolves true when the attendance was recorded. */\nexport function openTrainingAttendanceForm(session: { id: string; name: string; startsOn: string; endsOn?: string | null }): Promise<boolean> {\n return new Promise(resolve => {\n let done = false\n const handle: any = openPopup(\n html`<training-attendance-form .session=${session} @close=${() => handle.close()} @recorded=${() => ((done = true), handle.close())}></training-attendance-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.training-attendance', { name: session.name }) }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\n/**\n * 출석 기록 (ADR-0187 decision 17) - the people who attended a session, recorded at once as completed. Someone done\n * already for the kind and year is left as they are.\n */\n@customElement('training-attendance-form')\nexport class TrainingAttendanceForm 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 ox-select {\n width: 100%;\n }\n .chosen {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n .chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 4px 2px 8px;\n border-radius: 999px;\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n .chip button {\n border: 0;\n background: none;\n cursor: pointer;\n color: inherit;\n display: inline-flex;\n padding: 0;\n }\n .chip md-icon {\n --md-icon-size: 16px;\n }\n `\n ]\n\n @property({ type: Object }) session!: { id: string; name: string; startsOn: string; endsOn?: string | null }\n\n @state() private chosen: string[] = []\n @state() private completedOn = ''\n\n /* The employees who may have attended (ADR-0190). */\n private employees = new QueryController(\n this,\n gql`\n query {\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 attendees, beside the form. */\n private recording = new MutationController(\n this,\n gql`\n mutation ($sessionId: String!, $employeeIds: [String!]!, $completedOn: String) {\n recordTrainingAttendance(sessionId: $sessionId, employeeIds: $employeeIds, completedOn: $completedOn) { id }\n }\n `,\n { showsError: true }\n )\n\n connectedCallback() {\n super.connectedCallback()\n this.completedOn = this.session.endsOn || this.session.startsOn\n }\n\n private get people(): Choice[] {\n return (this.employees.data?.employees?.items ?? []).map((one: any) => ({ value: one.id, display: one.controlNo ? `${one.name} · ${one.controlNo}` : one.name }))\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 left = this.people.filter(one => !this.chosen.includes(one.value))\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.training-attendance-guide')}</p></div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-completed-on')}</span>\n <input type=\"date\" .value=${this.completedOn} min=${this.session.startsOn} @input=${(e: any) => (this.completedOn = e.target.value)} />\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-attendees')} (${this.chosen.length})</span>\n <div class=\"chosen\">\n ${this.chosen.map(\n id => html`<span class=\"chip\"\n >${this.people.find(one => one.value === id)?.display ?? id}\n <button aria-label=${i18next.t('button.delete')} @click=${() => (this.chosen = this.chosen.filter(one => one !== id))}><md-icon>close</md-icon></button></span\n >`\n )}\n </div>\n <ox-select value=\"\" @change=${(e: CustomEvent) => e.detail && (this.chosen = [...this.chosen, String(e.detail)])}>\n <span slot=\"label\">${i18next.t('text.training-attendee-add')}</span>\n <ox-popup-list align-left nowrap with-search>${left.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>\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.record()}>${i18next.t('button.training-attendance-record')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n private async record() {\n const done = await this.recording.run({ sessionId: this.session.id, employeeIds: this.chosen, completedOn: this.completedOn || null })\n if (!done) return\n notify({ message: i18next.t('text.training-attendance-recorded', { count: done.recordTrainingAttendance.length }) })\n this.dispatchEvent(new CustomEvent('recorded'))\n }\n}\n"]}
1
+ {"version":3,"file":"training-attendance-form.js","sourceRoot":"","sources":["../../client/components/training-attendance-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-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, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { 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 for a session; resolves true when the attendance was recorded. */\nexport function openTrainingAttendanceForm(session: { id: string; name: string; startsOn: string; endsOn?: string | null }): Promise<boolean> {\n return new Promise(resolve => {\n let done = false\n const handle: any = openPopup(\n html`<training-attendance-form .session=${session} @close=${() => handle.close()} @recorded=${() => ((done = true), handle.close())}></training-attendance-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.training-attendance', { name: session.name }) }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\n/**\n * 출석 기록 (ADR-0187 decision 17) - the people who attended a session, recorded at once as completed. Someone done\n * already for the kind and year is left as they are.\n */\n@customElement('training-attendance-form')\nexport class TrainingAttendanceForm 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 ox-select {\n width: 100%;\n }\n .chosen {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-small, 4px);\n }\n .chip {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 4px 2px 8px;\n border-radius: 999px;\n background: var(--md-sys-color-secondary-container);\n color: var(--md-sys-color-on-secondary-container);\n }\n .chip button {\n border: 0;\n background: none;\n cursor: pointer;\n color: inherit;\n display: inline-flex;\n padding: 0;\n }\n .chip md-icon {\n --md-icon-size: 16px;\n }\n `\n ]\n\n @property({ type: Object }) session!: { id: string; name: string; startsOn: string; endsOn?: string | null }\n\n @state() private chosen: string[] = []\n @state() private completedOn = ''\n\n /* The employees who may have attended (ADR-0190). */\n private employees = new QueryController(\n this,\n gql`\n query {\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 attendees, beside the form. */\n private recording = new MutationController(\n this,\n gql`\n mutation ($sessionId: String!, $employeeIds: [String!]!, $completedOn: String) {\n recordTrainingAttendance(sessionId: $sessionId, employeeIds: $employeeIds, completedOn: $completedOn) { id }\n }\n `,\n { showsError: true }\n )\n\n connectedCallback() {\n super.connectedCallback()\n this.completedOn = this.session.endsOn || this.session.startsOn\n }\n\n private get people(): Choice[] {\n return (this.employees.data?.employees?.items ?? []).map((one: any) => ({ value: one.id, display: one.controlNo ? `${one.name} · ${one.controlNo}` : one.name }))\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 left = this.people.filter(one => !this.chosen.includes(one.value))\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.training-attendance-guide')}</p></div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-completed-on')}</span>\n <ox-input-date type=\"date\" .value=${this.completedOn} min=${this.session.startsOn} @change=${(e: any) => (this.completedOn = e.target.value)}></ox-input-date>\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-attendees')} (${this.chosen.length})</span>\n <div class=\"chosen\">\n ${this.chosen.map(\n id => html`<span class=\"chip\"\n >${this.people.find(one => one.value === id)?.display ?? id}\n <button aria-label=${i18next.t('button.delete')} @click=${() => (this.chosen = this.chosen.filter(one => one !== id))}><md-icon>close</md-icon></button></span\n >`\n )}\n </div>\n <ox-select value=\"\" @change=${(e: CustomEvent) => e.detail && (this.chosen = [...this.chosen, String(e.detail)])}>\n <span slot=\"label\">${i18next.t('text.training-attendee-add')}</span>\n <ox-popup-list align-left nowrap with-search>${left.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>\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.record()}>${i18next.t('button.training-attendance-record')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n private async record() {\n const done = await this.recording.run({ sessionId: this.session.id, employeeIds: this.chosen, completedOn: this.completedOn || null })\n if (!done) return\n notify({ message: i18next.t('text.training-attendance-recorded', { count: done.recordTrainingAttendance.length }) })\n this.dispatchEvent(new CustomEvent('recorded'))\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';
@@ -81,7 +82,7 @@ let TrainingCertificateForm = class TrainingCertificateForm extends localize(i18
81
82
 
82
83
  <label class="field">
83
84
  <span>${i18next.t('field.training-completed-on')}</span>
84
- <input type="date" min=${`${this.of.year}-01-01`} max=${today()} .value=${this.completedOn} @input=${(e) => (this.completedOn = e.target.value)} />
85
+ <ox-input-date type="date" min=${`${this.of.year}-01-01`} max=${today()} .value=${this.completedOn} @change=${(e) => (this.completedOn = e.target.value)}></ox-input-date>
85
86
  <span>${i18next.t('text.training-completed-on-hint', { year: this.of.year })}</span>
86
87
  </label>
87
88
 
@@ -1 +1 @@
1
- {"version":3,"file":"training-certificate-form.js","sourceRoot":"","sources":["../../client/components/training-certificate-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 } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { client, 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 { TRAINING_METHODS, trainingOptions, trainingWord } from '../training-words.js'\nimport { failureOf } from '../words.js'\n\n/** What the certificate is for - a kind of a year, with that year's sessions to pick from. */\nexport interface CertificateFor {\n kind: string\n year: number\n sessions: { id: string; name: string; startsOn: string }[]\n}\n\n/** Opens the form; resolves true when the certificate was sent. */\nexport function openTrainingCertificateForm(of: CertificateFor): Promise<boolean> {\n return new Promise(resolve => {\n let done = false\n const handle: any = openPopup(\n html`<training-certificate-form .of=${of} @close=${() => handle.close()} @sent=${() => ((done = true), handle.close())}></training-certificate-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.training-certificate', { kind: trainingWord('kind', of.kind) }) }\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 17) - a training one took online or elsewhere: the day, how, who gave it, and the\n * certificate. It counts once the manager confirms it.\n */\n@customElement('training-certificate-form')\nexport class TrainingCertificateForm 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 ox-input-select-buttons {\n align-self: flex-start;\n }\n ox-select {\n width: 100%;\n }\n ul {\n margin: 0;\n padding-left: var(--spacing-large, 12px);\n }\n `\n ]\n\n @property({ type: Object }) of!: CertificateFor\n\n @state() private completedOn = today()\n @state() private method = 'ONLINE'\n @state() private sessionId = ''\n @state() private organisation = ''\n @state() private files: File[] = []\n @state() private progress = 0\n @state() private working = false\n @state() private message = ''\n\n render() {\n const sessions = [{ value: '', display: i18next.t('text.training-no-session') }, ...this.of.sessions.map(one => ({ value: one.id, display: `${one.name} · ${one.startsOn}` }))]\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.training-certificate-guide')}</p></div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-completed-on')}</span>\n <input type=\"date\" min=${`${this.of.year}-01-01`} max=${today()} .value=${this.completedOn} @input=${(e: any) => (this.completedOn = e.target.value)} />\n <span>${i18next.t('text.training-completed-on-hint', { year: this.of.year })}</span>\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-method')}</span>\n <ox-input-select-buttons .value=${this.method} .options=${trainingOptions('method', TRAINING_METHODS)} @change=${(e: CustomEvent) => e.detail && (this.method = e.detail)}></ox-input-select-buttons>\n </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-session')}</span>\n <ox-select .value=${this.sessionId} @change=${(e: CustomEvent) => (this.sessionId = String(e.detail ?? ''))}>\n <span slot=\"label\">${sessions.find(one => one.value === this.sessionId)?.display ?? '—'}</span>\n <ox-popup-list align-left nowrap with-search>${sessions.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-organisation')}</span>\n <input .value=${this.organisation} @input=${(e: any) => (this.organisation = e.target.value)} />\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-certificate')}</span>\n ${this.files.length ? html`<ul>${this.files.map(one => html`<li>${one.name}</li>`)}</ul>` : ''}\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.training-certificate-hint')}</span>\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.send()}>${i18next.t('button.training-certificate-send')}</md-filled-button>\n </ox-popup-actions>\n `\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 send() {\n this.message = ''\n this.working = true\n try {\n const response = await client.mutate({\n mutation: gql`\n mutation ($certificate: TrainingCertificateInput!, $attach: [Upload!]) {\n submitTrainingCertificate(certificate: $certificate, attach: $attach) { id status }\n }\n `,\n variables: {\n certificate: { kind: this.of.kind, year: this.of.year, completedOn: this.completedOn, method: this.method, sessionId: this.sessionId || null, organisation: this.organisation },\n attach: this.files\n },\n ...(this.files.length ? { context: uploadContext((fraction: number) => (this.progress = fraction)) } : {})\n })\n if ((response as any).errors?.length) throw response\n notify({ message: i18next.t('text.training-certificate-sent') })\n this.dispatchEvent(new CustomEvent('sent'))\n } catch (error) {\n this.message = failureOf(error)\n } finally {\n this.working = false\n }\n }\n}\n"]}
1
+ {"version":3,"file":"training-certificate-form.js","sourceRoot":"","sources":["../../client/components/training-certificate-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 } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { client, 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 { TRAINING_METHODS, trainingOptions, trainingWord } from '../training-words.js'\nimport { failureOf } from '../words.js'\n\n/** What the certificate is for - a kind of a year, with that year's sessions to pick from. */\nexport interface CertificateFor {\n kind: string\n year: number\n sessions: { id: string; name: string; startsOn: string }[]\n}\n\n/** Opens the form; resolves true when the certificate was sent. */\nexport function openTrainingCertificateForm(of: CertificateFor): Promise<boolean> {\n return new Promise(resolve => {\n let done = false\n const handle: any = openPopup(\n html`<training-certificate-form .of=${of} @close=${() => handle.close()} @sent=${() => ((done = true), handle.close())}></training-certificate-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.training-certificate', { kind: trainingWord('kind', of.kind) }) }\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 17) - a training one took online or elsewhere: the day, how, who gave it, and the\n * certificate. It counts once the manager confirms it.\n */\n@customElement('training-certificate-form')\nexport class TrainingCertificateForm 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 ox-input-select-buttons {\n align-self: flex-start;\n }\n ox-select {\n width: 100%;\n }\n ul {\n margin: 0;\n padding-left: var(--spacing-large, 12px);\n }\n `\n ]\n\n @property({ type: Object }) of!: CertificateFor\n\n @state() private completedOn = today()\n @state() private method = 'ONLINE'\n @state() private sessionId = ''\n @state() private organisation = ''\n @state() private files: File[] = []\n @state() private progress = 0\n @state() private working = false\n @state() private message = ''\n\n render() {\n const sessions = [{ value: '', display: i18next.t('text.training-no-session') }, ...this.of.sessions.map(one => ({ value: one.id, display: `${one.name} · ${one.startsOn}` }))]\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.training-certificate-guide')}</p></div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-completed-on')}</span>\n <ox-input-date type=\"date\" min=${`${this.of.year}-01-01`} max=${today()} .value=${this.completedOn} @change=${(e: any) => (this.completedOn = e.target.value)}></ox-input-date>\n <span>${i18next.t('text.training-completed-on-hint', { year: this.of.year })}</span>\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-method')}</span>\n <ox-input-select-buttons .value=${this.method} .options=${trainingOptions('method', TRAINING_METHODS)} @change=${(e: CustomEvent) => e.detail && (this.method = e.detail)}></ox-input-select-buttons>\n </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-session')}</span>\n <ox-select .value=${this.sessionId} @change=${(e: CustomEvent) => (this.sessionId = String(e.detail ?? ''))}>\n <span slot=\"label\">${sessions.find(one => one.value === this.sessionId)?.display ?? '—'}</span>\n <ox-popup-list align-left nowrap with-search>${sessions.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-organisation')}</span>\n <input .value=${this.organisation} @input=${(e: any) => (this.organisation = e.target.value)} />\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-certificate')}</span>\n ${this.files.length ? html`<ul>${this.files.map(one => html`<li>${one.name}</li>`)}</ul>` : ''}\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.training-certificate-hint')}</span>\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.send()}>${i18next.t('button.training-certificate-send')}</md-filled-button>\n </ox-popup-actions>\n `\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 send() {\n this.message = ''\n this.working = true\n try {\n const response = await client.mutate({\n mutation: gql`\n mutation ($certificate: TrainingCertificateInput!, $attach: [Upload!]) {\n submitTrainingCertificate(certificate: $certificate, attach: $attach) { id status }\n }\n `,\n variables: {\n certificate: { kind: this.of.kind, year: this.of.year, completedOn: this.completedOn, method: this.method, sessionId: this.sessionId || null, organisation: this.organisation },\n attach: this.files\n },\n ...(this.files.length ? { context: uploadContext((fraction: number) => (this.progress = fraction)) } : {})\n })\n if ((response as any).errors?.length) throw response\n notify({ message: i18next.t('text.training-certificate-sent') })\n this.dispatchEvent(new CustomEvent('sent'))\n } catch (error) {\n this.message = failureOf(error)\n } finally {\n this.working = false\n }\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';
@@ -119,12 +120,12 @@ let TrainingSessionForm = class TrainingSessionForm extends localize(i18next)(Li
119
120
 
120
121
  <label class="field">
121
122
  <span>${i18next.t('field.training-starts-on')}</span>
122
- <input type="date" .value=${this.startsOn} @input=${(e) => (this.startsOn = e.target.value)} />
123
+ <ox-input-date type="date" .value=${this.startsOn} @change=${(e) => (this.startsOn = e.target.value)}></ox-input-date>
123
124
  </label>
124
125
 
125
126
  <label class="field">
126
127
  <span>${i18next.t('field.training-ends-on')}</span>
127
- <input type="date" .value=${this.endsOn} @input=${(e) => (this.endsOn = e.target.value)} />
128
+ <ox-input-date type="date" .value=${this.endsOn} @change=${(e) => (this.endsOn = e.target.value)}></ox-input-date>
128
129
  </label>
129
130
 
130
131
  <label class="field">
@@ -1 +1 @@
1
- {"version":3,"file":"training-session-form.js","sourceRoot":"","sources":["../../client/components/training-session-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'\nimport '@things-factory/announcement/dist-client/components/audience-picker.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { client, 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 { TRAINING_METHODS, trainingOptions } from '../training-words.js'\nimport { failureOf } from '../words.js'\n\ntype Audience = { scope: string; targetId: string; targetName?: string }\n\n/** Opens the form with the kinds on; resolves with the opened session, or null when the person closed it. */\nexport function openTrainingSessionForm(kinds: string[], year: number): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const handle: any = openPopup(\n html`<training-session-form .kinds=${kinds} .year=${year} @close=${() => handle.close()} @opened=${(e: CustomEvent) => ((done = e.detail), handle.close())}></training-session-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.training-session-open') }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\n/**\n * 회차 열기 (ADR-0187 decision 16) - one training given: its kind and year, how, when, by whom, its material and who it\n * is for. Opening it tells them.\n */\n@customElement('training-session-form')\nexport class TrainingSessionForm 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 ox-input-select-buttons {\n align-self: flex-start;\n }\n ox-select {\n width: 100%;\n }\n ul {\n margin: 0;\n padding-left: var(--spacing-large, 12px);\n }\n `\n ]\n\n @property({ type: Array }) kinds: string[] = []\n @property({ type: Number }) year = new Date().getFullYear()\n\n @state() private kind = ''\n @state() private name = ''\n @state() private method = 'COLLECTIVE'\n @state() private startsOn = ''\n @state() private endsOn = ''\n @state() private instructor = ''\n @state() private organisation = ''\n @state() private audiences: Audience[] = []\n @state() private notes = ''\n @state() private files: File[] = []\n @state() private progress = 0\n @state() private working = false\n @state() private message = ''\n @state() private courseId = ''\n\n /* The published courses an online session may be taken on (ADR-0194 decision 15) - read once ONLINE is picked. */\n private courses = new QueryController(this, gql`query { courses(pagination: { page: 1, limit: 500 }) { items { id name publishedVersion { id number } } } }`, {\n variables: () => (this.method === 'ONLINE' ? {} : undefined)\n })\n\n connectedCallback() {\n super.connectedCallback()\n this.kind = this.kinds[0] ?? ''\n }\n\n render() {\n const kinds = trainingOptions('kind', this.kinds)\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.training-session-guide')}</p></div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-kind')}</span>\n <ox-select .value=${this.kind} @change=${(e: CustomEvent) => (this.kind = String(e.detail ?? ''))}>\n <span slot=\"label\">${kinds.find(one => one.value === this.kind)?.display ?? '—'}</span>\n <ox-popup-list align-left nowrap with-search>${kinds.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-year')}</span>\n <input type=\"number\" min=\"2000\" max=\"2999\" .value=${String(this.year)} @input=${(e: any) => (this.year = Number(e.target.value))} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-session-name')}</span>\n <input .value=${this.name} @input=${(e: any) => (this.name = e.target.value)} />\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-method')}</span>\n <ox-input-select-buttons .value=${this.method} .options=${trainingOptions('method', TRAINING_METHODS)} @change=${(e: CustomEvent) => e.detail && (this.method = e.detail)}></ox-input-select-buttons>\n </div>\n\n ${this.method === 'ONLINE' ? this.renderCourse() : ''}\n\n <label class=\"field\">\n <span>${i18next.t('field.training-starts-on')}</span>\n <input type=\"date\" .value=${this.startsOn} @input=${(e: any) => (this.startsOn = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-ends-on')}</span>\n <input type=\"date\" .value=${this.endsOn} @input=${(e: any) => (this.endsOn = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-instructor')}</span>\n <input .value=${this.instructor} @input=${(e: any) => (this.instructor = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-organisation')}</span>\n <input .value=${this.organisation} @input=${(e: any) => (this.organisation = e.target.value)} />\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-audiences')}</span>\n <announcement-audience-picker .value=${this.audiences} @change=${(e: CustomEvent) => Array.isArray(e.detail) && (this.audiences = e.detail)}></announcement-audience-picker>\n <span>${i18next.t('text.training-session-audiences-hint')}</span>\n </div>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-material')}</span>\n ${this.files.length ? html`<ul>${this.files.map(one => html`<li>${one.name}</li>`)}</ul>` : ''}\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 </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-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.open()}>${i18next.t('button.training-session-open')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n private renderCourse() {\n const courses = ((this.courses.data as any)?.courses?.items ?? []).filter((one: any) => one.publishedVersion)\n return html`<label class=\"field\">\n <span>${i18next.t('field.training-course')}</span>\n <ox-select .value=${this.courseId} @change=${(e: CustomEvent) => (this.courseId = String(e.detail ?? ''))}>\n <span slot=\"label\">${courses.find((one: any) => one.id === this.courseId)?.name ?? '—'}</span>\n <ox-popup-list align-left nowrap with-search>${courses.map((one: any) => html`<div option value=${one.id}>${one.name}</div>`)}</ox-popup-list>\n </ox-select>\n <span>${courses.length ? i18next.t('text.training-online-course-hint') : i18next.t('text.training-online-no-course')}</span>\n </label>`\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 open() {\n this.message = ''\n this.working = true\n try {\n const response = await client.mutate({\n mutation: gql`\n mutation ($session: NewTrainingSession!, $attach: [Upload!]) {\n openTrainingSession(session: $session, attach: $attach) { id }\n }\n `,\n variables: {\n session: {\n kind: this.kind,\n year: this.year,\n name: this.name,\n method: this.method,\n startsOn: this.startsOn,\n endsOn: this.endsOn || null,\n instructor: this.instructor,\n organisation: this.organisation,\n audiences: this.audiences.map(({ scope, targetId, targetName }) => ({ scope, targetId, targetName })),\n courseId: this.method === 'ONLINE' ? this.courseId || null : null,\n notes: this.notes\n },\n attach: this.files\n },\n ...(this.files.length ? { context: uploadContext((fraction: number) => (this.progress = fraction)) } : {})\n })\n if ((response as any).errors?.length) throw response\n notify({ message: i18next.t('text.training-session-opened') })\n this.dispatchEvent(new CustomEvent('opened', { detail: response.data.openTrainingSession }))\n } catch (error) {\n this.message = failureOf(error)\n } finally {\n this.working = false\n }\n }\n}\n"]}
1
+ {"version":3,"file":"training-session-form.js","sourceRoot":"","sources":["../../client/components/training-session-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'\nimport '@things-factory/announcement/dist-client/components/audience-picker.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { client, 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 { TRAINING_METHODS, trainingOptions } from '../training-words.js'\nimport { failureOf } from '../words.js'\n\ntype Audience = { scope: string; targetId: string; targetName?: string }\n\n/** Opens the form with the kinds on; resolves with the opened session, or null when the person closed it. */\nexport function openTrainingSessionForm(kinds: string[], year: number): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const handle: any = openPopup(\n html`<training-session-form .kinds=${kinds} .year=${year} @close=${() => handle.close()} @opened=${(e: CustomEvent) => ((done = e.detail), handle.close())}></training-session-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.training-session-open') }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\n/**\n * 회차 열기 (ADR-0187 decision 16) - one training given: its kind and year, how, when, by whom, its material and who it\n * is for. Opening it tells them.\n */\n@customElement('training-session-form')\nexport class TrainingSessionForm 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 ox-input-select-buttons {\n align-self: flex-start;\n }\n ox-select {\n width: 100%;\n }\n ul {\n margin: 0;\n padding-left: var(--spacing-large, 12px);\n }\n `\n ]\n\n @property({ type: Array }) kinds: string[] = []\n @property({ type: Number }) year = new Date().getFullYear()\n\n @state() private kind = ''\n @state() private name = ''\n @state() private method = 'COLLECTIVE'\n @state() private startsOn = ''\n @state() private endsOn = ''\n @state() private instructor = ''\n @state() private organisation = ''\n @state() private audiences: Audience[] = []\n @state() private notes = ''\n @state() private files: File[] = []\n @state() private progress = 0\n @state() private working = false\n @state() private message = ''\n @state() private courseId = ''\n\n /* The published courses an online session may be taken on (ADR-0194 decision 15) - read once ONLINE is picked. */\n private courses = new QueryController(this, gql`query { courses(pagination: { page: 1, limit: 500 }) { items { id name publishedVersion { id number } } } }`, {\n variables: () => (this.method === 'ONLINE' ? {} : undefined)\n })\n\n connectedCallback() {\n super.connectedCallback()\n this.kind = this.kinds[0] ?? ''\n }\n\n render() {\n const kinds = trainingOptions('kind', this.kinds)\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.training-session-guide')}</p></div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-kind')}</span>\n <ox-select .value=${this.kind} @change=${(e: CustomEvent) => (this.kind = String(e.detail ?? ''))}>\n <span slot=\"label\">${kinds.find(one => one.value === this.kind)?.display ?? '—'}</span>\n <ox-popup-list align-left nowrap with-search>${kinds.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-year')}</span>\n <input type=\"number\" min=\"2000\" max=\"2999\" .value=${String(this.year)} @input=${(e: any) => (this.year = Number(e.target.value))} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-session-name')}</span>\n <input .value=${this.name} @input=${(e: any) => (this.name = e.target.value)} />\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-method')}</span>\n <ox-input-select-buttons .value=${this.method} .options=${trainingOptions('method', TRAINING_METHODS)} @change=${(e: CustomEvent) => e.detail && (this.method = e.detail)}></ox-input-select-buttons>\n </div>\n\n ${this.method === 'ONLINE' ? this.renderCourse() : ''}\n\n <label class=\"field\">\n <span>${i18next.t('field.training-starts-on')}</span>\n <ox-input-date type=\"date\" .value=${this.startsOn} @change=${(e: any) => (this.startsOn = e.target.value)}></ox-input-date>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-ends-on')}</span>\n <ox-input-date type=\"date\" .value=${this.endsOn} @change=${(e: any) => (this.endsOn = e.target.value)}></ox-input-date>\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-instructor')}</span>\n <input .value=${this.instructor} @input=${(e: any) => (this.instructor = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-organisation')}</span>\n <input .value=${this.organisation} @input=${(e: any) => (this.organisation = e.target.value)} />\n </label>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-audiences')}</span>\n <announcement-audience-picker .value=${this.audiences} @change=${(e: CustomEvent) => Array.isArray(e.detail) && (this.audiences = e.detail)}></announcement-audience-picker>\n <span>${i18next.t('text.training-session-audiences-hint')}</span>\n </div>\n\n <div class=\"field\">\n <span>${i18next.t('field.training-material')}</span>\n ${this.files.length ? html`<ul>${this.files.map(one => html`<li>${one.name}</li>`)}</ul>` : ''}\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 </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.training-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.open()}>${i18next.t('button.training-session-open')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n private renderCourse() {\n const courses = ((this.courses.data as any)?.courses?.items ?? []).filter((one: any) => one.publishedVersion)\n return html`<label class=\"field\">\n <span>${i18next.t('field.training-course')}</span>\n <ox-select .value=${this.courseId} @change=${(e: CustomEvent) => (this.courseId = String(e.detail ?? ''))}>\n <span slot=\"label\">${courses.find((one: any) => one.id === this.courseId)?.name ?? '—'}</span>\n <ox-popup-list align-left nowrap with-search>${courses.map((one: any) => html`<div option value=${one.id}>${one.name}</div>`)}</ox-popup-list>\n </ox-select>\n <span>${courses.length ? i18next.t('text.training-online-course-hint') : i18next.t('text.training-online-no-course')}</span>\n </label>`\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 open() {\n this.message = ''\n this.working = true\n try {\n const response = await client.mutate({\n mutation: gql`\n mutation ($session: NewTrainingSession!, $attach: [Upload!]) {\n openTrainingSession(session: $session, attach: $attach) { id }\n }\n `,\n variables: {\n session: {\n kind: this.kind,\n year: this.year,\n name: this.name,\n method: this.method,\n startsOn: this.startsOn,\n endsOn: this.endsOn || null,\n instructor: this.instructor,\n organisation: this.organisation,\n audiences: this.audiences.map(({ scope, targetId, targetName }) => ({ scope, targetId, targetName })),\n courseId: this.method === 'ONLINE' ? this.courseId || null : null,\n notes: this.notes\n },\n attach: this.files\n },\n ...(this.files.length ? { context: uploadContext((fraction: number) => (this.progress = fraction)) } : {})\n })\n if ((response as any).errors?.length) throw response\n notify({ message: i18next.t('text.training-session-opened') })\n this.dispatchEvent(new CustomEvent('opened', { detail: response.data.openTrainingSession }))\n } catch (error) {\n this.message = failureOf(error)\n } finally {\n this.working = false\n }\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import '@operato/input/ox-input-date.js';
1
2
  import '@operato/input/ox-input-file.js';
2
3
  import '@operato/input/ox-input-select-buttons.js';
3
4
  import '@operato/list-state/ox-page-state.js';
@@ -1,4 +1,5 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@operato/input/ox-input-date.js';
2
3
  import '@operato/input/ox-input-file.js';
3
4
  import '@operato/input/ox-input-select-buttons.js';
4
5
  import '@operato/list-state/ox-page-state.js';
@@ -186,7 +187,7 @@ let RegulationDetail = class RegulationDetail extends localize(i18next)(PageView
186
187
  <div class="form">
187
188
  <label class="field">
188
189
  <span>${i18next.t('field.regulation-effective-on')}</span>
189
- <input type="date" ?disabled=${locked} .value=${value('effectiveOn')} @input=${(e) => set('effectiveOn', e.target.value)} />
190
+ <ox-input-date type="date" ?disabled=${locked} .value=${value('effectiveOn')} @change=${(e) => set('effectiveOn', e.target.value)}></ox-input-date>
190
191
  <span>${i18next.t('text.regulation-effective-hint')}</span>
191
192
  </label>
192
193
  ${filing ? html `<div class="field">
@@ -257,7 +258,7 @@ let RegulationDetail = class RegulationDetail extends localize(i18next)(PageView
257
258
  <span>${i18next.t('field.regulation-procedure-kind')}</span>
258
259
  <span>${wordOf('regulation-procedure-kind', kind)}</span>
259
260
  </div>
260
- <label class="field"><span>${i18next.t('field.regulation-procedure-day')}</span><input type="date" ?disabled=${this.busy} .value=${this.procedure.value('day')} @input=${(e) => set('day', e.target.value)} /></label>
261
+ <label class="field"><span>${i18next.t('field.regulation-procedure-day')}</span><ox-input-date type="date" ?disabled=${this.busy} .value=${this.procedure.value('day')} @change=${(e) => set('day', e.target.value)}></ox-input-date></label>
261
262
  <label class="field"><span>${i18next.t('field.regulation-procedure-notes')}</span><input ?disabled=${this.busy} .value=${this.procedure.value('notes')} @input=${(e) => set('notes', e.target.value)} /></label>
262
263
  <div class="field">
263
264
  <span>${i18next.t('field.regulation-procedure-files')}</span>
@@ -1 +1 @@
1
- {"version":3,"file":"regulation-detail.js","sourceRoot":"","sources":["../../client/pages/regulation-detail.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-select-buttons.js'\nimport '@operato/list-state/ox-page-state.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } 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 } from '@operato/layout'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { navigate, PageView, DraftController } from '@operato/shell'\nimport { CommonButtonStyles, DocumentPageStyles, FormFieldStyles, ScrollbarStyles } from '@operato/styles'\n\nimport { VERSION_VIEW } from '../regulation/regulation-fragments.js'\nimport { failureOf, PROCEDURE_METHODS, wordOf } from '../words.js'\n\n/**\n * 규정 한 건 (ADR-0187 decisions 2-6) - its versions, and of the one chosen: its text, the day it takes effect, what\n * changed, whether it is against the workers, the procedure with its papers, its approval and whether the employees were\n * told. A version being written changes here; one in approval is taken back to change; an adopted one stays and gets its\n * filing.\n */\n@customElement('regulation-detail')\nexport class RegulationDetail extends localize(i18next)(PageView) {\n static styles = [\n DocumentPageStyles,\n FormFieldStyles,\n ScrollbarStyles,\n css`\n :host {\n display: block;\n overflow: auto;\n }\n .field {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small, 4px);\n }\n .field > span:not(:first-child) {\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font-size: var(--ui-t-small, 12px);\n }\n .form {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));\n gap: var(--spacing-large, 12px);\n }\n textarea.body {\n width: 100%;\n min-height: 320px;\n box-sizing: border-box;\n font-family: inherit;\n }\n table {\n border-collapse: collapse;\n width: 100%;\n }\n td,\n th {\n text-align: left;\n padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n border-bottom: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n }\n .note {\n color: var(--ui-warn, var(--md-sys-color-error));\n }\n .muted {\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n .procedure-form {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr));\n gap: var(--spacing-medium, 8px);\n align-items: end;\n }\n `\n ]\n\n @state() private ruleId = ''\n @state() private chosen = ''\n @state() private files: File[] = []\n @state() private originals: File[] = []\n /* The rule and its versions, read for the rule the address names (ADR-0190). */\n private rule = new QueryController(\n this,\n gql`\n query ($id: String) {\n companyRegulation(id: $id) {\n regulation { id code name kind topics }\n versions {\n ...RegulationVersionViewFields\n procedures { id kind day method workersCount consentCount notes files }\n originals\n }\n }\n }\n ${VERSION_VIEW}\n `,\n { variables: () => (this.ruleId ? { id: this.ruleId } : undefined) }\n )\n\n /* What is typed belongs to the version it was typed on: the text edits over the version read, and the procedure being\n recorded. Another version drops both, so none of it lands there. */\n private draft = new DraftController<any>(this, { read: () => this.current?.version, key: () => this.current?.version.id })\n private procedure = new DraftController<{ day: string; notes: string }>(this, { read: () => ({ day: '', notes: '' }), key: () => this.current?.version.id })\n\n /* Every change reads the rule again once it is done. */\n private saves = {\n draft: this.change(gql`mutation ($id: String!, $patch: RegulationVersionPatch!) { updateRegulationVersion(id: $id, patch: $patch) { id } }`),\n submit: this.change(gql`mutation ($id: String!) { submitRegulationVersion(id: $id) { id status } }`),\n inForce: this.change(gql`\n mutation ($id: String!, $files: [Upload!]!) {\n registerRegulationInForce(id: $id, files: $files) { id status }\n }\n `),\n withdraw: this.change(gql`mutation ($id: String!) { withdrawRegulationVersion(id: $id) { id } }`),\n newVersion: this.change(gql`mutation ($id: String!) { newRegulationVersion(regulationId: $id) { id } }`),\n deleteVersion: this.change(gql`mutation ($id: String!) { deleteRegulationVersion(id: $id) }`),\n procedure: this.change(gql`\n mutation ($procedure: NewRegulationProcedure!, $files: [Upload!]) {\n recordRegulationProcedure(procedure: $procedure, files: $files) { id }\n }\n `),\n deleteProcedure: this.change(gql`mutation ($id: String!) { deleteRegulationProcedure(id: $id) }`)\n }\n\n private change(mutation: any) {\n return new MutationController(this, mutation, { refetch: () => [this.rule] })\n }\n\n private get view(): any {\n return this.rule.data?.companyRegulation ?? null\n }\n\n /* A save, a submission or a procedure on its way: nothing is typed, switched or sent again until it is back, so what\n is sent is what the screen shows and no answer lands on input typed after it. */\n private get busy() {\n return Object.values(this.saves).some(save => save.pending)\n }\n\n get context() {\n const version = this.current?.version\n const actions: any[] = []\n if (version?.status === 'DRAFT') {\n actions.push({ title: i18next.t('button.regulation-version-delete'), action: () => this.deleteVersion(), ...CommonButtonStyles.delete })\n actions.push({ title: i18next.t('button.save'), action: () => this.saveVersion() })\n actions.push({ title: i18next.t('button.regulation-submit'), icon: 'approval', action: () => this.submit(), raised: true })\n }\n if (version?.status === 'IN_APPROVAL') actions.push({ title: i18next.t('button.regulation-withdraw'), icon: 'undo', action: () => this.withdraw() })\n if (this.view && !this.view.versions.some((one: any) => one.version.status !== 'ADOPTED')) actions.push({ title: i18next.t('button.regulation-new-version'), icon: 'add', action: () => this.newVersion() })\n return { title: this.view ? this.view.regulation.name : i18next.t('title.regulation-list'), frame: 'document', actions }\n }\n\n private get current() {\n const versions = this.view?.versions ?? []\n return versions.find((one: any) => one.version.id === this.chosen) ?? versions[0]\n }\n\n render() {\n if (this.rule.error) return html`<ox-page-state state=\"error\" .message=${failureOf(this.rule.error)}></ox-page-state>`\n if (!this.view) return html`<ox-page-state state=\"loading\"></ox-page-state>`\n const current = this.current\n const { regulation } = this.view\n return html`<div class=\"page\">\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${regulation.code} · ${wordOf('regulation-kind', regulation.kind)}</h3>\n <div class=\"page-section-actions\"><button @click=${() => navigate('regulation-list')}>${i18next.t('button.regulation-all')}</button></div>\n </header>\n <ox-input-select-buttons\n ?disabled=${this.busy}\n .value=${current.version.id}\n .options=${this.view.versions.map((one: any) => ({ value: one.version.id, display: `${i18next.t('text.regulation-version-of', { version: one.version.version })} · ${wordOf('regulation-period', one.period)}` }))}\n @change=${(e: CustomEvent) => e.detail && this.switchTo(e.detail)}\n ></ox-input-select-buttons>\n </section>\n ${current ? this.renderVersion(current) : nothing}\n </div>`\n }\n\n private renderVersion(view: any) {\n const { version } = view\n const writing = version.status === 'DRAFT'\n const locked = !writing || this.busy\n const value = (name: string) => this.draft.value(name) ?? ''\n const set = (name: string, given: any) => !this.busy && this.draft.set(name, given)\n const words: Record<string, string> = { ADDED: i18next.t('text.regulation-change-added'), CHANGED: i18next.t('text.regulation-change-changed'), REMOVED: i18next.t('text.regulation-change-removed') }\n const filing = this.view.regulation.kind === 'WORK_RULES' || this.view.regulation.kind === 'WORK_RULES_ANNEX'\n const kinds = !filing ? [] : version.status === 'ADOPTED' ? ['FILING'] : writing ? [value('unfavourable') === true ? 'CONSENT' : 'OPINION'] : []\n return html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('text.regulation-version-of', { version: version.version })} · ${wordOf('regulation-period', view.period)}</h3></header>\n ${version.adoptionNote ? html`<p class=\"page-section-note note\">${version.adoptionNote}</p>` : nothing}\n ${version.registeredInForce ? html`<p class=\"page-section-note\">${i18next.t('text.regulation-registered-note', { count: view.originals ?? 0 })}</p>` : nothing}\n ${version.status === 'ADOPTED' && !view.told && !version.registeredInForce ? html`<p class=\"page-section-note note\">${i18next.t('text.regulation-not-told-note')}</p>` : nothing}\n <div class=\"form\">\n <label class=\"field\">\n <span>${i18next.t('field.regulation-effective-on')}</span>\n <input type=\"date\" ?disabled=${locked} .value=${value('effectiveOn')} @input=${(e: any) => set('effectiveOn', e.target.value)} />\n <span>${i18next.t('text.regulation-effective-hint')}</span>\n </label>\n ${filing ? html`<div class=\"field\">\n <span>${i18next.t('field.regulation-unfavourable')}</span>\n <ox-input-select-buttons\n ?disabled=${locked}\n .value=${value('unfavourable') === '' ? '' : String(value('unfavourable'))}\n .options=${[{ value: 'true', display: i18next.t('text.regulation-unfavourable-yes') }, { value: 'false', display: i18next.t('text.regulation-unfavourable-no') }]}\n @change=${(e: CustomEvent) => writing && e.detail && set('unfavourable', e.detail === 'true')}\n ></ox-input-select-buttons>\n <span>${i18next.t('text.regulation-unfavourable-hint')}</span>\n </div>` : nothing}\n <label class=\"field\">\n <span>${i18next.t('field.regulation-change-summary')}</span>\n <input ?disabled=${locked} .value=${value('changeSummary')} @input=${(e: any) => set('changeSummary', e.target.value)} />\n </label>\n </div>\n </section>\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('field.regulation-body')}</h3></header>\n <p class=\"page-section-note muted\">${i18next.t('text.regulation-body-hint')}</p>\n <textarea class=\"body\" ?disabled=${locked} .value=${value('body')} @input=${(e: any) => set('body', e.target.value)}></textarea>\n </section>\n ${view.changes.length\n ? html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('text.regulation-changes')}</h3></header>\n <table>\n ${view.changes.map((one: any) => html`<tr><td>${one.heading}</td><td>${words[one.change]}</td></tr>`)}\n </table>\n </section>`\n : nothing}\n ${filing || view.procedures?.length ? html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('text.regulation-procedures')}</h3></header>\n <p class=\"page-section-note muted\">${i18next.t(filing ? 'text.regulation-procedures-hint' : 'text.regulation-procedures-none-asked')}</p>\n <table>\n ${(view.procedures ?? []).map(\n (one: any) =>\n html`<tr>\n <td>${wordOf('regulation-procedure-kind', one.kind)}</td>\n <td>${one.day}</td>\n <td>${one.method && Object.values(PROCEDURE_METHODS).some(methods => methods.includes(one.method)) ? wordOf('regulation-procedure-method', one.method) : ''}</td>\n <td>${one.kind === 'CONSENT' && one.workersCount != null && one.consentCount != null ? i18next.t('text.regulation-consent-count', { consented: one.consentCount, workers: one.workersCount }) : ''}</td>\n <td>${i18next.t('text.regulation-files', { count: one.files })}</td>\n <td>${writing ? html`<button class=\"danger\" ?disabled=${this.busy} @click=${() => this.deleteProcedure(one.id)}>${i18next.t('button.delete')}</button>` : nothing}</td>\n </tr>`\n )}\n </table>\n ${kinds.length ? this.renderProcedureForm(kinds) : nothing}\n </section>` : nothing}\n ${writing && !this.view.versions.some((one: any) => one.version.status !== 'DRAFT') ? this.renderInForce() : nothing}`\n }\n\n /* A rule in force before the system - its first version registered from its own day with its original (ADR-0187 amendment 2). */\n private renderInForce() {\n return html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('text.regulation-in-force-title')}</h3></header>\n <p class=\"page-section-note muted\">${i18next.t('text.regulation-in-force-hint')}</p>\n <div class=\"procedure-form\">\n <div class=\"field\">\n <span>${i18next.t('field.regulation-original')}</span>\n <ox-input-file multiple ?disabled=${this.busy} .value=${this.originals} @change=${(e: CustomEvent) => !this.busy && (this.originals = e.detail ?? [])}></ox-input-file>\n </div>\n <button ?disabled=${this.busy} @click=${() => this.registerInForce()}>${i18next.t('button.regulation-register-in-force')}</button>\n </div>\n </section>`\n }\n\n private renderProcedureForm(kinds: string[]) {\n const kind = kinds[0]\n const set = (name: 'day' | 'notes', given: string) => !this.busy && this.procedure.set(name, given)\n return html`<div class=\"procedure-form\">\n <div class=\"field\">\n <span>${i18next.t('field.regulation-procedure-kind')}</span>\n <span>${wordOf('regulation-procedure-kind', kind)}</span>\n </div>\n <label class=\"field\"><span>${i18next.t('field.regulation-procedure-day')}</span><input type=\"date\" ?disabled=${this.busy} .value=${this.procedure.value('day')} @input=${(e: any) => set('day', e.target.value)} /></label>\n <label class=\"field\"><span>${i18next.t('field.regulation-procedure-notes')}</span><input ?disabled=${this.busy} .value=${this.procedure.value('notes')} @input=${(e: any) => set('notes', e.target.value)} /></label>\n <div class=\"field\">\n <span>${i18next.t('field.regulation-procedure-files')}</span>\n <ox-input-file multiple ?disabled=${this.busy} .value=${this.files} @change=${(e: CustomEvent) => !this.busy && (this.files = e.detail ?? [])}></ox-input-file>\n </div>\n <button ?disabled=${this.busy} @click=${() => this.recordProcedure(kind)}>${i18next.t('button.regulation-procedure-record')}</button>\n </div>`\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active) return\n const params = new URLSearchParams(location.search)\n const id = params.get('id') ?? lifecycle?.params?.id\n const version = params.get('version')\n /* Another rule, or another version asked by the address: the shell asked about what was typed (addressDirty) and\n dropped it before the address changed; this page only moves to it. */\n const another = !!this.view && !!id && id !== this.view.regulation.id\n if (another || (version && version !== this.chosen)) this.choose(version ?? '')\n if (id) this.ruleId = id\n }\n\n /* The files picked belong to the version they were picked on, as the drafts do: switching drops them. */\n private choose(id: string) {\n this.chosen = id\n this.files = []\n this.originals = []\n this.updateContext()\n }\n\n /*\n * PageView reads the drafts; the files picked are the page's own unsaved state too. The shell asks about them before\n * any move - 「규정 목록」, the menu, another rule's address, closing the tab - and drops them once the move is agreed.\n */\n get addressDirty() {\n return super.addressDirty || this.files.length > 0 || this.originals.length > 0\n }\n\n get addressDiscardText() {\n return i18next.t('text.regulation-leave-unsaved')\n }\n\n discardAddressEdits(change?: any) {\n super.discardAddressEdits(change)\n this.choose(this.chosen)\n }\n\n /* A version switch stays on the page, so the page asks the shell's question itself. */\n private async mayLeave() {\n return await this.canDeactivate()\n }\n\n private async switchTo(id: string) {\n if (this.busy || id === this.current?.version.id) {\n const buttons = this.renderRoot.querySelector('ox-input-select-buttons') as any\n if (buttons) buttons.value = this.current?.version.id\n return\n }\n if (await this.mayLeave()) return this.choose(id)\n /* Staying: the buttons already show the version clicked - put them back on the one still open. */\n const buttons = this.renderRoot.querySelector('ox-input-select-buttons') as any\n if (buttons) buttons.value = this.current?.version.id\n }\n\n private async call(save: MutationController, variables: any, done = 'text.regulation-saved', context?: any) {\n if (this.busy) return undefined\n const data = await save.run(variables, { context })\n if (data) notify({ message: i18next.t(done) })\n return data\n }\n\n private patchOf(sent: any) {\n const patch: any = { ...sent }\n if (patch.effectiveOn === '') patch.effectiveOn = null\n return patch\n }\n\n /* Saves the text edits of the version chosen - the one door that clears them. */\n private async saveDraft(done = 'text.regulation-saved') {\n const on = this.current.version.id\n return await this.draft.submit(sent => this.call(this.saves.draft, { id: on, patch: this.patchOf(sent) }, done))\n }\n\n private async saveVersion() {\n if (!this.draft.dirty) return\n await this.saveDraft()\n }\n\n private async submit() {\n const id = this.current.version.id\n if (this.draft.dirty && !(await this.saveDraft())) return\n /* Only what the screen shows is put up: anything not saved yet stops the submission. */\n if (this.draft.dirty || this.current?.version.id !== id) return\n const confirmed = await OxPrompt.open({\n title: i18next.t('button.regulation-submit'),\n text: i18next.t('text.regulation-submit-confirm'),\n confirmButton: { text: i18next.t('button.regulation-submit') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (confirmed) await this.call(this.saves.submit, { id }, 'text.regulation-submitted')\n }\n\n private async registerInForce() {\n const id = this.current.version.id\n if (this.draft.dirty && !(await this.saveDraft())) return\n if (this.draft.dirty || this.current?.version.id !== id) return\n const originals = this.originals\n const confirmed = await OxPrompt.open({\n title: i18next.t('button.regulation-register-in-force'),\n text: i18next.t('text.regulation-in-force-confirm', { version: this.current.version.version, day: this.current.version.effectiveOn ?? '' }),\n confirmButton: { text: i18next.t('button.regulation-register-in-force') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (!confirmed) return\n const done = await this.call(\n this.saves.inForce,\n { id, files: originals },\n 'text.regulation-registered-in-force',\n originals.length ? uploadContext(() => {}) : undefined\n )\n if (done && this.originals === originals) this.originals = []\n }\n\n private async withdraw() {\n await this.call(this.saves.withdraw, { id: this.current.version.id })\n }\n\n private async newVersion() {\n const data = await this.call(this.saves.newVersion, { id: this.view.regulation.id })\n if (data) this.choose(data.newRegulationVersion.id)\n }\n\n /** The revision asked about is the one deleted: if the screen shows another once confirmed, nothing is deleted. */\n private async deleteVersion() {\n const id = this.current?.version.id\n if (!id) return\n const confirmed = await OxPrompt.open({\n title: i18next.t('button.regulation-version-delete'),\n text: i18next.t('text.regulation-version-delete-confirm'),\n confirmButton: { text: i18next.t('button.delete'), destructive: true },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (!confirmed || this.current?.version.id !== id) return\n if (await this.call(this.saves.deleteVersion, { id })) this.choose('')\n }\n\n private async recordProcedure(kind: string) {\n const files = this.files\n const done = await this.procedure.submit(sent =>\n this.call(\n this.saves.procedure,\n {\n procedure: { versionId: this.current.version.id, kind, day: sent.day ?? '', notes: sent.notes || null },\n files\n },\n 'text.regulation-saved',\n files.length ? uploadContext(() => {}) : undefined\n )\n )\n /* Only what was sent is done - a file picked since stays. */\n if (done && this.files === files) this.files = []\n }\n\n private async deleteProcedure(id: string) {\n await this.call(this.saves.deleteProcedure, { id })\n }\n}\n"]}
1
+ {"version":3,"file":"regulation-detail.js","sourceRoot":"","sources":["../../client/pages/regulation-detail.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-date.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-select-buttons.js'\nimport '@operato/list-state/ox-page-state.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } 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 } from '@operato/layout'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { navigate, PageView, DraftController } from '@operato/shell'\nimport { CommonButtonStyles, DocumentPageStyles, FormFieldStyles, ScrollbarStyles } from '@operato/styles'\n\nimport { VERSION_VIEW } from '../regulation/regulation-fragments.js'\nimport { failureOf, PROCEDURE_METHODS, wordOf } from '../words.js'\n\n/**\n * 규정 한 건 (ADR-0187 decisions 2-6) - its versions, and of the one chosen: its text, the day it takes effect, what\n * changed, whether it is against the workers, the procedure with its papers, its approval and whether the employees were\n * told. A version being written changes here; one in approval is taken back to change; an adopted one stays and gets its\n * filing.\n */\n@customElement('regulation-detail')\nexport class RegulationDetail extends localize(i18next)(PageView) {\n static styles = [\n DocumentPageStyles,\n FormFieldStyles,\n ScrollbarStyles,\n css`\n :host {\n display: block;\n overflow: auto;\n }\n .field {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small, 4px);\n }\n .field > span:not(:first-child) {\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n font-size: var(--ui-t-small, 12px);\n }\n .form {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));\n gap: var(--spacing-large, 12px);\n }\n textarea.body {\n width: 100%;\n min-height: 320px;\n box-sizing: border-box;\n font-family: inherit;\n }\n table {\n border-collapse: collapse;\n width: 100%;\n }\n td,\n th {\n text-align: left;\n padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n border-bottom: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n }\n .note {\n color: var(--ui-warn, var(--md-sys-color-error));\n }\n .muted {\n color: var(--ui-muted, var(--md-sys-color-on-surface-variant));\n }\n .procedure-form {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr));\n gap: var(--spacing-medium, 8px);\n align-items: end;\n }\n `\n ]\n\n @state() private ruleId = ''\n @state() private chosen = ''\n @state() private files: File[] = []\n @state() private originals: File[] = []\n /* The rule and its versions, read for the rule the address names (ADR-0190). */\n private rule = new QueryController(\n this,\n gql`\n query ($id: String) {\n companyRegulation(id: $id) {\n regulation { id code name kind topics }\n versions {\n ...RegulationVersionViewFields\n procedures { id kind day method workersCount consentCount notes files }\n originals\n }\n }\n }\n ${VERSION_VIEW}\n `,\n { variables: () => (this.ruleId ? { id: this.ruleId } : undefined) }\n )\n\n /* What is typed belongs to the version it was typed on: the text edits over the version read, and the procedure being\n recorded. Another version drops both, so none of it lands there. */\n private draft = new DraftController<any>(this, { read: () => this.current?.version, key: () => this.current?.version.id })\n private procedure = new DraftController<{ day: string; notes: string }>(this, { read: () => ({ day: '', notes: '' }), key: () => this.current?.version.id })\n\n /* Every change reads the rule again once it is done. */\n private saves = {\n draft: this.change(gql`mutation ($id: String!, $patch: RegulationVersionPatch!) { updateRegulationVersion(id: $id, patch: $patch) { id } }`),\n submit: this.change(gql`mutation ($id: String!) { submitRegulationVersion(id: $id) { id status } }`),\n inForce: this.change(gql`\n mutation ($id: String!, $files: [Upload!]!) {\n registerRegulationInForce(id: $id, files: $files) { id status }\n }\n `),\n withdraw: this.change(gql`mutation ($id: String!) { withdrawRegulationVersion(id: $id) { id } }`),\n newVersion: this.change(gql`mutation ($id: String!) { newRegulationVersion(regulationId: $id) { id } }`),\n deleteVersion: this.change(gql`mutation ($id: String!) { deleteRegulationVersion(id: $id) }`),\n procedure: this.change(gql`\n mutation ($procedure: NewRegulationProcedure!, $files: [Upload!]) {\n recordRegulationProcedure(procedure: $procedure, files: $files) { id }\n }\n `),\n deleteProcedure: this.change(gql`mutation ($id: String!) { deleteRegulationProcedure(id: $id) }`)\n }\n\n private change(mutation: any) {\n return new MutationController(this, mutation, { refetch: () => [this.rule] })\n }\n\n private get view(): any {\n return this.rule.data?.companyRegulation ?? null\n }\n\n /* A save, a submission or a procedure on its way: nothing is typed, switched or sent again until it is back, so what\n is sent is what the screen shows and no answer lands on input typed after it. */\n private get busy() {\n return Object.values(this.saves).some(save => save.pending)\n }\n\n get context() {\n const version = this.current?.version\n const actions: any[] = []\n if (version?.status === 'DRAFT') {\n actions.push({ title: i18next.t('button.regulation-version-delete'), action: () => this.deleteVersion(), ...CommonButtonStyles.delete })\n actions.push({ title: i18next.t('button.save'), action: () => this.saveVersion() })\n actions.push({ title: i18next.t('button.regulation-submit'), icon: 'approval', action: () => this.submit(), raised: true })\n }\n if (version?.status === 'IN_APPROVAL') actions.push({ title: i18next.t('button.regulation-withdraw'), icon: 'undo', action: () => this.withdraw() })\n if (this.view && !this.view.versions.some((one: any) => one.version.status !== 'ADOPTED')) actions.push({ title: i18next.t('button.regulation-new-version'), icon: 'add', action: () => this.newVersion() })\n return { title: this.view ? this.view.regulation.name : i18next.t('title.regulation-list'), frame: 'document', actions }\n }\n\n private get current() {\n const versions = this.view?.versions ?? []\n return versions.find((one: any) => one.version.id === this.chosen) ?? versions[0]\n }\n\n render() {\n if (this.rule.error) return html`<ox-page-state state=\"error\" .message=${failureOf(this.rule.error)}></ox-page-state>`\n if (!this.view) return html`<ox-page-state state=\"loading\"></ox-page-state>`\n const current = this.current\n const { regulation } = this.view\n return html`<div class=\"page\">\n <section class=\"page-section\">\n <header class=\"page-section-header\">\n <h3>${regulation.code} · ${wordOf('regulation-kind', regulation.kind)}</h3>\n <div class=\"page-section-actions\"><button @click=${() => navigate('regulation-list')}>${i18next.t('button.regulation-all')}</button></div>\n </header>\n <ox-input-select-buttons\n ?disabled=${this.busy}\n .value=${current.version.id}\n .options=${this.view.versions.map((one: any) => ({ value: one.version.id, display: `${i18next.t('text.regulation-version-of', { version: one.version.version })} · ${wordOf('regulation-period', one.period)}` }))}\n @change=${(e: CustomEvent) => e.detail && this.switchTo(e.detail)}\n ></ox-input-select-buttons>\n </section>\n ${current ? this.renderVersion(current) : nothing}\n </div>`\n }\n\n private renderVersion(view: any) {\n const { version } = view\n const writing = version.status === 'DRAFT'\n const locked = !writing || this.busy\n const value = (name: string) => this.draft.value(name) ?? ''\n const set = (name: string, given: any) => !this.busy && this.draft.set(name, given)\n const words: Record<string, string> = { ADDED: i18next.t('text.regulation-change-added'), CHANGED: i18next.t('text.regulation-change-changed'), REMOVED: i18next.t('text.regulation-change-removed') }\n const filing = this.view.regulation.kind === 'WORK_RULES' || this.view.regulation.kind === 'WORK_RULES_ANNEX'\n const kinds = !filing ? [] : version.status === 'ADOPTED' ? ['FILING'] : writing ? [value('unfavourable') === true ? 'CONSENT' : 'OPINION'] : []\n return html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('text.regulation-version-of', { version: version.version })} · ${wordOf('regulation-period', view.period)}</h3></header>\n ${version.adoptionNote ? html`<p class=\"page-section-note note\">${version.adoptionNote}</p>` : nothing}\n ${version.registeredInForce ? html`<p class=\"page-section-note\">${i18next.t('text.regulation-registered-note', { count: view.originals ?? 0 })}</p>` : nothing}\n ${version.status === 'ADOPTED' && !view.told && !version.registeredInForce ? html`<p class=\"page-section-note note\">${i18next.t('text.regulation-not-told-note')}</p>` : nothing}\n <div class=\"form\">\n <label class=\"field\">\n <span>${i18next.t('field.regulation-effective-on')}</span>\n <ox-input-date type=\"date\" ?disabled=${locked} .value=${value('effectiveOn')} @change=${(e: any) => set('effectiveOn', e.target.value)}></ox-input-date>\n <span>${i18next.t('text.regulation-effective-hint')}</span>\n </label>\n ${filing ? html`<div class=\"field\">\n <span>${i18next.t('field.regulation-unfavourable')}</span>\n <ox-input-select-buttons\n ?disabled=${locked}\n .value=${value('unfavourable') === '' ? '' : String(value('unfavourable'))}\n .options=${[{ value: 'true', display: i18next.t('text.regulation-unfavourable-yes') }, { value: 'false', display: i18next.t('text.regulation-unfavourable-no') }]}\n @change=${(e: CustomEvent) => writing && e.detail && set('unfavourable', e.detail === 'true')}\n ></ox-input-select-buttons>\n <span>${i18next.t('text.regulation-unfavourable-hint')}</span>\n </div>` : nothing}\n <label class=\"field\">\n <span>${i18next.t('field.regulation-change-summary')}</span>\n <input ?disabled=${locked} .value=${value('changeSummary')} @input=${(e: any) => set('changeSummary', e.target.value)} />\n </label>\n </div>\n </section>\n <section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('field.regulation-body')}</h3></header>\n <p class=\"page-section-note muted\">${i18next.t('text.regulation-body-hint')}</p>\n <textarea class=\"body\" ?disabled=${locked} .value=${value('body')} @input=${(e: any) => set('body', e.target.value)}></textarea>\n </section>\n ${view.changes.length\n ? html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('text.regulation-changes')}</h3></header>\n <table>\n ${view.changes.map((one: any) => html`<tr><td>${one.heading}</td><td>${words[one.change]}</td></tr>`)}\n </table>\n </section>`\n : nothing}\n ${filing || view.procedures?.length ? html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('text.regulation-procedures')}</h3></header>\n <p class=\"page-section-note muted\">${i18next.t(filing ? 'text.regulation-procedures-hint' : 'text.regulation-procedures-none-asked')}</p>\n <table>\n ${(view.procedures ?? []).map(\n (one: any) =>\n html`<tr>\n <td>${wordOf('regulation-procedure-kind', one.kind)}</td>\n <td>${one.day}</td>\n <td>${one.method && Object.values(PROCEDURE_METHODS).some(methods => methods.includes(one.method)) ? wordOf('regulation-procedure-method', one.method) : ''}</td>\n <td>${one.kind === 'CONSENT' && one.workersCount != null && one.consentCount != null ? i18next.t('text.regulation-consent-count', { consented: one.consentCount, workers: one.workersCount }) : ''}</td>\n <td>${i18next.t('text.regulation-files', { count: one.files })}</td>\n <td>${writing ? html`<button class=\"danger\" ?disabled=${this.busy} @click=${() => this.deleteProcedure(one.id)}>${i18next.t('button.delete')}</button>` : nothing}</td>\n </tr>`\n )}\n </table>\n ${kinds.length ? this.renderProcedureForm(kinds) : nothing}\n </section>` : nothing}\n ${writing && !this.view.versions.some((one: any) => one.version.status !== 'DRAFT') ? this.renderInForce() : nothing}`\n }\n\n /* A rule in force before the system - its first version registered from its own day with its original (ADR-0187 amendment 2). */\n private renderInForce() {\n return html`<section class=\"page-section\">\n <header class=\"page-section-header\"><h3>${i18next.t('text.regulation-in-force-title')}</h3></header>\n <p class=\"page-section-note muted\">${i18next.t('text.regulation-in-force-hint')}</p>\n <div class=\"procedure-form\">\n <div class=\"field\">\n <span>${i18next.t('field.regulation-original')}</span>\n <ox-input-file multiple ?disabled=${this.busy} .value=${this.originals} @change=${(e: CustomEvent) => !this.busy && (this.originals = e.detail ?? [])}></ox-input-file>\n </div>\n <button ?disabled=${this.busy} @click=${() => this.registerInForce()}>${i18next.t('button.regulation-register-in-force')}</button>\n </div>\n </section>`\n }\n\n private renderProcedureForm(kinds: string[]) {\n const kind = kinds[0]\n const set = (name: 'day' | 'notes', given: string) => !this.busy && this.procedure.set(name, given)\n return html`<div class=\"procedure-form\">\n <div class=\"field\">\n <span>${i18next.t('field.regulation-procedure-kind')}</span>\n <span>${wordOf('regulation-procedure-kind', kind)}</span>\n </div>\n <label class=\"field\"><span>${i18next.t('field.regulation-procedure-day')}</span><ox-input-date type=\"date\" ?disabled=${this.busy} .value=${this.procedure.value('day')} @change=${(e: any) => set('day', e.target.value)}></ox-input-date></label>\n <label class=\"field\"><span>${i18next.t('field.regulation-procedure-notes')}</span><input ?disabled=${this.busy} .value=${this.procedure.value('notes')} @input=${(e: any) => set('notes', e.target.value)} /></label>\n <div class=\"field\">\n <span>${i18next.t('field.regulation-procedure-files')}</span>\n <ox-input-file multiple ?disabled=${this.busy} .value=${this.files} @change=${(e: CustomEvent) => !this.busy && (this.files = e.detail ?? [])}></ox-input-file>\n </div>\n <button ?disabled=${this.busy} @click=${() => this.recordProcedure(kind)}>${i18next.t('button.regulation-procedure-record')}</button>\n </div>`\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active) return\n const params = new URLSearchParams(location.search)\n const id = params.get('id') ?? lifecycle?.params?.id\n const version = params.get('version')\n /* Another rule, or another version asked by the address: the shell asked about what was typed (addressDirty) and\n dropped it before the address changed; this page only moves to it. */\n const another = !!this.view && !!id && id !== this.view.regulation.id\n if (another || (version && version !== this.chosen)) this.choose(version ?? '')\n if (id) this.ruleId = id\n }\n\n /* The files picked belong to the version they were picked on, as the drafts do: switching drops them. */\n private choose(id: string) {\n this.chosen = id\n this.files = []\n this.originals = []\n this.updateContext()\n }\n\n /*\n * PageView reads the drafts; the files picked are the page's own unsaved state too. The shell asks about them before\n * any move - 「규정 목록」, the menu, another rule's address, closing the tab - and drops them once the move is agreed.\n */\n get addressDirty() {\n return super.addressDirty || this.files.length > 0 || this.originals.length > 0\n }\n\n get addressDiscardText() {\n return i18next.t('text.regulation-leave-unsaved')\n }\n\n discardAddressEdits(change?: any) {\n super.discardAddressEdits(change)\n this.choose(this.chosen)\n }\n\n /* A version switch stays on the page, so the page asks the shell's question itself. */\n private async mayLeave() {\n return await this.canDeactivate()\n }\n\n private async switchTo(id: string) {\n if (this.busy || id === this.current?.version.id) {\n const buttons = this.renderRoot.querySelector('ox-input-select-buttons') as any\n if (buttons) buttons.value = this.current?.version.id\n return\n }\n if (await this.mayLeave()) return this.choose(id)\n /* Staying: the buttons already show the version clicked - put them back on the one still open. */\n const buttons = this.renderRoot.querySelector('ox-input-select-buttons') as any\n if (buttons) buttons.value = this.current?.version.id\n }\n\n private async call(save: MutationController, variables: any, done = 'text.regulation-saved', context?: any) {\n if (this.busy) return undefined\n const data = await save.run(variables, { context })\n if (data) notify({ message: i18next.t(done) })\n return data\n }\n\n private patchOf(sent: any) {\n const patch: any = { ...sent }\n if (patch.effectiveOn === '') patch.effectiveOn = null\n return patch\n }\n\n /* Saves the text edits of the version chosen - the one door that clears them. */\n private async saveDraft(done = 'text.regulation-saved') {\n const on = this.current.version.id\n return await this.draft.submit(sent => this.call(this.saves.draft, { id: on, patch: this.patchOf(sent) }, done))\n }\n\n private async saveVersion() {\n if (!this.draft.dirty) return\n await this.saveDraft()\n }\n\n private async submit() {\n const id = this.current.version.id\n if (this.draft.dirty && !(await this.saveDraft())) return\n /* Only what the screen shows is put up: anything not saved yet stops the submission. */\n if (this.draft.dirty || this.current?.version.id !== id) return\n const confirmed = await OxPrompt.open({\n title: i18next.t('button.regulation-submit'),\n text: i18next.t('text.regulation-submit-confirm'),\n confirmButton: { text: i18next.t('button.regulation-submit') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (confirmed) await this.call(this.saves.submit, { id }, 'text.regulation-submitted')\n }\n\n private async registerInForce() {\n const id = this.current.version.id\n if (this.draft.dirty && !(await this.saveDraft())) return\n if (this.draft.dirty || this.current?.version.id !== id) return\n const originals = this.originals\n const confirmed = await OxPrompt.open({\n title: i18next.t('button.regulation-register-in-force'),\n text: i18next.t('text.regulation-in-force-confirm', { version: this.current.version.version, day: this.current.version.effectiveOn ?? '' }),\n confirmButton: { text: i18next.t('button.regulation-register-in-force') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (!confirmed) return\n const done = await this.call(\n this.saves.inForce,\n { id, files: originals },\n 'text.regulation-registered-in-force',\n originals.length ? uploadContext(() => {}) : undefined\n )\n if (done && this.originals === originals) this.originals = []\n }\n\n private async withdraw() {\n await this.call(this.saves.withdraw, { id: this.current.version.id })\n }\n\n private async newVersion() {\n const data = await this.call(this.saves.newVersion, { id: this.view.regulation.id })\n if (data) this.choose(data.newRegulationVersion.id)\n }\n\n /** The revision asked about is the one deleted: if the screen shows another once confirmed, nothing is deleted. */\n private async deleteVersion() {\n const id = this.current?.version.id\n if (!id) return\n const confirmed = await OxPrompt.open({\n title: i18next.t('button.regulation-version-delete'),\n text: i18next.t('text.regulation-version-delete-confirm'),\n confirmButton: { text: i18next.t('button.delete'), destructive: true },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (!confirmed || this.current?.version.id !== id) return\n if (await this.call(this.saves.deleteVersion, { id })) this.choose('')\n }\n\n private async recordProcedure(kind: string) {\n const files = this.files\n const done = await this.procedure.submit(sent =>\n this.call(\n this.saves.procedure,\n {\n procedure: { versionId: this.current.version.id, kind, day: sent.day ?? '', notes: sent.notes || null },\n files\n },\n 'text.regulation-saved',\n files.length ? uploadContext(() => {}) : undefined\n )\n )\n /* Only what was sent is done - a file picked since stays. */\n if (done && this.files === files) this.files = []\n }\n\n private async deleteProcedure(id: string) {\n await this.call(this.saves.deleteProcedure, { id })\n }\n}\n"]}