@things-factory/compliance 10.1.267 → 10.1.269
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/components/compliance-case-form.d.ts +1 -0
- package/dist-client/components/compliance-case-form.js +3 -2
- package/dist-client/components/compliance-case-form.js.map +1 -1
- package/dist-client/components/compliance-case-sheet.d.ts +1 -0
- package/dist-client/components/compliance-case-sheet.js +3 -2
- package/dist-client/components/compliance-case-sheet.js.map +1 -1
- package/dist-client/components/invention-report-form.d.ts +1 -0
- package/dist-client/components/invention-report-form.js +2 -1
- package/dist-client/components/invention-report-form.js.map +1 -1
- package/dist-client/components/seal-use-form.d.ts +5 -0
- package/dist-client/components/seal-use-form.js +37 -7
- package/dist-client/components/seal-use-form.js.map +1 -1
- package/dist-client/components/training-attendance-form.d.ts +1 -0
- package/dist-client/components/training-attendance-form.js +2 -1
- package/dist-client/components/training-attendance-form.js.map +1 -1
- package/dist-client/components/training-certificate-form.d.ts +1 -0
- package/dist-client/components/training-certificate-form.js +2 -1
- package/dist-client/components/training-certificate-form.js.map +1 -1
- package/dist-client/components/training-session-form.d.ts +1 -0
- package/dist-client/components/training-session-form.js +3 -2
- package/dist-client/components/training-session-form.js.map +1 -1
- package/dist-client/pages/regulation-detail.d.ts +1 -0
- package/dist-client/pages/regulation-detail.js +3 -2
- package/dist-client/pages/regulation-detail.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/activities/regulation-activity.js +4 -2
- package/dist-server/activities/regulation-activity.js.map +1 -1
- package/dist-server/activities/seal-use-activity.js +4 -1
- package/dist-server/activities/seal-use-activity.js.map +1 -1
- package/dist-server/index.js +2 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/service/index.d.ts +1 -0
- package/dist-server/service/index.js +1 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/seal-use/seal-use-mutation.d.ts +2 -1
- package/dist-server/service/seal-use/seal-use-mutation.js +6 -4
- package/dist-server/service/seal-use/seal-use-mutation.js.map +1 -1
- package/dist-server/service/seal-use/seal-use-paper.d.ts +16 -0
- package/dist-server/service/seal-use/seal-use-paper.js +45 -0
- package/dist-server/service/seal-use/seal-use-paper.js.map +1 -0
- package/dist-server/service/seal-use/seal-use-service.d.ts +2 -1
- package/dist-server/service/seal-use/seal-use-service.js +21 -3
- package/dist-server/service/seal-use/seal-use-service.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -16
- package/translations/en.json +3 -1
- package/translations/es.json +3 -1
- package/translations/ja.json +3 -1
- package/translations/ko.json +3 -1
- package/translations/ms.json +3 -1
- package/translations/zh.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seal-use-form.js","sourceRoot":"","sources":["../../client/components/seal-use-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@operato/input/ox-input-select-buttons.js'\nimport '@operato/input/ox-select.js'\nimport '@operato/popup/ox-popup-actions.js'\nimport '@operato/popup/ox-popup-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf, USE_KINDS, wordOf } from '../words.js'\n\n/** What the form is opened with - a 사용인감계 just issued asks for the corporate seal's stamp on it. */\nexport interface SealUsePrefill {\n kind?: string\n sealKind?: string\n document?: string\n purpose?: string\n submittedTo?: string\n}\n\ntype Choice = { value: string; display: string; kind?: string }\n\n/** Opens the form; resolves with the written use, or null when the person closed it. */\nexport function openSealUseForm(prefill: SealUsePrefill = {}): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const handle: any = openPopup(\n html`<seal-use-form .prefill=${prefill} @close=${() => handle.close()} @recorded=${(e: CustomEvent) => ((done = e.detail), handle.close())}></seal-use-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.seal-use-record') }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\n/**\n * 날인 기록 쓰기 (ADR-0188 decision 2) - which seal, what was done with it, who asked, for which paper and where it goes.\n * The server decides whether it goes up for approval; the guide says when.\n */\n@customElement('seal-use-form')\nexport class SealUseForm extends localize(i18next)(LitElement) {\n /* The house shape of a popup (page-standard sections 7, 8): only the body scrolls, fields are labels above native\n inputs, the one button row is `ox-popup-actions`. */\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n [guide] p {\n margin: 0;\n color: var(--ui-muted);\n line-height: var(--popup-line-height);\n }\n ox-input-select-buttons {\n align-self: flex-start;\n }\n ox-select {\n width: 100%;\n }\n `\n ]\n\n @property({ type: Object }) prefill: SealUsePrefill = {}\n\n @state() private kind = 'STAMP'\n /* The seal chosen - undefined until one is, while the one the prefill names stands. */\n @state() private chosenSeal?: string\n @state() private requesterId = ''\n @state() private usedOn = today()\n @state() private document = ''\n @state() private purpose = ''\n @state() private submittedTo = ''\n @state() private returnDueOn = ''\n @state() private copies = '1'\n @state() private usableUntil = ''\n @state() private notes = ''\n /* The seals in use and the employees who may ask for one (ADR-0190). */\n private choices = new QueryController(\n this,\n gql`\n query {\n companySeals(filters: [{ name: \"disposedOn\", operator: \"is_null\" }], pagination: { page: 1, limit: 100 }) {\n items { id kind name }\n }\n employees(filters: [{ name: \"retiredOn\", operator: \"is_null\" }], pagination: { page: 1, limit: 500 }, sortings: [{ name: \"name\" }]) {\n items { id name controlNo }\n }\n }\n `\n )\n\n /* Its failure is drawn under the notes, beside the form. */\n private recording = new MutationController(\n this,\n gql`\n mutation ($use: NewSealUse!) {\n recordSealUse(use: $use) { id status }\n }\n `,\n { showsError: true }\n )\n\n connectedCallback() {\n super.connectedCallback()\n const { kind, document, purpose, submittedTo } = this.prefill ?? {}\n Object.assign(this, { kind: kind ?? this.kind, document: document ?? '', purpose: purpose ?? '', submittedTo: submittedTo ?? '' })\n }\n\n private get seals(): Choice[] {\n /* The kind is said beside a name that does not say it already - 「사용인감 1호」, not 「법인인감 (법인인감)」. */\n const named = (one: any) => (one.name.includes(wordOf('company-seal-kind', one.kind)) ? one.name : `${one.name} (${wordOf('company-seal-kind', one.kind)})`)\n return (this.choices.data?.companySeals?.items ?? []).map((one: any) => ({ value: one.id, display: named(one), kind: one.kind }))\n }\n\n private get people(): Choice[] {\n return (this.choices.data?.employees?.items ?? []).map((one: any) => ({ value: one.id, display: one.controlNo ? `${one.name} · ${one.controlNo}` : one.name }))\n }\n\n private get sealId(): string {\n if (this.chosenSeal !== undefined) return this.chosenSeal\n const wanted = this.prefill?.sealKind\n return (wanted && this.seals.find(one => one.kind === wanted)?.value) || ''\n }\n\n private get working() {\n return this.recording.pending\n }\n\n private get message() {\n return this.recording.error ? failureOf(this.recording.error) : ''\n }\n\n render() {\n const certificate = this.kind === 'CERTIFICATE'\n const seals = certificate ? this.seals.filter(one => one.kind === 'CORPORATE') : this.seals\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.seal-use-approval-guide')}</p></div>\n\n <div class=\"field\">\n <ox-input-select-buttons\n .value=${this.kind}\n .options=${USE_KINDS.map(code => ({ display: wordOf('seal-use-kind', code), value: code }))}\n @change=${(e: CustomEvent) => e.detail && (this.kind = e.detail)}\n ></ox-input-select-buttons>\n </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-seal')}</span>\n ${this.chooser(seals, this.sealId, value => (this.chosenSeal = value))}\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-requester')}</span>\n ${this.chooser(this.people, this.requesterId, value => (this.requesterId = value))}\n </label>\n\n <label class=\"field\">\n <span>${i18next.t(`field.seal-use-used-on-${this.kind.toLowerCase().replace('_', '-')}`)}</span>\n <input type=\"date\" .value=${this.usedOn} @input=${(e: any) => (this.usedOn = e.target.value)} />\n </label>\n\n ${certificate\n ? nothing\n : html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-document')}</span>\n <input .value=${this.document} @input=${(e: any) => (this.document = e.target.value)} />\n </label>`}\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-purpose')}</span>\n <input .value=${this.purpose} @input=${(e: any) => (this.purpose = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-submitted-to')}</span>\n <input .value=${this.submittedTo} @input=${(e: any) => (this.submittedTo = e.target.value)} />\n </label>\n\n ${this.kind === 'TAKE_OUT'\n ? html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-return-due-on')}</span>\n <input type=\"date\" .value=${this.returnDueOn} @input=${(e: any) => (this.returnDueOn = e.target.value)} />\n </label>`\n : nothing}\n ${certificate\n ? html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-copies')}</span>\n <input type=\"number\" min=\"1\" .value=${this.copies} @input=${(e: any) => (this.copies = e.target.value)} />\n </label>\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-usable-until')}</span>\n <input type=\"date\" .value=${this.usableUntil} @input=${(e: any) => (this.usableUntil = e.target.value)} />\n <span>${i18next.t('text.seal-use-usable-until-hint')}</span>\n </label>`\n : nothing}\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-notes')}</span>\n <input .value=${this.notes} @input=${(e: any) => (this.notes = e.target.value)} />\n <span invalid>${this.message}</span>\n </label>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.record()}>${i18next.t('button.seal-use-record')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n /** One value among many - the framework popup list with its search box on top. */\n private chooser(options: Choice[], value: string, change: (value: string) => void) {\n const shown = options.find(one => one.value === value)?.display ?? '—'\n return html`<ox-select .value=${value} @change=${(e: CustomEvent) => String(e.detail ?? '') !== value && change(String(e.detail ?? ''))}>\n <span slot=\"label\">${shown}</span>\n <ox-popup-list align-left nowrap with-search>${options.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>`\n }\n\n private async record() {\n const certificate = this.kind === 'CERTIFICATE'\n const done = await this.recording.run({\n use: {\n kind: this.kind,\n sealId: this.sealId,\n requesterId: this.requesterId || null,\n usedOn: this.usedOn,\n document: certificate ? null : this.document,\n purpose: this.purpose,\n submittedTo: this.submittedTo,\n returnDueOn: this.kind === 'TAKE_OUT' ? this.returnDueOn || null : null,\n copies: certificate ? Number(this.copies) || null : null,\n usableUntil: certificate ? this.usableUntil || null : null,\n notes: this.notes\n }\n })\n if (!done) return\n const written = done.recordSealUse\n notify({ message: i18next.t(written.status === 'SUBMITTED' ? 'text.seal-use-submitted' : 'text.seal-use-recorded') })\n this.dispatchEvent(new CustomEvent('recorded', { detail: written }))\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"seal-use-form.js","sourceRoot":"","sources":["../../client/components/seal-use-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-date.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-select-buttons.js'\nimport '@operato/input/ox-select.js'\nimport '@operato/popup/ox-popup-actions.js'\nimport '@operato/popup/ox-popup-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { MutationController, QueryController, uploadContext } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { CommonPopupStyles, FormFieldStyles, PopupBodyStyles, PopupFieldStyles } from '@operato/styles'\n\nimport { failureOf, USE_KINDS, wordOf } from '../words.js'\n\n/** What the form is opened with - a 사용인감계 just issued asks for the corporate seal's stamp on it. */\nexport interface SealUsePrefill {\n kind?: string\n sealKind?: string\n document?: string\n purpose?: string\n submittedTo?: string\n}\n\ntype Choice = { value: string; display: string; kind?: string }\n\n/** Opens the form; resolves with the written use, or null when the person closed it. */\nexport function openSealUseForm(prefill: SealUsePrefill = {}): Promise<any | null> {\n return new Promise(resolve => {\n let done: any = null\n const handle: any = openPopup(\n html`<seal-use-form .prefill=${prefill} @close=${() => handle.close()} @recorded=${(e: CustomEvent) => ((done = e.detail), handle.close())}></seal-use-form>`,\n { backdrop: true, size: 'medium', title: i18next.t('title.seal-use-record') }\n )\n handle.onclosed = () => resolve(done)\n })\n}\n\nconst today = () => {\n const now = new Date()\n return new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString().slice(0, 10)\n}\n\n/**\n * 날인 기록 쓰기 (ADR-0188 decision 2) - which seal, what was done with it, who asked, for which paper and where it goes.\n * The server decides whether it goes up for approval; the guide says when.\n */\n@customElement('seal-use-form')\nexport class SealUseForm extends localize(i18next)(LitElement) {\n /* The house shape of a popup (page-standard sections 7, 8): only the body scrolls, fields are labels above native\n inputs, the one button row is `ox-popup-actions`. */\n static styles = [\n CommonPopupStyles,\n PopupBodyStyles,\n FormFieldStyles,\n PopupFieldStyles,\n css`\n [invalid] {\n color: var(--ui-crit, var(--md-sys-color-error));\n font-size: var(--ui-t-small, 11.5px);\n }\n [invalid]:empty {\n display: none;\n }\n [guide] p {\n margin: 0;\n color: var(--ui-muted);\n line-height: var(--popup-line-height);\n }\n ox-input-select-buttons {\n align-self: flex-start;\n }\n ox-select {\n width: 100%;\n }\n `\n ]\n\n @property({ type: Object }) prefill: SealUsePrefill = {}\n\n @state() private kind = 'STAMP'\n /* The seal chosen - undefined until one is, while the one the prefill names stands. */\n @state() private chosenSeal?: string\n @state() private requesterId = ''\n @state() private usedOn = today()\n @state() private document = ''\n @state() private purpose = ''\n @state() private submittedTo = ''\n @state() private returnDueOn = ''\n @state() private copies = '1'\n @state() private usableUntil = ''\n @state() private notes = ''\n /* The paper to be stamped - a copy the approver opens from the approval (2026-11-10). */\n @state() private files: File[] = []\n @state() private progress?: number\n /* The seals in use and the employees who may ask for one (ADR-0190). */\n private choices = new QueryController(\n this,\n gql`\n query {\n companySeals(filters: [{ name: \"disposedOn\", operator: \"is_null\" }], pagination: { page: 1, limit: 100 }) {\n items { id kind name }\n }\n employees(filters: [{ name: \"retiredOn\", operator: \"is_null\" }], pagination: { page: 1, limit: 500 }, sortings: [{ name: \"name\" }]) {\n items { id name controlNo }\n }\n }\n `\n )\n\n /* Its failure is drawn under the notes, beside the form. */\n private recording = new MutationController(\n this,\n gql`\n mutation ($use: NewSealUse!, $files: [Upload!]) {\n recordSealUse(use: $use, files: $files) { id status }\n }\n `,\n { showsError: true }\n )\n\n connectedCallback() {\n super.connectedCallback()\n const { kind, document, purpose, submittedTo } = this.prefill ?? {}\n Object.assign(this, { kind: kind ?? this.kind, document: document ?? '', purpose: purpose ?? '', submittedTo: submittedTo ?? '' })\n }\n\n private get seals(): Choice[] {\n /* The kind is said beside a name that does not say it already - 「사용인감 1호」, not 「법인인감 (법인인감)」. */\n const named = (one: any) => (one.name.includes(wordOf('company-seal-kind', one.kind)) ? one.name : `${one.name} (${wordOf('company-seal-kind', one.kind)})`)\n return (this.choices.data?.companySeals?.items ?? []).map((one: any) => ({ value: one.id, display: named(one), kind: one.kind }))\n }\n\n private get people(): Choice[] {\n return (this.choices.data?.employees?.items ?? []).map((one: any) => ({ value: one.id, display: one.controlNo ? `${one.name} · ${one.controlNo}` : one.name }))\n }\n\n private get sealId(): string {\n if (this.chosenSeal !== undefined) return this.chosenSeal\n const wanted = this.prefill?.sealKind\n return (wanted && this.seals.find(one => one.kind === wanted)?.value) || ''\n }\n\n private get working() {\n return this.recording.pending\n }\n\n private get message() {\n return this.recording.error ? failureOf(this.recording.error) : ''\n }\n\n render() {\n const certificate = this.kind === 'CERTIFICATE'\n const seals = certificate ? this.seals.filter(one => one.kind === 'CORPORATE') : this.seals\n return html`\n <div class=\"body\">\n <div guide><p>${i18next.t('text.seal-use-approval-guide')}</p></div>\n\n <div class=\"field\">\n <ox-input-select-buttons\n .value=${this.kind}\n .options=${USE_KINDS.map(code => ({ display: wordOf('seal-use-kind', code), value: code }))}\n @change=${(e: CustomEvent) => e.detail && (this.kind = e.detail)}\n ></ox-input-select-buttons>\n </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-seal')}</span>\n ${this.chooser(seals, this.sealId, value => (this.chosenSeal = value))}\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-requester')}</span>\n ${this.chooser(this.people, this.requesterId, value => (this.requesterId = value))}\n </label>\n\n <label class=\"field\">\n <span>${i18next.t(`field.seal-use-used-on-${this.kind.toLowerCase().replace('_', '-')}`)}</span>\n <ox-input-date type=\"date\" .value=${this.usedOn} @change=${(e: any) => (this.usedOn = e.target.value)}></ox-input-date>\n </label>\n\n ${certificate\n ? nothing\n : html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-document')}</span>\n <input .value=${this.document} @input=${(e: any) => (this.document = e.target.value)} />\n </label>`}\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-purpose')}</span>\n <input .value=${this.purpose} @input=${(e: any) => (this.purpose = e.target.value)} />\n </label>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-submitted-to')}</span>\n <input .value=${this.submittedTo} @input=${(e: any) => (this.submittedTo = e.target.value)} />\n </label>\n\n ${this.kind === 'TAKE_OUT'\n ? html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-return-due-on')}</span>\n <ox-input-date type=\"date\" .value=${this.returnDueOn} @change=${(e: any) => (this.returnDueOn = e.target.value)}></ox-input-date>\n </label>`\n : nothing}\n ${certificate\n ? html`<label class=\"field\">\n <span>${i18next.t('field.seal-use-copies')}</span>\n <input type=\"number\" min=\"1\" .value=${this.copies} @input=${(e: any) => (this.copies = e.target.value)} />\n </label>\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-usable-until')}</span>\n <ox-input-date type=\"date\" .value=${this.usableUntil} @change=${(e: any) => (this.usableUntil = e.target.value)}></ox-input-date>\n <span>${i18next.t('text.seal-use-usable-until-hint')}</span>\n </label>`\n : nothing}\n\n <div class=\"field\">\n <span>${i18next.t('field.seal-use-papers')}</span>\n ${this.files.length ? html`<ul>${this.files.map(one => html`<li>${one.name}</li>`)}</ul>` : nothing}\n <ox-input-file quiet hide-filelist multiple icon=\"attach_file\" .dropTarget=${this} .progress=${this.progress} @change=${(e: CustomEvent) => this.pick(e)}></ox-input-file>\n <span>${i18next.t('text.seal-use-papers-hint')}</span>\n </div>\n\n <label class=\"field\">\n <span>${i18next.t('field.seal-use-notes')}</span>\n <input .value=${this.notes} @input=${(e: any) => (this.notes = e.target.value)} />\n <span invalid>${this.message}</span>\n </label>\n </div>\n\n <ox-popup-actions>\n <md-text-button slot=\"cancel\" @click=${() => this.dispatchEvent(new CustomEvent('close'))}>${i18next.t('button.cancel')}</md-text-button>\n <md-filled-button slot=\"confirm\" ?disabled=${this.working} @click=${() => this.record()}>${i18next.t('button.seal-use-record')}</md-filled-button>\n </ox-popup-actions>\n `\n }\n\n /** One value among many - the framework popup list with its search box on top. */\n private chooser(options: Choice[], value: string, change: (value: string) => void) {\n const shown = options.find(one => one.value === value)?.display ?? '—'\n return html`<ox-select .value=${value} @change=${(e: CustomEvent) => String(e.detail ?? '') !== value && change(String(e.detail ?? ''))}>\n <span slot=\"label\">${shown}</span>\n <ox-popup-list align-left nowrap with-search>${options.map(one => html`<div option value=${one.value}>${one.display}</div>`)}</ox-popup-list>\n </ox-select>`\n }\n\n private pick(e: CustomEvent) {\n const picked = [...((e.detail as File[]) ?? [])]\n /* The picker's own reset says `change` again, with nothing - that one is let go. */\n if (!picked.length) return\n ;(e.target as any).reset?.()\n this.files = [...this.files, ...picked]\n }\n\n private async record() {\n const certificate = this.kind === 'CERTIFICATE'\n /* The paper goes with the use, its upload's progress drawn on the picker. */\n const upload = this.files.length ? { context: uploadContext((fraction: number) => (this.progress = fraction)) } : undefined\n const done = await this.recording.run({\n files: this.files,\n use: {\n kind: this.kind,\n sealId: this.sealId,\n requesterId: this.requesterId || null,\n usedOn: this.usedOn,\n document: certificate ? null : this.document,\n purpose: this.purpose,\n submittedTo: this.submittedTo,\n returnDueOn: this.kind === 'TAKE_OUT' ? this.returnDueOn || null : null,\n copies: certificate ? Number(this.copies) || null : null,\n usableUntil: certificate ? this.usableUntil || null : null,\n notes: this.notes\n }\n }, upload)\n if (!done) return\n const written = done.recordSealUse\n notify({ message: i18next.t(written.status === 'SUBMITTED' ? 'text.seal-use-submitted' : 'text.seal-use-recorded') })\n this.dispatchEvent(new CustomEvent('recorded', { detail: written }))\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import '@operato/input/ox-input-date.js';
|
|
2
3
|
import '@material/web/button/filled-button.js';
|
|
3
4
|
import '@material/web/button/text-button.js';
|
|
4
5
|
import '@material/web/icon/icon.js';
|
|
@@ -114,7 +115,7 @@ let TrainingAttendanceForm = class TrainingAttendanceForm extends localize(i18ne
|
|
|
114
115
|
|
|
115
116
|
<label class="field">
|
|
116
117
|
<span>${i18next.t('field.training-completed-on')}</span>
|
|
117
|
-
<input type="date" .value=${this.completedOn} min=${this.session.startsOn} @
|
|
118
|
+
<ox-input-date type="date" .value=${this.completedOn} min=${this.session.startsOn} @change=${(e) => (this.completedOn = e.target.value)}></ox-input-date>
|
|
118
119
|
</label>
|
|
119
120
|
|
|
120
121
|
<div class="field">
|
|
@@ -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,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} @
|
|
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":";AAAA,OAAO,uCAAuC,CAAA;AAC9C,OAAO,qCAAqC,CAAA;AAC5C,OAAO,iCAAiC,CAAA;AACxC,OAAO,2CAA2C,CAAA;AAClD,OAAO,6BAA6B,CAAA;AACpC,OAAO,oCAAoC,CAAA;AAC3C,OAAO,iCAAiC,CAAA;AAExC,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvG,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AASvC,mEAAmE;AACnE,MAAM,UAAU,2BAA2B,CAAC,EAAkB;IAC5D,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,IAAI,IAAI,GAAG,KAAK,CAAA;QAChB,MAAM,MAAM,GAAQ,SAAS,CAC3B,IAAI,CAAA,kCAAkC,EAAE,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,+BAA+B,EACrJ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC5H,CAAA;QACD,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,KAAK,GAAG,GAAG,EAAE;IACjB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,iBAAiB,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAC7F,CAAC,CAAA;AAED;;;GAGG;AAEI,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAAnE;;QAkCY,gBAAW,GAAG,KAAK,EAAE,CAAA;QACrB,WAAM,GAAG,QAAQ,CAAA;QACjB,cAAS,GAAG,EAAE,CAAA;QACd,iBAAY,GAAG,EAAE,CAAA;QACjB,UAAK,GAAW,EAAE,CAAA;QAClB,aAAQ,GAAG,CAAC,CAAA;QACZ,YAAO,GAAG,KAAK,CAAA;QACf,YAAO,GAAG,EAAE,CAAA;IAiF/B,CAAC;aAzHQ,WAAM,GAAG;QACd,iBAAiB;QACjB,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;KAuBF;KACF,AA7BY,CA6BZ;IAaD,MAAM;QACJ,MAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QAC/K,OAAO,IAAI,CAAA;;wBAES,OAAO,CAAC,CAAC,CAAC,iCAAiC,CAAC;;;kBAGlD,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;mCACvB,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,QAAQ,KAAK,EAAE,WAAW,IAAI,CAAC,WAAW,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;kBAC5I,OAAO,CAAC,CAAC,CAAC,iCAAiC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;;;;kBAIpE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;4CACR,IAAI,CAAC,MAAM,aAAa,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;;;;kBAIjK,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;8BACvB,IAAI,CAAC,SAAS,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;iCACpF,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,IAAI,GAAG;2DACxC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA,qBAAqB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,QAAQ,CAAC;;;;;kBAKvH,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;0BAChC,IAAI,CAAC,YAAY,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;kBAIpF,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;uFACjB,IAAI,cAAc,IAAI,CAAC,QAAQ,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;kBAChJ,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;0BACnC,IAAI,CAAC,OAAO;;;;;+CAKS,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;qDAC1E,IAAI,CAAC,OAAO,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC;;KAEzI,CAAA;IACH,CAAC;IAEO,IAAI,CAAC,CAAc;QACzB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,MAAiB,IAAI,EAAE,CAAC,CAAC,CAAA;QAChD,oFAAoF;QACpF,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OACnB;QAAC,CAAC,CAAC,MAAc,CAAC,KAAK,EAAE,EAAE,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,CAAA;IACzC,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;gBACnC,QAAQ,EAAE,GAAG,CAAA;;;;SAIZ;gBACD,SAAS,EAAE;oBACT,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;oBAC/K,MAAM,EAAE,IAAI,CAAC,KAAK;iBACnB;gBACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3G,CAAC,CAAA;YACF,IAAK,QAAgB,CAAC,MAAM,EAAE,MAAM;gBAAE,MAAM,QAAQ,CAAA;YACpD,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,EAAE,CAAC,CAAA;YAChE,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACtB,CAAC;IACH,CAAC;;AAzF2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mDAAoB;AAE9B;IAAhB,KAAK,EAAE;;4DAA8B;AACrB;IAAhB,KAAK,EAAE;;uDAA0B;AACjB;IAAhB,KAAK,EAAE;;0DAAuB;AACd;IAAhB,KAAK,EAAE;;6DAA0B;AACjB;IAAhB,KAAK,EAAE;;sDAA2B;AAClB;IAAhB,KAAK,EAAE;;yDAAqB;AACZ;IAAhB,KAAK,EAAE;;wDAAwB;AACf;IAAhB,KAAK,EAAE;;wDAAqB;AAzClB,uBAAuB;IADnC,aAAa,CAAC,2BAA2B,CAAC;GAC9B,uBAAuB,CA0HnC","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,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} @
|
|
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} @
|
|
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":";AAAA,OAAO,uCAAuC,CAAA;AAC9C,OAAO,qCAAqC,CAAA;AAC5C,OAAO,iCAAiC,CAAA;AACxC,OAAO,2CAA2C,CAAA;AAClD,OAAO,6BAA6B,CAAA;AACpC,OAAO,oCAAoC,CAAA;AAC3C,OAAO,iCAAiC,CAAA;AACxC,OAAO,wEAAwE,CAAA;AAE/E,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvG,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAIvC,6GAA6G;AAC7G,MAAM,UAAU,uBAAuB,CAAC,KAAe,EAAE,IAAY;IACnE,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,IAAI,IAAI,GAAQ,IAAI,CAAA;QACpB,MAAM,MAAM,GAAQ,SAAS,CAC3B,IAAI,CAAA,iCAAiC,KAAK,UAAU,IAAI,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,2BAA2B,EACrL,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,EAAE,CACpF,CAAA;QACD,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAA/D;;QAgCsB,UAAK,GAAa,EAAE,CAAA;QACnB,SAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAE1C,SAAI,GAAG,EAAE,CAAA;QACT,SAAI,GAAG,EAAE,CAAA;QACT,WAAM,GAAG,YAAY,CAAA;QACrB,aAAQ,GAAG,EAAE,CAAA;QACb,WAAM,GAAG,EAAE,CAAA;QACX,eAAU,GAAG,EAAE,CAAA;QACf,iBAAY,GAAG,EAAE,CAAA;QACjB,cAAS,GAAe,EAAE,CAAA;QAC1B,UAAK,GAAG,EAAE,CAAA;QACV,UAAK,GAAW,EAAE,CAAA;QAClB,aAAQ,GAAG,CAAC,CAAA;QACZ,YAAO,GAAG,KAAK,CAAA;QACf,YAAO,GAAG,EAAE,CAAA;QACZ,aAAQ,GAAG,EAAE,CAAA;QAE9B,kHAAkH;QAC1G,YAAO,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,GAAG,CAAA,6GAA6G,EAAE;YAC5J,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC7D,CAAC,CAAA;IA6IJ,CAAC;aAjMQ,WAAM,GAAG;QACd,iBAAiB;QACjB,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;KAuBF;KACF,AA7BY,CA6BZ;IAyBD,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACjC,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACjD,OAAO,IAAI,CAAA;;wBAES,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;;;kBAG9C,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;8BACpB,IAAI,CAAC,IAAI,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;iCAC1E,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,GAAG;2DAChC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA,qBAAqB,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,QAAQ,CAAC;;;;;kBAKpH,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;8DACY,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;;;kBAIxH,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;0BAChC,IAAI,CAAC,IAAI,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;kBAIpE,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;4CACR,IAAI,CAAC,MAAM,aAAa,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;;;UAGzK,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE;;;kBAG3C,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;sCACjB,IAAI,CAAC,QAAQ,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;kBAIxF,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;sCACf,IAAI,CAAC,MAAM,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;kBAIpF,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;0BAC9B,IAAI,CAAC,UAAU,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;kBAIhF,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;0BAChC,IAAI,CAAC,YAAY,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;;;;kBAIpF,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;iDACN,IAAI,CAAC,SAAS,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;kBACnI,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC;;;;kBAIjD,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAA,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;uFACjB,IAAI,cAAc,IAAI,CAAC,QAAQ,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;;;kBAIhJ,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC;0BACzB,IAAI,CAAC,KAAK,WAAW,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;0BAC9D,IAAI,CAAC,OAAO;;;;;+CAKS,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;qDAC1E,IAAI,CAAC,OAAO,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC;;KAErI,CAAA;IACH,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAAG,CAAE,IAAI,CAAC,OAAO,CAAC,IAAY,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QAC7G,OAAO,IAAI,CAAA;cACD,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;0BACtB,IAAI,CAAC,QAAQ,YAAY,CAAC,CAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;6BAClF,OAAO,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,GAAG;uDACvC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,IAAI,CAAA,qBAAqB,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,IAAI,QAAQ,CAAC;;cAEvH,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC;aAC7G,CAAA;IACX,CAAC;IAEO,IAAI,CAAC,CAAc;QACzB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,MAAiB,IAAI,EAAE,CAAC,CAAC,CAAA;QAChD,oFAAoF;QACpF,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OACnB;QAAC,CAAC,CAAC,MAAc,CAAC,KAAK,EAAE,EAAE,CAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,CAAA;IACzC,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;gBACnC,QAAQ,EAAE,GAAG,CAAA;;;;SAIZ;gBACD,SAAS,EAAE;oBACT,OAAO,EAAE;wBACP,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;wBAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;wBAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;wBACrG,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;wBACjE,KAAK,EAAE,IAAI,CAAC,KAAK;qBAClB;oBACD,MAAM,EAAE,IAAI,CAAC,KAAK;iBACnB;gBACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,QAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3G,CAAC,CAAA;YACF,IAAK,QAAgB,CAAC,MAAM,EAAE,MAAM;gBAAE,MAAM,QAAQ,CAAA;YACpD,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAA;YAC9D,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAA;QAC9F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;QACjC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACtB,CAAC;IACH,CAAC;;AAjK0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;kDAAqB;AACnB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;iDAAgC;AAE1C;IAAhB,KAAK,EAAE;;iDAAkB;AACT;IAAhB,KAAK,EAAE;;iDAAkB;AACT;IAAhB,KAAK,EAAE;;mDAA8B;AACrB;IAAhB,KAAK,EAAE;;qDAAsB;AACb;IAAhB,KAAK,EAAE;;mDAAoB;AACX;IAAhB,KAAK,EAAE;;uDAAwB;AACf;IAAhB,KAAK,EAAE;;yDAA0B;AACjB;IAAhB,KAAK,EAAE;;sDAAmC;AAC1B;IAAhB,KAAK,EAAE;;kDAAmB;AACV;IAAhB,KAAK,EAAE;;kDAA2B;AAClB;IAAhB,KAAK,EAAE;;qDAAqB;AACZ;IAAhB,KAAK,EAAE;;oDAAwB;AACf;IAAhB,KAAK,EAAE;;oDAAqB;AACZ;IAAhB,KAAK,EAAE;;qDAAsB;AAhDnB,mBAAmB;IAD/B,aAAa,CAAC,uBAAuB,CAAC;GAC1B,mBAAmB,CAkM/B","sourcesContent":["import '@material/web/button/filled-button.js'\nimport '@material/web/button/text-button.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-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,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')} @
|
|
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')} @
|
|
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>
|