@things-factory/compliance 10.1.259 → 10.1.261

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 (70) hide show
  1. package/dist-client/components/my-trainings.js +6 -2
  2. package/dist-client/components/my-trainings.js.map +1 -1
  3. package/dist-client/components/training-session-form.d.ts +3 -0
  4. package/dist-client/components/training-session-form.js +24 -1
  5. package/dist-client/components/training-session-form.js.map +1 -1
  6. package/dist-client/legal-record/legal-child-grid.d.ts +12 -2
  7. package/dist-client/legal-record/legal-child-grid.js +22 -2
  8. package/dist-client/legal-record/legal-child-grid.js.map +1 -1
  9. package/dist-client/legal-record/legal-grid.d.ts +1 -1
  10. package/dist-client/legal-record/legal-grid.js +4 -2
  11. package/dist-client/legal-record/legal-grid.js.map +1 -1
  12. package/dist-client/pages/compliance-case-list.js +1 -1
  13. package/dist-client/pages/compliance-case-list.js.map +1 -1
  14. package/dist-client/pages/dispute-list.js +5 -3
  15. package/dist-client/pages/dispute-list.js.map +1 -1
  16. package/dist-client/pages/invention-list.js +4 -3
  17. package/dist-client/pages/invention-list.js.map +1 -1
  18. package/dist-client/pages/legal-registration-list.js +6 -4
  19. package/dist-client/pages/legal-registration-list.js.map +1 -1
  20. package/dist-client/pages/privacy-record-list.d.ts +1 -1
  21. package/dist-client/pages/privacy-record-list.js +16 -6
  22. package/dist-client/pages/privacy-record-list.js.map +1 -1
  23. package/dist-client/pages/regulation-list.js +2 -2
  24. package/dist-client/pages/regulation-list.js.map +1 -1
  25. package/dist-client/pages/seal-use-list.d.ts +7 -0
  26. package/dist-client/pages/seal-use-list.js +4 -4
  27. package/dist-client/pages/seal-use-list.js.map +1 -1
  28. package/dist-client/pages/training-list.d.ts +16 -2
  29. package/dist-client/pages/training-list.js +63 -31
  30. package/dist-client/pages/training-list.js.map +1 -1
  31. package/dist-client/tsconfig.tsbuildinfo +1 -1
  32. package/dist-server/service/common/employee-reader.d.ts +0 -2
  33. package/dist-server/service/common/employee-reader.js +0 -12
  34. package/dist-server/service/common/employee-reader.js.map +1 -1
  35. package/dist-server/service/compliance-case/compliance-case-service.js +1 -1
  36. package/dist-server/service/compliance-case/compliance-case-service.js.map +1 -1
  37. package/dist-server/service/invention/invention-service.js +2 -1
  38. package/dist-server/service/invention/invention-service.js.map +1 -1
  39. package/dist-server/service/legal-record/attachment-readers.js +3 -3
  40. package/dist-server/service/legal-record/attachment-readers.js.map +1 -1
  41. package/dist-server/service/regulation/regulation-read.js +2 -1
  42. package/dist-server/service/regulation/regulation-read.js.map +1 -1
  43. package/dist-server/service/training/training-checks.d.ts +5 -0
  44. package/dist-server/service/training/training-checks.js +24 -0
  45. package/dist-server/service/training/training-checks.js.map +1 -1
  46. package/dist-server/service/training/training-query.d.ts +2 -0
  47. package/dist-server/service/training/training-query.js +11 -0
  48. package/dist-server/service/training/training-query.js.map +1 -1
  49. package/dist-server/service/training/training-register.js +6 -0
  50. package/dist-server/service/training/training-register.js.map +1 -1
  51. package/dist-server/service/training/training-rules.d.ts +7 -0
  52. package/dist-server/service/training/training-rules.js +8 -0
  53. package/dist-server/service/training/training-rules.js.map +1 -1
  54. package/dist-server/service/training/training-service.d.ts +11 -0
  55. package/dist-server/service/training/training-service.js +108 -6
  56. package/dist-server/service/training/training-service.js.map +1 -1
  57. package/dist-server/service/training/training-type.d.ts +1 -0
  58. package/dist-server/service/training/training-type.js +4 -0
  59. package/dist-server/service/training/training-type.js.map +1 -1
  60. package/dist-server/service/training/training.d.ts +13 -0
  61. package/dist-server/service/training/training.js +51 -1
  62. package/dist-server/service/training/training.js.map +1 -1
  63. package/dist-server/tsconfig.tsbuildinfo +1 -1
  64. package/package.json +19 -18
  65. package/translations/en.json +19 -7
  66. package/translations/es.json +18 -6
  67. package/translations/ja.json +19 -7
  68. package/translations/ko.json +19 -7
  69. package/translations/ms.json +19 -7
  70. package/translations/zh.json +19 -7
