@things-factory/calendar 10.1.254 → 10.1.257

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,7 +10,8 @@ export declare class CalendarDaysOffPage extends CalendarDaysOffPage_base {
10
10
  static styles: import("lit").CSSResult[];
11
11
  gristConfig: any;
12
12
  private calendarId;
13
- private calendarName;
13
+ private calendar;
14
+ private get calendarName();
14
15
  private grist;
15
16
  get context(): {
16
17
  title: string;
@@ -5,7 +5,7 @@ import { PageView } from '@operato/shell';
5
5
  import { html } from 'lit';
6
6
  import { customElement, property, query, state } from 'lit/decorators.js';
7
7
  import { DataGrist } from '@operato/data-grist';
8
- import { client } from '@operato/graphql';
8
+ import { client, QueryController } from '@operato/graphql';
9
9
  import { i18next, localize } from '@operato/i18n';
10
10
  import { notify } from '@operato/layout';
11
11
  import gql from 'graphql-tag';
@@ -21,9 +21,19 @@ let CalendarDaysOffPage = class CalendarDaysOffPage extends localize(i18next)(Pa
21
21
  constructor() {
22
22
  super(...arguments);
23
23
  this.calendarId = '';
24
- this.calendarName = '';
24
+ /* The name of the calendar the address names, for the title (ADR-0190). */
25
+ this.calendar = new QueryController(this, gql `
26
+ query ($id: String!) {
27
+ calendar(id: $id) {
28
+ name
29
+ }
30
+ }
31
+ `, { variables: () => (this.calendarId ? { id: this.calendarId } : undefined) });
25
32
  }
26
33
  static { this.styles = [WorkSurfacePageStyles, ScrollbarStyles, CommonGristStyles]; }
34
+ get calendarName() {
35
+ return this.calendar.data?.calendar?.name ?? '';
36
+ }
27
37
  get context() {
28
38
  return {
29
39
  title: this.calendarName ? `${i18next.t('title.calendar-days-off')} · ${this.calendarName}` : i18next.t('title.calendar-days-off'),
@@ -57,32 +67,17 @@ let CalendarDaysOffPage = class CalendarDaysOffPage extends localize(i18next)(Pa
57
67
  rows: { selectable: { multiple: true } },
58
68
  pagination: { infinite: true }
59
69
  };
60
- await this.open(lifecycle?.params?.calendar || '');
70
+ this.open(lifecycle?.params?.calendar || '');
61
71
  }
62
72
  async pageUpdated(changes, lifecycle) {
63
73
  if (!this.active || !changes.params)
64
74
  return;
65
75
  const calendarId = lifecycle?.params?.calendar || '';
66
76
  if (calendarId !== this.calendarId)
67
- await this.open(calendarId);
77
+ this.open(calendarId);
68
78
  }
69
- async open(calendarId) {
79
+ open(calendarId) {
70
80
  this.calendarId = calendarId;
71
- this.calendarName = '';
72
- if (calendarId) {
73
- const response = await client.query({
74
- query: gql `
75
- query ($id: String!) {
76
- calendar(id: $id) {
77
- name
78
- }
79
- }
80
- `,
81
- variables: { id: calendarId }
82
- });
83
- this.calendarName = response.data?.calendar?.name ?? '';
84
- }
85
- this.updateContext();
86
81
  this.grist?.fetch();
87
82
  }
88
83
  async fetchHandler() {
@@ -146,10 +141,6 @@ __decorate([
146
141
  state(),
147
142
  __metadata("design:type", Object)
148
143
  ], CalendarDaysOffPage.prototype, "calendarId", void 0);
149
- __decorate([
150
- state(),
151
- __metadata("design:type", Object)
152
- ], CalendarDaysOffPage.prototype, "calendarName", void 0);
153
144
  __decorate([
154
145
  query('ox-grist'),
155
146
  __metadata("design:type", DataGrist)
@@ -1 +1 @@
1
- {"version":3,"file":"calendar-days-off-page.js","sourceRoot":"","sources":["../../../client/pages/calendar/calendar-days-off-page.ts"],"names":[],"mappings":";AAAA,OAAO,qBAAqB,CAAA;AAE5B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC/G,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,OAAO,GAAG,MAAM,aAAa,CAAA;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,kGAAkG;AAClG,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAE5B;;;;GAIG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;IAA7D;;QAKY,eAAU,GAAG,EAAE,CAAA;QACf,iBAAY,GAAG,EAAE,CAAA;IAsHpC,CAAC;aA3HQ,WAAM,GAAG,CAAC,qBAAqB,EAAE,eAAe,EAAE,iBAAiB,CAAC,AAA9D,CAA8D;IAS3E,IAAI,OAAO;QACT,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;YAClI,IAAI,EAAE,mBAAmB;YACzB,4DAA4D;YAC5D,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,kBAAkB,CAAC,IAAI,EAAE;gBAC7F,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,kBAAkB,CAAC,MAAM,EAAE;aACpG;SACF,CAAA;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA,mDAAmD,IAAI,CAAC,WAAW,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAA;IAC5I,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAc;QAClC,IAAI,CAAC,WAAW,GAAG;YACjB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC9D,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC1H,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBACjI;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE;oBAChG,KAAK,EAAE,GAAG;iBACX;aACF;YACD,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YACxC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC/B,CAAA;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAY,EAAE,SAAc;QAC5C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAM;QAC3C,MAAM,UAAU,GAAG,SAAS,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAA;QACpD,IAAI,UAAU,KAAK,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACjE,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,UAAkB;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAA;QACtB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;gBAClC,KAAK,EAAE,GAAG,CAAA;;;;;;SAMT;gBACD,SAAS,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE;aAC9B,CAAC,CAAA;YACF,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAA;QACzD,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAA;QACpB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;QACtD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,GAAG,CAAA;;;;;;;;;OAST;YACD,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1C,WAAW,EAAE,UAAU;SACxB,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,eAAe,IAAI,EAAE,CAAA;QACpD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAA;IAC3C,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,OAAc;QAChC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;;;OAIZ;YACD,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE;SACpD,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE;YAC/D,MAAM,KAAK,GAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;YAC/E,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,eAAe;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,CAAA;YAC/F,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;QACF,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAC9I,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACzE,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC;YAAE,OAAM;QAClD,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACnK,CAAC;;AAxH2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;wDAAiB;AAE3B;IAAhB,KAAK,EAAE;;uDAAwB;AACf;IAAhB,KAAK,EAAE;;yDAA0B;AAEP;IAA1B,KAAK,CAAC,UAAU,CAAC;8BAAiB,SAAS;kDAAA;AARjC,mBAAmB;IAD/B,aAAa,CAAC,wBAAwB,CAAC;GAC3B,mBAAmB,CA4H/B","sourcesContent":["import '@operato/data-grist'\n\nimport { CommonButtonStyles, CommonGristStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { DataGrist } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\n\nimport gql from 'graphql-tag'\n\nimport { sureToDelete } from '../sure-to-delete'\n\n/** The longest day off one row holds - the server's DAYS_OFF_MAX_SPAN, said next to the field. */\nconst DAYS_OFF_MAX_SPAN = 31\n\n/**\n * A days-off calendar's days (ADR-0179): the company's days off written as rows from one day to another - 창립기념일,\n * 하계 휴무. Each counts at once: leave skips it, the calendars paint it. Opened from the calendar's row; the public\n * holiday calendar is the import's and is read on the event list instead.\n */\n@customElement('calendar-days-off-page')\nexport class CalendarDaysOffPage extends localize(i18next)(PageView) {\n static styles = [WorkSurfacePageStyles, ScrollbarStyles, CommonGristStyles]\n\n @property({ type: Object }) gristConfig: any\n\n @state() private calendarId = ''\n @state() private calendarName = ''\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() {\n return {\n title: this.calendarName ? `${i18next.t('title.calendar-days-off')} · ${this.calendarName}` : i18next.t('title.calendar-days-off'),\n help: 'calendar/calendar',\n /* The days of a calendar - the menu marks the calendars. */\n menu: 'calendar-list',\n actions: [\n { title: i18next.t('button.save'), action: this.save.bind(this), ...CommonButtonStyles.save },\n { title: i18next.t('button.delete'), action: this.delete.bind(this), ...CommonButtonStyles.delete }\n ]\n }\n }\n\n render() {\n return html`<ox-grist class=\"page-fill\" mode=\"GRID\" .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>`\n }\n\n async pageInitialized(lifecycle: any) {\n this.gristConfig = {\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'string', name: 'name', header: i18next.t('field.name'), record: { editable: true, mandatory: true }, width: 200 },\n { type: 'date', name: 'from', header: i18next.t('field.days-off-from'), record: { editable: true, mandatory: true }, width: 130 },\n {\n type: 'date',\n name: 'to',\n header: i18next.t('field.days-off-to'),\n record: { editable: true, hint: i18next.t('text.days-off-to-hint', { max: DAYS_OFF_MAX_SPAN }) },\n width: 130\n }\n ],\n rows: { selectable: { multiple: true } },\n pagination: { infinite: true }\n }\n await this.open(lifecycle?.params?.calendar || '')\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active || !changes.params) return\n const calendarId = lifecycle?.params?.calendar || ''\n if (calendarId !== this.calendarId) await this.open(calendarId)\n }\n\n private async open(calendarId: string) {\n this.calendarId = calendarId\n this.calendarName = ''\n if (calendarId) {\n const response = await client.query({\n query: gql`\n query ($id: String!) {\n calendar(id: $id) {\n name\n }\n }\n `,\n variables: { id: calendarId }\n })\n this.calendarName = response.data?.calendar?.name ?? ''\n }\n this.updateContext()\n this.grist?.fetch()\n }\n\n async fetchHandler() {\n if (!this.calendarId) return { total: 0, records: [] }\n const response = await client.query({\n query: gql`\n query ($calendarId: String!) {\n calendarDaysOff(calendarId: $calendarId) {\n id\n name\n from\n to\n }\n }\n `,\n variables: { calendarId: this.calendarId },\n fetchPolicy: 'no-cache'\n })\n const records = response.data?.calendarDaysOff ?? []\n return { total: records.length, records }\n }\n\n private async write(patches: any[]) {\n const response = await client.mutate({\n mutation: gql`\n mutation ($calendarId: String!, $patches: [DayOffSpanPatch!]!) {\n updateCalendarDaysOff(calendarId: $calendarId, patches: $patches)\n }\n `,\n variables: { calendarId: this.calendarId, patches }\n })\n if (!response.errors) {\n this.grist.fetch()\n return true\n }\n return false\n }\n\n private async save() {\n const patches = (this.grist.dirtyRecords || []).map((row: any) => {\n const patch: any = { cuFlag: row.__dirty__, ...(row.id ? { id: row.id } : {}) }\n for (const key in row.__dirtyfields__) patch[key] = row.__dirtyfields__[key].after || undefined\n return patch\n })\n if (patches.length && (await this.write(patches))) notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.save') }) })\n }\n\n private async delete() {\n const ids = this.grist.selected.map((row: any) => row.id).filter(Boolean)\n if (!ids.length || !(await sureToDelete())) return\n if (await this.write(ids.map((id: string) => ({ id, cuFlag: '-' })))) notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') }) })\n }\n}\n"]}
1
+ {"version":3,"file":"calendar-days-off-page.js","sourceRoot":"","sources":["../../../client/pages/calendar/calendar-days-off-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\n\nimport { CommonButtonStyles, CommonGristStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { PageView } from '@operato/shell'\nimport { html } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { DataGrist } from '@operato/data-grist'\nimport { client, QueryController } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\n\nimport gql from 'graphql-tag'\n\nimport { sureToDelete } from '../sure-to-delete'\n\n/** The longest day off one row holds - the server's DAYS_OFF_MAX_SPAN, said next to the field. */\nconst DAYS_OFF_MAX_SPAN = 31\n\n/**\n * A days-off calendar's days (ADR-0179): the company's days off written as rows from one day to another - 창립기념일,\n * 하계 휴무. Each counts at once: leave skips it, the calendars paint it. Opened from the calendar's row; the public\n * holiday calendar is the import's and is read on the event list instead.\n */\n@customElement('calendar-days-off-page')\nexport class CalendarDaysOffPage extends localize(i18next)(PageView) {\n static styles = [WorkSurfacePageStyles, ScrollbarStyles, CommonGristStyles]\n\n @property({ type: Object }) gristConfig: any\n\n @state() private calendarId = ''\n\n /* The name of the calendar the address names, for the title (ADR-0190). */\n private calendar = new QueryController(\n this,\n gql`\n query ($id: String!) {\n calendar(id: $id) {\n name\n }\n }\n `,\n { variables: () => (this.calendarId ? { id: this.calendarId } : undefined) }\n )\n\n private get calendarName(): string {\n return this.calendar.data?.calendar?.name ?? ''\n }\n\n @query('ox-grist') private grist!: DataGrist\n\n get context() {\n return {\n title: this.calendarName ? `${i18next.t('title.calendar-days-off')} · ${this.calendarName}` : i18next.t('title.calendar-days-off'),\n help: 'calendar/calendar',\n /* The days of a calendar - the menu marks the calendars. */\n menu: 'calendar-list',\n actions: [\n { title: i18next.t('button.save'), action: this.save.bind(this), ...CommonButtonStyles.save },\n { title: i18next.t('button.delete'), action: this.delete.bind(this), ...CommonButtonStyles.delete }\n ]\n }\n }\n\n render() {\n return html`<ox-grist class=\"page-fill\" mode=\"GRID\" .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>`\n }\n\n async pageInitialized(lifecycle: any) {\n this.gristConfig = {\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n { type: 'string', name: 'name', header: i18next.t('field.name'), record: { editable: true, mandatory: true }, width: 200 },\n { type: 'date', name: 'from', header: i18next.t('field.days-off-from'), record: { editable: true, mandatory: true }, width: 130 },\n {\n type: 'date',\n name: 'to',\n header: i18next.t('field.days-off-to'),\n record: { editable: true, hint: i18next.t('text.days-off-to-hint', { max: DAYS_OFF_MAX_SPAN }) },\n width: 130\n }\n ],\n rows: { selectable: { multiple: true } },\n pagination: { infinite: true }\n }\n this.open(lifecycle?.params?.calendar || '')\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active || !changes.params) return\n const calendarId = lifecycle?.params?.calendar || ''\n if (calendarId !== this.calendarId) this.open(calendarId)\n }\n\n private open(calendarId: string) {\n this.calendarId = calendarId\n this.grist?.fetch()\n }\n\n async fetchHandler() {\n if (!this.calendarId) return { total: 0, records: [] }\n const response = await client.query({\n query: gql`\n query ($calendarId: String!) {\n calendarDaysOff(calendarId: $calendarId) {\n id\n name\n from\n to\n }\n }\n `,\n variables: { calendarId: this.calendarId },\n fetchPolicy: 'no-cache'\n })\n const records = response.data?.calendarDaysOff ?? []\n return { total: records.length, records }\n }\n\n private async write(patches: any[]) {\n const response = await client.mutate({\n mutation: gql`\n mutation ($calendarId: String!, $patches: [DayOffSpanPatch!]!) {\n updateCalendarDaysOff(calendarId: $calendarId, patches: $patches)\n }\n `,\n variables: { calendarId: this.calendarId, patches }\n })\n if (!response.errors) {\n this.grist.fetch()\n return true\n }\n return false\n }\n\n private async save() {\n const patches = (this.grist.dirtyRecords || []).map((row: any) => {\n const patch: any = { cuFlag: row.__dirty__, ...(row.id ? { id: row.id } : {}) }\n for (const key in row.__dirtyfields__) patch[key] = row.__dirtyfields__[key].after || undefined\n return patch\n })\n if (patches.length && (await this.write(patches))) notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.save') }) })\n }\n\n private async delete() {\n const ids = this.grist.selected.map((row: any) => row.id).filter(Boolean)\n if (!ids.length || !(await sureToDelete())) return\n if (await this.write(ids.map((id: string) => ({ id, cuFlag: '-' })))) notify({ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') }) })\n }\n}\n"]}