@@ -1 +1 @@
1
- {"version":3,"file":"training-list.js","sourceRoot":"","sources":["../../client/pages/training-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '@operato/input/ox-input-select-buttons.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { PageView } from '@operato/shell'\nimport { CommonButtonStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { openTrainingAttendanceForm } from '../components/training-attendance-form.js'\nimport { openTrainingSessionForm } from '../components/training-session-form.js'\nimport { openTrainingSettingForm } from '../components/training-setting-form.js'\nimport { COMPLETION_STATUSES, TRAINING_KINDS, TRAINING_METHODS, TRAINING_STATES, trainingOptions, trainingWord } from '../training-words.js'\nimport { failureOf } from '../words.js'\n\ntype View = 'settings' | 'standings' | 'sessions' | 'completions'\n\nconst VIEWS: View[] = ['settings', 'standings', 'sessions', 'completions']\nconst blankFirst = (options: { value: string; display: string }[]) => [{ value: '', display: '' }, ...options]\n\n/**\n * 법정 의무 교육 (ADR-0187 decisions 15-19) - one screen read four ways, as the audit screen is: the kinds the domain\n * trains, where everyone stands this year, the sessions given, and the completions with their certificates. The kinds\n * are set in their form, a session is opened in its own, a certificate is confirmed or returned here. Nothing is deleted.\n */\n@customElement('training-list')\nexport class TrainingList extends localize(i18next)(PageView) {\n static styles = [\n WorkSurfacePageStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n .filters {\n flex-wrap: wrap;\n }\n input[type='number'] {\n width: 80px;\n height: var(--context-action-height, 28px);\n box-sizing: border-box;\n border: 1px solid var(--md-sys-color-outline-variant);\n border-radius: var(--md-sys-shape-corner-small, 4px);\n background: var(--md-sys-color-surface-container-lowest);\n color: var(--md-sys-color-on-surface);\n font: inherit;\n padding: 0 var(--spacing-small, 4px);\n }\n `\n ]\n\n @state() private view: View = 'settings'\n @state() private year = new Date().getFullYear()\n @query('ox-grist') private grist!: DataGrist\n\n get context() {\n const t = i18next.t.bind(i18next)\n const actions: Record<View, any[]> = {\n settings: [\n { title: t('button.training-setting'), icon: 'tune', action: () => this.setting() },\n { title: t('button.training-open-year'), icon: 'assignment_add', action: () => this.openYear() }\n ],\n standings: [],\n sessions: [\n { title: t('button.training-session-open'), icon: 'event', action: () => this.openSession() },\n { title: t('button.training-attendance-record'), icon: 'how_to_reg', action: () => this.attendance() },\n { title: t('button.save'), action: () => this.save(), ...CommonButtonStyles.save }\n ],\n completions: [\n { title: t('button.training-confirm'), icon: 'task_alt', action: () => this.confirm() },\n { title: t('button.training-return'), icon: 'undo', action: () => this.return() }\n ]\n }\n return {\n title: t('title.training-list'),\n search: this.view === 'settings' ? undefined : { handler: (search: string) => (this.grist.searchText = search), value: this.grist?.searchText || '' },\n filter: { handler: () => this.grist.toggleHeadroom() },\n actions: actions[this.view],\n exportable: { name: t('title.training-list'), data: () => this.grist.exportRecords() }\n }\n }\n\n render() {\n return html`${keyed(\n this.view,\n html`<ox-grist class=\"page-fill\" search-mode=\"term\" .mode=${isMobileDevice() ? 'CARD' : 'GRID'} .config=${this.configOf(this.view)} .fetchHandler=${this.fetchHandler.bind(this)}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-input-select-buttons\n .options=${VIEWS.map(view => ({ value: view, display: i18next.t(`text.training-view-${view}`) }))}\n .value=${this.view}\n @change=${(e: CustomEvent) => (e.detail ? this.show(e.detail) : ((e.target as any).value = this.view))}\n ></ox-input-select-buttons>\n ${this.view === 'settings'\n ? ''\n : html`<input type=\"number\" min=\"2000\" max=\"2999\" aria-label=${i18next.t('field.training-year')} .value=${String(this.year)} @change=${(e: any) => this.pickYear(e)} />`}\n <ox-filters-form without-search></ox-filters-form>\n </div>\n </div>\n </ox-grist>`\n )}`\n }\n\n private show(view: View) {\n this.view = view\n this.updateContext()\n }\n\n private pickYear(e: any) {\n const year = Number(e.target.value)\n if (!Number.isInteger(year) || year < 2000 || year > 2999) return (e.target.value = String(this.year))\n this.year = year\n this.grist.fetch()\n }\n\n private configOf(view: View) {\n const t = i18next.t.bind(i18next)\n const shown = (name: string, width: number, renderer?: (value: any, column: any, record: any) => any, extra: any = {}) => ({\n type: 'string',\n name,\n header: t(`field.training-${name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()}`),\n width,\n sortable: false,\n ...extra,\n record: { renderer, ...extra.record }\n })\n const select = (set: 'kind' | 'method' | 'state' | 'status', codes: string[]) => ({ type: 'select', filter: { type: 'select', operator: 'eq', options: blankFirst(trainingOptions(set, codes)) } })\n const center = { record: { align: 'center' } }\n const base = {\n rows: { appendable: false, selectable: { multiple: view === 'completions' } },\n pagination: view === 'settings' ? { infinite: true } : { limit: 100, pages: [50, 100] }\n }\n const gutters = [{ type: 'gutter', gutterName: 'sequence' }, { type: 'gutter', gutterName: 'row-selector', multiple: view === 'completions' }]\n switch (view) {\n case 'settings':\n return {\n ...base,\n list: { fields: ['code', 'enabled', 'dueDay'] },\n columns: [\n ...gutters,\n shown('code', 180, value => trainingWord('kind', value)),\n shown('enabled', 70, value => t(value ? 'text.training-on' : 'text.training-off'), center),\n shown('dueDay', 80, undefined, center),\n shown('audiences', 200, value => (value?.length ? value.map((one: any) => one.targetName ?? one.targetId).join(', ') : t('text.training-whole-domain'))),\n shown('basis', 240),\n shown('retentionYears', 80, value => t('text.training-retention', { years: value }), center),\n shown('memo', 240)\n ]\n }\n case 'standings':\n return {\n ...base,\n list: { fields: ['employee', 'kind', 'state'] },\n columns: [\n ...gutters,\n shown('employee', 120, value => value?.name ?? ''),\n shown('departmentName', 120),\n shown('kind', 180, value => trainingWord('kind', value), select('kind', TRAINING_KINDS)),\n shown('dueOn', 100, undefined, center),\n shown('state', 90, value => trainingWord('state', value), select('state', TRAINING_STATES)),\n shown('completedOn', 100, undefined, center)\n ]\n }\n case 'sessions':\n return {\n ...base,\n list: { fields: ['startsOn', 'name', 'kind'] },\n columns: [\n ...gutters,\n shown('startsOn', 100, undefined, { sortable: true, ...center }),\n shown('endsOn', 100, undefined, center),\n shown('kind', 180, value => trainingWord('kind', value), select('kind', TRAINING_KINDS)),\n { type: 'string', name: 'name', header: t('field.training-session-name'), width: 200, record: { editable: true } },\n shown('method', 100, value => trainingWord('method', value), select('method', TRAINING_METHODS)),\n { type: 'string', name: 'instructor', header: t('field.training-instructor'), width: 120, record: { editable: true } },\n { type: 'string', name: 'organisation', header: t('field.training-organisation'), width: 140, record: { editable: true } },\n { type: 'string', name: 'notes', header: t('field.training-notes'), width: 200, record: { editable: true } }\n ]\n }\n case 'completions':\n return {\n ...base,\n list: { fields: ['employee', 'kind', 'status'] },\n columns: [\n ...gutters,\n shown('employee', 120, value => value?.name ?? ''),\n shown('kind', 180, value => trainingWord('kind', value), select('kind', TRAINING_KINDS)),\n shown('completedOn', 100, undefined, { sortable: true, ...center }),\n shown('method', 100, value => trainingWord('method', value)),\n shown('session', 160, value => value?.name ?? ''),\n shown('organisation', 140),\n shown('status', 90, value => trainingWord('status', value), select('status', COMPLETION_STATUSES)),\n shown('certificates', 160, (_, __, record) => (record.attachments ?? []).map((one: any) => one.name).join(', ')),\n shown('returnReason', 180),\n shown('decidedBy', 90, value => value?.name ?? '')\n ]\n }\n }\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [], search }: FetchOption) {\n const view = this.view\n const list = { filters: [...filters, ...(view === 'settings' ? [] : [{ name: 'year', operator: 'eq', value: this.year }])], pagination: { page, limit }, sortings, search: search?.trim() || undefined }\n const queries: Record<View, any> = {\n settings: gql`\n query {\n responses: trainingKinds { code basis cycle audience defaultOn retentionYears toConfirm enabled dueDay memo set audiences { scope targetId targetName } }\n }\n `,\n standings: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {\n responses: trainingStandings(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {\n items { id kind year dueOn state completedOn departmentName employee { id name } }\n total\n }\n }\n `,\n sessions: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {\n responses: trainingSessions(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {\n items { id kind year name method startsOn endsOn instructor organisation notes }\n total\n }\n }\n `,\n completions: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {\n responses: trainingCompletions(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {\n items {\n id kind year completedOn method organisation status returnReason\n employee { id name } session { id name } decidedBy { id name } attachments { id name path }\n }\n total\n }\n }\n `\n }\n const response = await client.query({ query: queries[view], variables: view === 'settings' ? {} : list, fetchPolicy: 'network-only' })\n if (response.errors?.length) throw response\n const answer = response.data.responses\n return view === 'settings' ? { total: answer.length, records: answer.map((one: any) => ({ ...one, id: one.code })) } : { total: answer.total, records: answer.items }\n }\n\n private picked(): any {\n const [one] = this.grist.selected\n if (!one) notify({ level: 'warn', message: i18next.t('text.training-pick-one') })\n return one\n }\n\n private async setting() {\n const kind = this.picked()\n if (kind && (await openTrainingSettingForm(kind))) this.grist.fetch()\n }\n\n private async openYear() {\n const kind = this.picked()\n if (!kind) return\n if (!kind.enabled) return notify({ level: 'warn', message: i18next.t('text.training-turn-on-first') })\n const confirmed = await OxPrompt.open({\n title: i18next.t('button.training-open-year'),\n text: i18next.t('text.training-open-year-confirm', { kind: trainingWord('kind', kind.code), year: this.year }),\n confirmButton: { text: i18next.t('button.training-open-year') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (!confirmed) return\n await this.call([() => client.mutate({ mutation: gql`mutation ($kind: String!, $year: Int!) { openTrainingYear(kind: $kind, year: $year) { people done handedOut } }`, variables: { kind: kind.code, year: this.year } })], data =>\n String(i18next.t('text.training-year-opened', data.openTrainingYear))\n )\n }\n\n private async openSession() {\n const response = await client.query({ query: gql`query { trainingKinds { code enabled } }`, fetchPolicy: 'network-only' })\n const kinds = (response.data?.trainingKinds ?? []).filter((one: any) => one.enabled).map((one: any) => one.code)\n if (await openTrainingSessionForm(kinds, this.year)) this.grist.fetch()\n }\n\n private async attendance() {\n const session = this.picked()\n if (session && (await openTrainingAttendanceForm(session))) this.grist.fetch()\n }\n\n private async confirm() {\n const ids = this.grist.selected.filter((one: any) => one.status === 'SUBMITTED').map((one: any) => one.id)\n if (!ids.length) return notify({ level: 'warn', message: i18next.t('text.training-pick-submitted') })\n await this.call([() => client.mutate({ mutation: gql`mutation ($ids: [String!]!) { confirmTrainingCompletions(ids: $ids) { id } }`, variables: { ids } })])\n }\n\n private async return() {\n const [one] = this.grist.selected.filter((row: any) => row.status === 'SUBMITTED')\n if (!one) return notify({ level: 'warn', message: i18next.t('text.training-pick-submitted') })\n const reason = await OxPrompt.prompt({ title: i18next.t('button.training-return'), text: i18next.t('field.training-return-reason'), multiline: true })\n if (reason === null) return\n await this.call([() => client.mutate({ mutation: gql`mutation ($id: String!, $reason: String!) { returnTrainingCompletion(id: $id, reason: $reason) { id } }`, variables: { id: one.id, reason } })])\n }\n\n /** What sessions say - the grid writes the name, instructor, organisation and notes. */\n private async save() {\n const patches = this.grist.dirtyRecords\n .filter((one: any) => one.id)\n .map((one: any) => ({ id: one.id, cuFlag: 'M', ...Object.fromEntries(Object.keys(one.__dirtyfields__ ?? {}).map(field => [field, one[field] === '' ? null : one[field]])) }))\n if (!patches.length) return\n await this.call([() => client.mutate({ mutation: gql`mutation ($patches: [TrainingSessionPatch!]!) { updateMultipleTrainingSession(patches: $patches) { id } }`, variables: { patches } })])\n }\n\n private async call(calls: (() => Promise<any>)[], said?: (data: any) => string) {\n try {\n let data: any\n for (const one of calls) {\n const response = await one()\n if (response.errors?.length) throw response\n data = response.data\n }\n notify({ message: said ? said(data) : i18next.t('text.training-saved') })\n } catch (error) {\n notify({ level: 'error', message: failureOf(error) })\n }\n this.grist.fetch()\n }\n}\n"]}
1
+ {"version":3,"file":"training-list.js","sourceRoot":"","sources":["../../client/pages/training-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '@operato/input/ox-input-select-buttons.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { keyed } from 'lit/directives/keyed.js'\n\nimport { convertListParamToSearchString, DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } 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 } from '@operato/shell'\nimport { CommonButtonStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { openTrainingAttendanceForm } from '../components/training-attendance-form.js'\nimport { openTrainingSessionForm } from '../components/training-session-form.js'\nimport { openTrainingSettingForm } from '../components/training-setting-form.js'\nimport { COMPLETION_STATUSES, TRAINING_KINDS, TRAINING_METHODS, TRAINING_STATES, trainingOptions, trainingWord } from '../training-words.js'\nimport { failureOf } from '../words.js'\n\ntype View = 'settings' | 'standings' | 'sessions' | 'completions'\n\nconst VIEWS: View[] = ['settings', 'standings', 'sessions', 'completions']\nconst blankFirst = (options: { value: string; display: string }[]) => [{ value: '', display: '' }, ...options]\n\n/**\n * The training year the grid's `year` filter names, else this year - a year the list reads by, never none. A value\n * outside 2000-2999 is no year (`valid: false`), and the list reads this year. Pure.\n */\nexport function trainingYearOf(filters: readonly { name: string; value?: any }[] | undefined, now = new Date()): { year: number; valid: boolean } {\n const chosen = filters?.find(one => one.name === 'year')?.value\n if (chosen === undefined || chosen === null || chosen === '') return { year: now.getFullYear(), valid: true }\n const year = Number(chosen)\n return Number.isInteger(year) && year >= 2000 && year <= 2999 ? { year, valid: true } : { year: now.getFullYear(), valid: false }\n}\n\n/**\n * 법정 의무 교육 (ADR-0187 decisions 15-19) - one screen read four ways, as the audit screen is: the kinds the domain\n * trains, where everyone stands this year, the sessions given, and the completions with their certificates. The kinds\n * are set in their form, a session is opened in its own, a certificate is confirmed or returned here. Nothing is deleted.\n */\n@customElement('training-list')\nexport class TrainingList extends localize(i18next)(PageView) {\n static styles = [\n WorkSurfacePageStyles,\n CommonGristStyles,\n CommonHeaderStyles,\n ScrollbarStyles,\n css`\n .filters {\n flex-wrap: wrap;\n }\n `\n ]\n\n /*\n * The view is a different list (kinds, standings, sessions, completions - each its own entity), so it stays the\n * page's and the address's `view`. What narrows a list - the year, the column filters, search, sort, page - is the\n * grid's, kept in the address (FOOTER-BUTTON-REVIEW G09): a shared link, coming back and reloading read the same list.\n */\n @state() private view: View = 'settings'\n @state() private gristConfig: any\n @query('ox-grist') private grist!: DataGrist\n\n /** The year the list reads by and the year actions open - the grid's `year` filter. */\n private get year() {\n return trainingYearOf(this.grist?.filters).year\n }\n\n get context() {\n const t = i18next.t.bind(i18next)\n const actions: Record<View, any[]> = {\n settings: [\n { title: t('button.training-setting'), icon: 'tune', action: () => this.setting() },\n { title: t('button.training-open-year'), icon: 'assignment_add', action: () => this.openYear() }\n ],\n standings: [],\n sessions: [\n { title: t('button.training-session-open'), icon: 'event', action: () => this.openSession() },\n { title: t('button.training-attendance-record'), icon: 'how_to_reg', action: () => this.attendance() },\n { title: t('button.save'), action: () => this.save(), ...CommonButtonStyles.save }\n ],\n completions: [\n { title: t('button.training-confirm'), icon: 'task_alt', action: () => this.confirm() },\n { title: t('button.training-return'), icon: 'undo', action: () => this.return() }\n ]\n }\n return {\n title: t('title.training-list'),\n search: this.view === 'settings' ? undefined : { handler: (search: string) => (this.grist.searchText = search), value: this.grist?.searchText || '' },\n filter: { handler: () => this.grist.toggleHeadroom() },\n actions: actions[this.view],\n exportable: { name: t('title.training-list'), data: () => this.grist.exportRecords() }\n }\n }\n\n render() {\n return html`${keyed(\n this.view,\n html`<ox-grist class=\"page-fill\" search-mode=\"term\" .mode=${isMobileDevice() ? 'CARD' : 'GRID'} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)} ?url-params-sensitive=${this.active}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\">\n <ox-input-select-buttons\n .options=${VIEWS.map(view => ({ value: view, display: i18next.t(`text.training-view-${view}`) }))}\n .value=${this.view}\n @change=${(e: CustomEvent) => (e.detail ? this.show(e.detail) : ((e.target as any).value = this.view))}\n ></ox-input-select-buttons>\n <ox-filters-form without-search></ox-filters-form>\n </div>\n </div>\n </ox-grist>`\n )}`\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active) return\n const asked = lifecycle?.params?.view\n const view: View = VIEWS.includes(asked) ? asked : 'settings'\n if (view === this.view && this.gristConfig) return\n this.view = view\n this.gristConfig = this.configOf(view)\n this.updateContext()\n }\n\n /** Another view is another list: its address keeps the year chosen and drops the other list's conditions. */\n private show(view: View) {\n if (view === this.view) return\n const year = this.grist?.filters?.find((one: any) => one.name === 'year')\n const search = convertListParamToSearchString({ filters: year ? [year] : undefined, base: view === 'settings' ? '' : `view=${view}` })\n navigate(search ? `training-list?${search}` : 'training-list')\n }\n\n private configOf(view: View) {\n const t = i18next.t.bind(i18next)\n const shown = (name: string, width: number, renderer?: (value: any, column: any, record: any) => any, extra: any = {}) => ({\n type: 'string',\n name,\n header: t(`field.training-${name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()}`),\n width,\n sortable: false,\n ...extra,\n record: { renderer, ...extra.record }\n })\n const select = (set: 'kind' | 'method' | 'state' | 'status', codes: string[]) => ({ type: 'select', filter: { type: 'select', operator: 'eq', options: blankFirst(trainingOptions(set, codes)) } })\n const center = { record: { align: 'center' } }\n const base = {\n rows: { appendable: false, selectable: { multiple: view === 'completions' } },\n pagination: view === 'settings' ? { infinite: true } : { limit: 100, pages: [50, 100] }\n }\n /*\n * The year narrows every list but the kinds; there it is not shown and only names the year 「연도 열기」 opens.\n * It is a filter of its own, on no column shown.\n */\n const year = {\n type: 'integer',\n name: 'year',\n header: t('field.training-year'),\n hidden: true,\n record: { editable: false },\n filter: { type: 'number', operator: 'eq', value: new Date().getFullYear(), ...(view === 'settings' ? { hidden: true } : {}) }\n }\n const gutters = [{ type: 'gutter', gutterName: 'sequence' }, { type: 'gutter', gutterName: 'row-selector', multiple: view === 'completions' }, year]\n switch (view) {\n case 'settings':\n return {\n ...base,\n list: { fields: ['code', 'enabled', 'dueDay'] },\n columns: [\n ...gutters,\n shown('code', 180, value => trainingWord('kind', value)),\n shown('enabled', 70, value => t(value ? 'text.training-on' : 'text.training-off'), center),\n shown('dueDay', 80, undefined, center),\n shown('audiences', 200, value => (value?.length ? value.map((one: any) => one.targetName ?? one.targetId).join(', ') : t('text.training-whole-domain'))),\n shown('basis', 240),\n shown('retentionYears', 80, value => t('text.training-retention', { years: value }), center),\n shown('memo', 240)\n ]\n }\n case 'standings':\n return {\n ...base,\n list: { fields: ['employee', 'kind', 'state'] },\n columns: [\n ...gutters,\n shown('employee', 120, value => value?.name ?? ''),\n shown('departmentName', 120),\n shown('kind', 180, value => trainingWord('kind', value), select('kind', TRAINING_KINDS)),\n shown('dueOn', 100, undefined, center),\n shown('state', 90, value => trainingWord('state', value), select('state', TRAINING_STATES)),\n shown('completedOn', 100, undefined, center)\n ]\n }\n case 'sessions':\n return {\n ...base,\n list: { fields: ['startsOn', 'name', 'kind'] },\n columns: [\n ...gutters,\n shown('startsOn', 100, undefined, { sortable: true, ...center }),\n shown('endsOn', 100, undefined, center),\n shown('kind', 180, value => trainingWord('kind', value), select('kind', TRAINING_KINDS)),\n { type: 'string', name: 'name', header: t('field.training-session-name'), width: 200, record: { editable: true } },\n shown('method', 100, value => trainingWord('method', value), select('method', TRAINING_METHODS)),\n shown('course', 160, value => value?.name ?? ''),\n { type: 'string', name: 'instructor', header: t('field.training-instructor'), width: 120, record: { editable: true } },\n { type: 'string', name: 'organisation', header: t('field.training-organisation'), width: 140, record: { editable: true } },\n { type: 'string', name: 'notes', header: t('field.training-notes'), width: 200, record: { editable: true } }\n ]\n }\n case 'completions':\n return {\n ...base,\n list: { fields: ['employee', 'kind', 'status'] },\n columns: [\n ...gutters,\n shown('employee', 120, value => value?.name ?? ''),\n shown('kind', 180, value => trainingWord('kind', value), select('kind', TRAINING_KINDS)),\n shown('completedOn', 100, undefined, { sortable: true, ...center }),\n shown('method', 100, value => trainingWord('method', value)),\n shown('session', 160, value => value?.name ?? ''),\n shown('organisation', 140),\n shown('status', 90, value => trainingWord('status', value), select('status', COMPLETION_STATUSES)),\n shown('certificates', 160, (_, __, record) => (record.attachments ?? []).map((one: any) => one.name).join(', ')),\n shown('returnReason', 180),\n shown('decidedBy', 90, value => value?.name ?? '')\n ]\n }\n }\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [], search }: FetchOption) {\n const view = this.view\n /* The server reads one year, a number; a year outside the range reads this year and says so. */\n const { year, valid } = trainingYearOf(filters)\n if (!valid) notify({ level: 'warn', message: i18next.t('error.training-year-invalid') })\n const list = { filters: [...filters.filter(one => one.name !== 'year'), { name: 'year', operator: 'eq', value: year }], pagination: { page, limit }, sortings, search: search?.trim() || undefined }\n const queries: Record<View, any> = {\n settings: gql`\n query {\n responses: trainingKinds { code basis cycle audience defaultOn retentionYears toConfirm enabled dueDay memo set audiences { scope targetId targetName } }\n }\n `,\n standings: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {\n responses: trainingStandings(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {\n items { id kind year dueOn state completedOn departmentName employee { id name } }\n total\n }\n }\n `,\n sessions: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {\n responses: trainingSessions(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {\n items { id kind year name method startsOn endsOn instructor organisation notes course { id name } }\n total\n }\n }\n `,\n completions: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {\n responses: trainingCompletions(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {\n items {\n id kind year completedOn method organisation status returnReason\n employee { id name } session { id name } decidedBy { id name } attachments { id name path }\n }\n total\n }\n }\n `\n }\n const response = await client.query({ query: queries[view], variables: view === 'settings' ? {} : list, fetchPolicy: 'network-only' })\n if (response.errors?.length) throw response\n const answer = response.data.responses\n return view === 'settings' ? { total: answer.length, records: answer.map((one: any) => ({ ...one, id: one.code })) } : { total: answer.total, records: answer.items }\n }\n\n private picked(): any {\n const [one] = this.grist.selected\n if (!one) notify({ level: 'warn', message: i18next.t('text.training-pick-one') })\n return one\n }\n\n private async setting() {\n const kind = this.picked()\n if (kind && (await openTrainingSettingForm(kind))) this.grist.fetch()\n }\n\n private async openYear() {\n const kind = this.picked()\n if (!kind) return\n if (!kind.enabled) return notify({ level: 'warn', message: i18next.t('text.training-turn-on-first') })\n const confirmed = await OxPrompt.open({\n title: i18next.t('button.training-open-year'),\n text: i18next.t('text.training-open-year-confirm', { kind: trainingWord('kind', kind.code), year: this.year }),\n confirmButton: { text: i18next.t('button.training-open-year') },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (!confirmed) return\n await this.call([() => client.mutate({ mutation: gql`mutation ($kind: String!, $year: Int!) { openTrainingYear(kind: $kind, year: $year) { people done handedOut } }`, variables: { kind: kind.code, year: this.year } })], data =>\n String(i18next.t('text.training-year-opened', data.openTrainingYear))\n )\n }\n\n private async openSession() {\n const response = await client.query({ query: gql`query { trainingKinds { code enabled } }`, fetchPolicy: 'network-only' })\n const kinds = (response.data?.trainingKinds ?? []).filter((one: any) => one.enabled).map((one: any) => one.code)\n if (await openTrainingSessionForm(kinds, this.year)) this.grist.fetch()\n }\n\n private async attendance() {\n const session = this.picked()\n if (session && (await openTrainingAttendanceForm(session))) this.grist.fetch()\n }\n\n private async confirm() {\n const ids = this.grist.selected.filter((one: any) => one.status === 'SUBMITTED').map((one: any) => one.id)\n if (!ids.length) return notify({ level: 'warn', message: i18next.t('text.training-pick-submitted') })\n await this.call([() => client.mutate({ mutation: gql`mutation ($ids: [String!]!) { confirmTrainingCompletions(ids: $ids) { id } }`, variables: { ids } })])\n }\n\n private async return() {\n const [one] = this.grist.selected.filter((row: any) => row.status === 'SUBMITTED')\n if (!one) return notify({ level: 'warn', message: i18next.t('text.training-pick-submitted') })\n const reason = await OxPrompt.prompt({ title: i18next.t('button.training-return'), text: i18next.t('field.training-return-reason'), multiline: true })\n if (reason === null) return\n await this.call([() => client.mutate({ mutation: gql`mutation ($id: String!, $reason: String!) { returnTrainingCompletion(id: $id, reason: $reason) { id } }`, variables: { id: one.id, reason } })])\n }\n\n /** What sessions say - the grid writes the name, instructor, organisation and notes. */\n private async save() {\n const patches = this.grist.dirtyRecords\n .filter((one: any) => one.id)\n .map((one: any) => ({ id: one.id, cuFlag: 'M', ...Object.fromEntries(Object.keys(one.__dirtyfields__ ?? {}).map(field => [field, one[field] === '' ? null : one[field]])) }))\n if (!patches.length) return notify({ level: 'info', message: i18next.t('text.compliance-nothing-to-save') })\n await this.call([() => client.mutate({ mutation: gql`mutation ($patches: [TrainingSessionPatch!]!) { updateMultipleTrainingSession(patches: $patches) { id } }`, variables: { patches } })])\n }\n\n private async call(calls: (() => Promise<any>)[], said?: (data: any) => string) {\n try {\n let data: any\n for (const one of calls) {\n const response = await one()\n if (response.errors?.length) throw response\n data = response.data\n }\n notify({ message: said ? said(data) : i18next.t('text.training-saved') })\n } catch (error) {\n notify({ level: 'error', message: failureOf(error) })\n }\n this.grist.fetch()\n }\n}\n"]}