@things-factory/calendar 6.0.45

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 (120) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/assets/images/hatiolab-logo.png +0 -0
  3. package/client/bootstrap.ts +1 -0
  4. package/client/index.ts +0 -0
  5. package/client/pages/attendee/attendee-importer.ts +97 -0
  6. package/client/pages/attendee/attendee-list-page.ts +348 -0
  7. package/client/pages/calendar/calendar-importer.ts +97 -0
  8. package/client/pages/calendar/calendar-list-page.ts +348 -0
  9. package/client/pages/calendar/calendar-page.ts +128 -0
  10. package/client/pages/event/event-importer.ts +97 -0
  11. package/client/pages/event/event-list-page.ts +348 -0
  12. package/client/route.ts +19 -0
  13. package/client/themes/calendar-theme.css +54 -0
  14. package/client/tsconfig.json +11 -0
  15. package/concept.md +31 -0
  16. package/dist-client/bootstrap.d.ts +1 -0
  17. package/dist-client/bootstrap.js +2 -0
  18. package/dist-client/bootstrap.js.map +1 -0
  19. package/dist-client/index.d.ts +0 -0
  20. package/dist-client/index.js +2 -0
  21. package/dist-client/index.js.map +1 -0
  22. package/dist-client/pages/attendee/attendee-importer.d.ts +22 -0
  23. package/dist-client/pages/attendee/attendee-importer.js +100 -0
  24. package/dist-client/pages/attendee/attendee-importer.js.map +1 -0
  25. package/dist-client/pages/attendee/attendee-list-page.d.ts +62 -0
  26. package/dist-client/pages/attendee/attendee-list-page.js +326 -0
  27. package/dist-client/pages/attendee/attendee-list-page.js.map +1 -0
  28. package/dist-client/pages/calendar/calendar-importer.d.ts +22 -0
  29. package/dist-client/pages/calendar/calendar-importer.js +100 -0
  30. package/dist-client/pages/calendar/calendar-importer.js.map +1 -0
  31. package/dist-client/pages/calendar/calendar-list-page.d.ts +62 -0
  32. package/dist-client/pages/calendar/calendar-list-page.js +326 -0
  33. package/dist-client/pages/calendar/calendar-list-page.js.map +1 -0
  34. package/dist-client/pages/calendar/calendar-page.d.ts +26 -0
  35. package/dist-client/pages/calendar/calendar-page.js +128 -0
  36. package/dist-client/pages/calendar/calendar-page.js.map +1 -0
  37. package/dist-client/pages/event/event-importer.d.ts +22 -0
  38. package/dist-client/pages/event/event-importer.js +100 -0
  39. package/dist-client/pages/event/event-importer.js.map +1 -0
  40. package/dist-client/pages/event/event-list-page.d.ts +62 -0
  41. package/dist-client/pages/event/event-list-page.js +326 -0
  42. package/dist-client/pages/event/event-list-page.js.map +1 -0
  43. package/dist-client/route.d.ts +1 -0
  44. package/dist-client/route.js +17 -0
  45. package/dist-client/route.js.map +1 -0
  46. package/dist-client/tsconfig.tsbuildinfo +1 -0
  47. package/dist-server/controllers/index.js +1 -0
  48. package/dist-server/controllers/index.js.map +1 -0
  49. package/dist-server/index.js +7 -0
  50. package/dist-server/index.js.map +1 -0
  51. package/dist-server/middlewares/index.js +8 -0
  52. package/dist-server/middlewares/index.js.map +1 -0
  53. package/dist-server/migrations/index.js +12 -0
  54. package/dist-server/migrations/index.js.map +1 -0
  55. package/dist-server/routes.js +25 -0
  56. package/dist-server/routes.js.map +1 -0
  57. package/dist-server/service/attendee/attendee-mutation.js +124 -0
  58. package/dist-server/service/attendee/attendee-mutation.js.map +1 -0
  59. package/dist-server/service/attendee/attendee-query.js +47 -0
  60. package/dist-server/service/attendee/attendee-query.js.map +1 -0
  61. package/dist-server/service/attendee/attendee-type.js +65 -0
  62. package/dist-server/service/attendee/attendee-type.js.map +1 -0
  63. package/dist-server/service/attendee/attendee.js +46 -0
  64. package/dist-server/service/attendee/attendee.js.map +1 -0
  65. package/dist-server/service/attendee/index.js +10 -0
  66. package/dist-server/service/attendee/index.js.map +1 -0
  67. package/dist-server/service/calendar/calendar-mutation.js +168 -0
  68. package/dist-server/service/calendar/calendar-mutation.js.map +1 -0
  69. package/dist-server/service/calendar/calendar-query.js +97 -0
  70. package/dist-server/service/calendar/calendar-query.js.map +1 -0
  71. package/dist-server/service/calendar/calendar-type.js +86 -0
  72. package/dist-server/service/calendar/calendar-type.js.map +1 -0
  73. package/dist-server/service/calendar/calendar.js +93 -0
  74. package/dist-server/service/calendar/calendar.js.map +1 -0
  75. package/dist-server/service/calendar/index.js +10 -0
  76. package/dist-server/service/calendar/index.js.map +1 -0
  77. package/dist-server/service/event/event-mutation.js +124 -0
  78. package/dist-server/service/event/event-mutation.js.map +1 -0
  79. package/dist-server/service/event/event-query.js +66 -0
  80. package/dist-server/service/event/event-query.js.map +1 -0
  81. package/dist-server/service/event/event-type.js +86 -0
  82. package/dist-server/service/event/event-type.js.map +1 -0
  83. package/dist-server/service/event/event.js +94 -0
  84. package/dist-server/service/event/event.js.map +1 -0
  85. package/dist-server/service/event/index.js +10 -0
  86. package/dist-server/service/event/index.js.map +1 -0
  87. package/dist-server/service/index.js +33 -0
  88. package/dist-server/service/index.js.map +1 -0
  89. package/dist-server/tsconfig.tsbuildinfo +1 -0
  90. package/helps/calendar/attendee.md +160 -0
  91. package/helps/calendar/calendar.md +160 -0
  92. package/helps/calendar/event.md +160 -0
  93. package/package.json +36 -0
  94. package/server/controllers/index.ts +0 -0
  95. package/server/index.ts +4 -0
  96. package/server/middlewares/index.ts +3 -0
  97. package/server/migrations/index.ts +9 -0
  98. package/server/routes.ts +28 -0
  99. package/server/service/attendee/attendee-mutation.ts +122 -0
  100. package/server/service/attendee/attendee-query.ts +31 -0
  101. package/server/service/attendee/attendee-type.ts +44 -0
  102. package/server/service/attendee/attendee.ts +36 -0
  103. package/server/service/attendee/index.ts +7 -0
  104. package/server/service/calendar/calendar-mutation.ts +198 -0
  105. package/server/service/calendar/calendar-query.ts +62 -0
  106. package/server/service/calendar/calendar-type.ts +61 -0
  107. package/server/service/calendar/calendar.ts +82 -0
  108. package/server/service/calendar/index.ts +7 -0
  109. package/server/service/event/event-mutation.ts +125 -0
  110. package/server/service/event/event-query.ts +38 -0
  111. package/server/service/event/event-type.ts +61 -0
  112. package/server/service/event/event.ts +85 -0
  113. package/server/service/event/index.ts +7 -0
  114. package/server/service/index.ts +32 -0
  115. package/server/tsconfig.json +10 -0
  116. package/things-factory.config.js +25 -0
  117. package/translations/en.json +1 -0
  118. package/translations/ko.json +1 -0
  119. package/translations/ms.json +1 -0
  120. package/translations/zh.json +1 -0
@@ -0,0 +1,326 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@operato/data-grist';
3
+ import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles';
4
+ import { PageView, store } from '@operato/shell';
5
+ import { css, html } from 'lit';
6
+ import { customElement, property, query } from 'lit/decorators.js';
7
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
8
+ import { DataGrist } from '@operato/data-grist';
9
+ import { client } from '@operato/graphql';
10
+ import { i18next, localize } from '@operato/i18n';
11
+ import { notify, openPopup } from '@operato/layout';
12
+ import { OxPopup } from '@operato/popup';
13
+ import { isMobileDevice } from '@operato/utils';
14
+ import { connect } from 'pwa-helpers/connect-mixin';
15
+ import gql from 'graphql-tag';
16
+ import { CalendarImporter } from './calendar-importer';
17
+ let CalendarListPage = class CalendarListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
18
+ constructor() {
19
+ super(...arguments);
20
+ this.mode = isMobileDevice() ? 'CARD' : 'GRID';
21
+ }
22
+ static get scopedElements() {
23
+ return {
24
+ 'calendar-importer': CalendarImporter
25
+ };
26
+ }
27
+ get context() {
28
+ return {
29
+ search: {
30
+ handler: (search) => {
31
+ this.grist.searchText = search;
32
+ },
33
+ placeholder: i18next.t('title.calendar list'),
34
+ value: this.grist.searchText
35
+ },
36
+ filter: {
37
+ handler: () => {
38
+ this.grist.toggleHeadroom();
39
+ }
40
+ },
41
+ help: 'calendar/calendar',
42
+ actions: [
43
+ Object.assign({ title: i18next.t('button.save'), action: this._updateCalendar.bind(this) }, CommonButtonStyles.save),
44
+ Object.assign({ title: i18next.t('button.delete'), action: this._deleteCalendar.bind(this) }, CommonButtonStyles.delete)
45
+ ],
46
+ exportable: {
47
+ name: i18next.t('title.calendar list'),
48
+ data: this.exportHandler.bind(this)
49
+ },
50
+ importable: {
51
+ handler: this.importHandler.bind(this)
52
+ }
53
+ };
54
+ }
55
+ render() {
56
+ const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID');
57
+ return html `
58
+ <ox-grist
59
+ .mode=${mode}
60
+ .config=${this.gristConfig}
61
+ .fetchHandler=${this.fetchHandler.bind(this)}
62
+ >
63
+ <div slot="headroom">
64
+ <div id="filters">
65
+ <ox-filters-form autofocus></ox-filters-form>
66
+ </div>
67
+
68
+ <div id="sorters">
69
+ Sort
70
+ <mwc-icon
71
+ @click=${e => {
72
+ const target = e.currentTarget;
73
+ this.sortersControl.open({
74
+ right: 0,
75
+ top: target.offsetTop + target.offsetHeight
76
+ });
77
+ }}
78
+ >expand_more</mwc-icon
79
+ >
80
+ <ox-popup id="sorter-control">
81
+ <ox-sorters-control> </ox-sorters-control>
82
+ </ox-popup>
83
+ </div>
84
+
85
+ <div id="modes">
86
+ <mwc-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</mwc-icon>
87
+ <mwc-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</mwc-icon>
88
+ <mwc-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</mwc-icon>
89
+ </div>
90
+ </div>
91
+ </ox-grist>
92
+ `;
93
+ }
94
+ async pageInitialized(lifecycle) {
95
+ this.gristConfig = {
96
+ list: {
97
+ fields: ['name', 'description'],
98
+ details: ['active', 'updatedAt']
99
+ },
100
+ columns: [
101
+ { type: 'gutter', gutterName: 'sequence' },
102
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
103
+ {
104
+ type: 'string',
105
+ name: 'name',
106
+ header: i18next.t('field.name'),
107
+ record: {
108
+ editable: true
109
+ },
110
+ filter: 'search',
111
+ sortable: true,
112
+ width: 150
113
+ },
114
+ {
115
+ type: 'string',
116
+ name: 'description',
117
+ header: i18next.t('field.description'),
118
+ record: {
119
+ editable: true
120
+ },
121
+ filter: 'search',
122
+ width: 200
123
+ },
124
+ {
125
+ type: 'checkbox',
126
+ name: 'active',
127
+ label: true,
128
+ header: i18next.t('field.active'),
129
+ record: {
130
+ editable: true
131
+ },
132
+ filter: true,
133
+ sortable: true,
134
+ width: 60
135
+ },
136
+ {
137
+ type: 'resource-object',
138
+ name: 'updater',
139
+ header: i18next.t('field.updater'),
140
+ record: {
141
+ editable: false
142
+ },
143
+ sortable: true,
144
+ width: 120
145
+ },
146
+ {
147
+ type: 'datetime',
148
+ name: 'updatedAt',
149
+ header: i18next.t('field.updated_at'),
150
+ record: {
151
+ editable: false
152
+ },
153
+ sortable: true,
154
+ width: 180
155
+ }
156
+ ],
157
+ rows: {
158
+ selectable: {
159
+ multiple: true
160
+ }
161
+ },
162
+ sorters: [
163
+ {
164
+ name: 'name'
165
+ }
166
+ ]
167
+ };
168
+ }
169
+ async pageUpdated(changes, lifecycle) {
170
+ if (this.active) {
171
+ // do something here when this page just became as active
172
+ }
173
+ }
174
+ async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }) {
175
+ const response = await client.query({
176
+ query: gql `
177
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
178
+ responses: calendars(filters: $filters, pagination: $pagination, sortings: $sortings) {
179
+ items {
180
+ id
181
+ name
182
+ description
183
+ active
184
+ updater {
185
+ id
186
+ name
187
+ }
188
+ updatedAt
189
+ }
190
+ total
191
+ }
192
+ }
193
+ `,
194
+ variables: {
195
+ filters,
196
+ pagination: { page, limit },
197
+ sortings
198
+ }
199
+ });
200
+ return {
201
+ total: response.data.responses.total || 0,
202
+ records: response.data.responses.items || []
203
+ };
204
+ }
205
+ async _deleteCalendar() {
206
+ if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
207
+ const ids = this.grist.selected.map(record => record.id);
208
+ if (ids && ids.length > 0) {
209
+ const response = await client.mutate({
210
+ mutation: gql `
211
+ mutation ($ids: [String!]!) {
212
+ deleteCalendars(ids: $ids)
213
+ }
214
+ `,
215
+ variables: {
216
+ ids
217
+ }
218
+ });
219
+ if (!response.errors) {
220
+ this.grist.fetch();
221
+ notify({
222
+ message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })
223
+ });
224
+ }
225
+ }
226
+ }
227
+ }
228
+ async _updateCalendar() {
229
+ let patches = this.grist.dirtyRecords;
230
+ if (patches && patches.length) {
231
+ patches = patches.map(patch => {
232
+ let patchField = patch.id ? { id: patch.id } : {};
233
+ const dirtyFields = patch.__dirtyfields__;
234
+ for (let key in dirtyFields) {
235
+ patchField[key] = dirtyFields[key].after;
236
+ }
237
+ patchField.cuFlag = patch.__dirty__;
238
+ return patchField;
239
+ });
240
+ const response = await client.mutate({
241
+ mutation: gql `
242
+ mutation ($patches: [CalendarPatch!]!) {
243
+ updateMultipleCalendar(patches: $patches) {
244
+ name
245
+ }
246
+ }
247
+ `,
248
+ variables: {
249
+ patches
250
+ }
251
+ });
252
+ if (!response.errors) {
253
+ this.grist.fetch();
254
+ }
255
+ }
256
+ }
257
+ async exportHandler() {
258
+ const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records;
259
+ const targetFieldSet = new Set([
260
+ 'id',
261
+ 'name',
262
+ 'description',
263
+ 'active'
264
+ ]);
265
+ return exportTargets.map(calendar => {
266
+ let tempObj = {};
267
+ for (const field of targetFieldSet) {
268
+ tempObj[field] = calendar[field];
269
+ }
270
+ return tempObj;
271
+ });
272
+ }
273
+ async importHandler(records) {
274
+ const popup = openPopup(html `
275
+ <calendar-importer
276
+ .calendars=${records}
277
+ @imported=${() => {
278
+ history.back();
279
+ this.grist.fetch();
280
+ }}
281
+ ></calendar-importer>
282
+ `, {
283
+ backdrop: true,
284
+ size: 'large',
285
+ title: i18next.t('title.import calendar')
286
+ });
287
+ popup.onclosed = () => {
288
+ this.grist.fetch();
289
+ };
290
+ }
291
+ };
292
+ CalendarListPage.styles = [
293
+ ScrollbarStyles,
294
+ CommonGristStyles,
295
+ css `
296
+ :host {
297
+ display: flex;
298
+
299
+ width: 100%;
300
+
301
+ --grid-record-emphasized-background-color: red;
302
+ --grid-record-emphasized-color: yellow;
303
+ }
304
+ `
305
+ ];
306
+ __decorate([
307
+ property({ type: Object }),
308
+ __metadata("design:type", Object)
309
+ ], CalendarListPage.prototype, "gristConfig", void 0);
310
+ __decorate([
311
+ property({ type: String }),
312
+ __metadata("design:type", String)
313
+ ], CalendarListPage.prototype, "mode", void 0);
314
+ __decorate([
315
+ query('ox-grist'),
316
+ __metadata("design:type", DataGrist)
317
+ ], CalendarListPage.prototype, "grist", void 0);
318
+ __decorate([
319
+ query('#sorter-control'),
320
+ __metadata("design:type", OxPopup)
321
+ ], CalendarListPage.prototype, "sortersControl", void 0);
322
+ CalendarListPage = __decorate([
323
+ customElement('calendar-list-page')
324
+ ], CalendarListPage);
325
+ export { CalendarListPage };
326
+ //# sourceMappingURL=calendar-list-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-list-page.js","sourceRoot":"","sources":["../../../client/pages/calendar/calendar-list-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist'\n\nimport { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView, store } from '@operato/shell'\nimport { css, html } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport {\n ColumnConfig,\n DataGrist,\n FetchOption,\n SortersControl\n} from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify, openPopup } from '@operato/layout'\nimport { OxPopup } from '@operato/popup'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { connect } from 'pwa-helpers/connect-mixin'\nimport gql from 'graphql-tag'\n\nimport { CalendarImporter } from './calendar-importer'\n\n@customElement('calendar-list-page')\nexport class CalendarListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {\n\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: flex;\n\n width: 100%;\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n `\n ]\n\n static get scopedElements() {\n return {\n 'calendar-importer': CalendarImporter\n }\n }\n\n @property({ type: Object }) gristConfig: any\n @property({ type: String }) mode: 'CARD' | 'GRID' | 'LIST' = isMobileDevice() ? 'CARD' : 'GRID'\n\n @query('ox-grist') private grist!: DataGrist\n @query('#sorter-control') private sortersControl!: OxPopup\n\n get context() {\n return {\n search: {\n handler: (search: string) => {\n this.grist.searchText = search\n },\n placeholder: i18next.t('title.calendar list'),\n value: this.grist.searchText\n },\n filter: {\n handler: () => {\n this.grist.toggleHeadroom()\n }\n },\n help: 'calendar/calendar',\n actions: [\n {\n title: i18next.t('button.save'),\n action: this._updateCalendar.bind(this),\n ...CommonButtonStyles.save\n },\n {\n title: i18next.t('button.delete'),\n action: this._deleteCalendar.bind(this),\n ...CommonButtonStyles.delete\n }\n ],\n exportable: {\n name: i18next.t('title.calendar list'),\n data: this.exportHandler.bind(this)\n },\n importable: {\n handler: this.importHandler.bind(this)\n }\n }\n }\n\n render() {\n const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')\n\n return html`\n <ox-grist\n .mode=${mode}\n .config=${this.gristConfig}\n .fetchHandler=${this.fetchHandler.bind(this)}\n >\n <div slot=\"headroom\">\n <div id=\"filters\">\n <ox-filters-form autofocus></ox-filters-form>\n </div>\n\n <div id=\"sorters\">\n Sort\n <mwc-icon\n @click=${e => {\n const target = e.currentTarget\n this.sortersControl.open({\n right: 0,\n top: target.offsetTop + target.offsetHeight\n })\n }}\n >expand_more</mwc-icon\n >\n <ox-popup id=\"sorter-control\">\n <ox-sorters-control> </ox-sorters-control>\n </ox-popup>\n </div>\n\n <div id=\"modes\">\n <mwc-icon @click=${() => (this.mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</mwc-icon>\n <mwc-icon @click=${() => (this.mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</mwc-icon>\n <mwc-icon @click=${() => (this.mode = 'CARD')} ?active=${mode == 'CARD'}>apps</mwc-icon>\n </div>\n </div>\n </ox-grist>\n `\n }\n\n async pageInitialized(lifecycle: any) {\n this.gristConfig = {\n list: {\n fields: ['name', 'description'],\n details: ['active', 'updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: {\n editable: true\n },\n filter: 'search',\n sortable: true,\n width: 150\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n record: {\n editable: true\n },\n filter: 'search',\n width: 200\n },\n {\n type: 'checkbox',\n name: 'active',\n label: true,\n header: i18next.t('field.active'),\n record: {\n editable: true\n },\n filter: true,\n sortable: true,\n width: 60\n },\n {\n type: 'resource-object',\n name: 'updater',\n header: i18next.t('field.updater'),\n record: {\n editable: false\n },\n sortable: true,\n width: 120\n },\n {\n type: 'datetime',\n name: 'updatedAt',\n header: i18next.t('field.updated_at'),\n record: {\n editable: false\n },\n sortable: true,\n width: 180\n }\n ],\n rows: {\n selectable: {\n multiple: true\n }\n },\n sorters: [\n {\n name: 'name'\n }\n ]\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (this.active) {\n // do something here when this page just became as active\n }\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {\n responses: calendars(filters: $filters, pagination: $pagination, sortings: $sortings) {\n items {\n id\n name\n description\n active\n updater {\n id\n name\n }\n updatedAt\n }\n total\n }\n }\n `,\n variables: {\n filters,\n pagination: { page, limit },\n sortings\n }\n })\n\n return {\n total: response.data.responses.total || 0,\n records: response.data.responses.items || []\n }\n }\n\n async _deleteCalendar() {\n if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {\n const ids = this.grist.selected.map(record => record.id)\n if (ids && ids.length > 0) {\n const response = await client.mutate({\n mutation: gql`\n mutation ($ids: [String!]!) {\n deleteCalendars(ids: $ids)\n }\n `,\n variables: {\n ids\n }\n })\n\n if (!response.errors) {\n this.grist.fetch()\n notify({\n message: i18next.t('text.info_x_successfully', { x: i18next.t('text.delete') })\n })\n }\n }\n }\n }\n\n async _updateCalendar() {\n let patches = this.grist.dirtyRecords\n if (patches && patches.length) {\n patches = patches.map(patch => {\n let patchField: any = patch.id ? { id: patch.id } : {}\n const dirtyFields = patch.__dirtyfields__\n for (let key in dirtyFields) {\n patchField[key] = dirtyFields[key].after\n }\n patchField.cuFlag = patch.__dirty__\n\n return patchField\n })\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($patches: [CalendarPatch!]!) {\n updateMultipleCalendar(patches: $patches) {\n name\n }\n }\n `,\n variables: {\n patches\n }\n })\n\n if (!response.errors) {\n this.grist.fetch()\n }\n }\n }\n\n async exportHandler() {\n const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records\n const targetFieldSet = new Set([\n 'id',\n 'name',\n 'description',\n 'active'\n ])\n\n return exportTargets.map(calendar => {\n let tempObj = {}\n for (const field of targetFieldSet) {\n tempObj[field] = calendar[field]\n }\n\n return tempObj\n })\n }\n\n async importHandler(records) {\n const popup = openPopup(\n html`\n <calendar-importer\n .calendars=${records}\n @imported=${() => {\n history.back()\n this.grist.fetch()\n }}\n ></calendar-importer>\n `,\n {\n backdrop: true,\n size: 'large',\n title: i18next.t('title.import calendar')\n }\n )\n \n popup.onclosed = () => {\n this.grist.fetch()\n }\n }\n}\n\n"]}
@@ -0,0 +1,26 @@
1
+ import '@operato/event-view/ox-event-view.js';
2
+ import { PropertyValues } from 'lit';
3
+ import { PageView } from '@operato/shell';
4
+ import { BizEvent, CALENDAR } from '@operato/event-view/types.js';
5
+ import { OxEventView } from '@operato/event-view';
6
+ declare const CalendarPage_base: (new (...args: any[]) => {
7
+ _storeUnsubscribe: import("redux").Unsubscribe;
8
+ connectedCallback(): void;
9
+ disconnectedCallback(): void;
10
+ stateChanged(_state: unknown): void;
11
+ readonly isConnected: boolean;
12
+ }) & typeof PageView;
13
+ export declare class CalendarPage extends CalendarPage_base {
14
+ static styles: import("lit").CSSResult[];
15
+ itemId?: string;
16
+ params: any;
17
+ eventView: OxEventView;
18
+ render(): import("lit-html").TemplateResult<1>;
19
+ updated(changes: PropertyValues<this>): void;
20
+ fetchEventsForCalendar(calendar: CALENDAR): Map<Date, BizEvent[]>;
21
+ stateChanged(state: any): void;
22
+ pageInitialized(lifecycle: any): void;
23
+ pageUpdated(changes: any, lifecycle: any, before: any): void;
24
+ pageDisposed(lifecycle: any): void;
25
+ }
26
+ export {};
@@ -0,0 +1,128 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@operato/event-view/ox-event-view.js';
3
+ import { html, css } from 'lit';
4
+ import { customElement, property, query } from 'lit/decorators.js';
5
+ import { connect } from 'pwa-helpers/connect-mixin.js';
6
+ import { store, PageView } from '@operato/shell';
7
+ import { OxEventView } from '@operato/event-view';
8
+ import { ScrollbarStyles } from '@operato/styles';
9
+ let CalendarPage = class CalendarPage extends connect(store)(PageView) {
10
+ render() {
11
+ return html ` <ox-event-view mode="monthly" .eventProvider=${this}></ox-event-view> `;
12
+ }
13
+ updated(changes) {
14
+ /*
15
+ * If this page properties are changed, this callback will be invoked.
16
+ * This callback will be called back only when this page is activated.
17
+ */
18
+ if (changes.has('itemId') || changes.has('params')) {
19
+ /* do something */
20
+ }
21
+ }
22
+ fetchEventsForCalendar(calendar) {
23
+ const eventMap = new Map();
24
+ calendar.forEach(({ date }) => {
25
+ eventMap.set(date, []);
26
+ });
27
+ return eventMap;
28
+ }
29
+ stateChanged(state) {
30
+ /*
31
+ * application wide state changed
32
+ *
33
+ */
34
+ }
35
+ /*
36
+ * page lifecycle
37
+ *
38
+ * - pageInitialized(lifecycle)
39
+ * - pageUpdated(changes, lifecycle, changedBefore)
40
+ * - pageDisposed(lifecycle)
41
+ *
42
+ * lifecycle value has
43
+ * - active : this page is activated
44
+ * - page : first path of href
45
+ * - resourceId : second path of href
46
+ * - params : search params object of href
47
+ * - initialized : initialized state of this page
48
+ *
49
+ * you can update lifecycle values, or add custom values
50
+ * by calling this.pageUpdate({ ...values }, force)
51
+ * If lifecycle values changed by this.pageUpdate(...),
52
+ * this.pageUpdated(...) will be called back right after.
53
+ * If you want to invoke this.pageUpdated(...) callback,
54
+ * set force argument to true.
55
+ *
56
+ * you can re-initialize this page
57
+ * by calling this.pageReset().
58
+ * this.pageInitialized(...) followed by this.pageDisposed(...) will be invoked
59
+ * by calling this.pageReset().
60
+ *
61
+ * you can invoke this.pageDisposed()
62
+ * by calling this.pageDispose()
63
+ */
64
+ pageInitialized(lifecycle) {
65
+ /*
66
+ * This page is initialized.
67
+ * It's right time to configure of this page.
68
+ *
69
+ * - called before when this page activated first
70
+ * - called when i18next resource is updated (loaded, changed, ..)
71
+ * - called right after this.pageReset()
72
+ */
73
+ }
74
+ pageUpdated(changes, lifecycle, before) {
75
+ if (this.active) {
76
+ /*
77
+ * this page is activated
78
+ */
79
+ this.itemId = lifecycle.resourceId;
80
+ this.params = lifecycle.params;
81
+ }
82
+ else {
83
+ /* this page is deactivated */
84
+ }
85
+ }
86
+ pageDisposed(lifecycle) {
87
+ /*
88
+ * This page is disposed.
89
+ * It's right time to release system resources.
90
+ *
91
+ * - called just before (re)pageInitialized
92
+ * - called right after when i18next resource updated (loaded, changed, ..)
93
+ * - called right after this.pageReset()
94
+ * - called right after this.pageDispose()
95
+ */
96
+ }
97
+ };
98
+ CalendarPage.styles = [
99
+ ScrollbarStyles,
100
+ css `
101
+ :host {
102
+ display: flex;
103
+ }
104
+
105
+ ox-event-view {
106
+ flex: 1;
107
+ padding: 10px;
108
+ overflow: auto;
109
+ }
110
+ `
111
+ ];
112
+ __decorate([
113
+ property({ type: String }),
114
+ __metadata("design:type", String)
115
+ ], CalendarPage.prototype, "itemId", void 0);
116
+ __decorate([
117
+ property({ type: Object }),
118
+ __metadata("design:type", Object)
119
+ ], CalendarPage.prototype, "params", void 0);
120
+ __decorate([
121
+ query('ox-event-view'),
122
+ __metadata("design:type", OxEventView)
123
+ ], CalendarPage.prototype, "eventView", void 0);
124
+ CalendarPage = __decorate([
125
+ customElement('calendar-page')
126
+ ], CalendarPage);
127
+ export { CalendarPage };
128
+ //# sourceMappingURL=calendar-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-page.js","sourceRoot":"","sources":["../../../client/pages/calendar/calendar-page.ts"],"names":[],"mappings":";AAAA,OAAO,sCAAsC,CAAA;AAE7C,OAAO,EAAkB,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAS,MAAM,mBAAmB,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAG1C,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC;IAqBxD,MAAM;QACJ,OAAO,IAAI,CAAA,iDAAiD,IAAI,oBAAoB,CAAA;IACtF,CAAC;IAED,OAAO,CAAC,OAA6B;QACnC;;;WAGG;QACH,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAClD,kBAAkB;SACnB;IACH,CAAC;IAED,sBAAsB,CAAC,QAAkB;QACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAA;QAE5C,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;YAC5B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,YAAY,CAAC,KAAU;QACrB;;;WAGG;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IAEH,eAAe,CAAC,SAAc;QAC5B;;;;;;;WAOG;IACL,CAAC;IAED,WAAW,CAAC,OAAY,EAAE,SAAc,EAAE,MAAW;QACnD,IAAI,IAAI,CAAC,MAAM,EAAE;YACf;;eAEG;YACH,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAA;YAClC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;SAC/B;aAAM;YACL,8BAA8B;SAC/B;IACH,CAAC;IAED,YAAY,CAAC,SAAc;QACzB;;;;;;;;WAQG;IACL,CAAC;;AAlHM,mBAAM,GAAG;IACd,eAAe;IACf,GAAG,CAAA;;;;;;;;;;KAUF;CACF,CAAA;AAED;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4CAAgB;AAC3C;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4CAAY;AAEvC;IAAC,KAAK,CAAC,eAAe,CAAC;8BAAa,WAAW;+CAAA;AAnBpC,YAAY;IADxB,aAAa,CAAC,eAAe,CAAC;GAClB,YAAY,CAoHxB;SApHY,YAAY","sourcesContent":["import '@operato/event-view/ox-event-view.js'\n\nimport { PropertyValues, html, css } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { connect } from 'pwa-helpers/connect-mixin.js'\nimport { store, PageView } from '@operato/shell'\nimport { BizEvent, CALENDAR, EventProvider } from '@operato/event-view/types.js'\nimport { OxEventView } from '@operato/event-view'\nimport { ScrollbarStyles } from '@operato/styles'\n\n@customElement('calendar-page')\nexport class CalendarPage extends connect(store)(PageView) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n }\n\n ox-event-view {\n flex: 1;\n padding: 10px;\n overflow: auto;\n }\n `\n ]\n\n @property({ type: String }) itemId?: string\n @property({ type: Object }) params: any\n\n @query('ox-event-view') eventView!: OxEventView\n\n render() {\n return html` <ox-event-view mode=\"monthly\" .eventProvider=${this}></ox-event-view> `\n }\n\n updated(changes: PropertyValues<this>) {\n /*\n * If this page properties are changed, this callback will be invoked.\n * This callback will be called back only when this page is activated.\n */\n if (changes.has('itemId') || changes.has('params')) {\n /* do something */\n }\n }\n\n fetchEventsForCalendar(calendar: CALENDAR): Map<Date, BizEvent[]> {\n const eventMap = new Map<Date, BizEvent[]>()\n\n calendar.forEach(({ date }) => {\n eventMap.set(date, [])\n })\n\n return eventMap\n }\n\n stateChanged(state: any) {\n /*\n * application wide state changed\n *\n */\n }\n\n /*\n * page lifecycle\n *\n * - pageInitialized(lifecycle)\n * - pageUpdated(changes, lifecycle, changedBefore)\n * - pageDisposed(lifecycle)\n *\n * lifecycle value has\n * - active : this page is activated\n * - page : first path of href\n * - resourceId : second path of href\n * - params : search params object of href\n * - initialized : initialized state of this page\n *\n * you can update lifecycle values, or add custom values\n * by calling this.pageUpdate({ ...values }, force)\n * If lifecycle values changed by this.pageUpdate(...),\n * this.pageUpdated(...) will be called back right after.\n * If you want to invoke this.pageUpdated(...) callback,\n * set force argument to true.\n *\n * you can re-initialize this page\n * by calling this.pageReset().\n * this.pageInitialized(...) followed by this.pageDisposed(...) will be invoked\n * by calling this.pageReset().\n *\n * you can invoke this.pageDisposed()\n * by calling this.pageDispose()\n */\n\n pageInitialized(lifecycle: any) {\n /*\n * This page is initialized.\n * It's right time to configure of this page.\n *\n * - called before when this page activated first\n * - called when i18next resource is updated (loaded, changed, ..)\n * - called right after this.pageReset()\n */\n }\n\n pageUpdated(changes: any, lifecycle: any, before: any) {\n if (this.active) {\n /*\n * this page is activated\n */\n this.itemId = lifecycle.resourceId\n this.params = lifecycle.params\n } else {\n /* this page is deactivated */\n }\n }\n\n pageDisposed(lifecycle: any) {\n /*\n * This page is disposed.\n * It's right time to release system resources.\n *\n * - called just before (re)pageInitialized\n * - called right after when i18next resource updated (loaded, changed, ..)\n * - called right after this.pageReset()\n * - called right after this.pageDispose()\n */\n }\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import '@operato/data-grist';
2
+ import { LitElement } from 'lit';
3
+ export declare class EventImporter extends LitElement {
4
+ static styles: import("lit").CSSResult[];
5
+ events: any[];
6
+ columns: {
7
+ list: {
8
+ fields: string[];
9
+ };
10
+ pagination: {
11
+ infinite: boolean;
12
+ };
13
+ columns: {
14
+ type: string;
15
+ name: string;
16
+ header: string;
17
+ width: number;
18
+ }[];
19
+ };
20
+ render(): import("lit-html").TemplateResult<1>;
21
+ save(): Promise<void>;
22
+ }
@@ -0,0 +1,100 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@operato/data-grist';
3
+ import gql from 'graphql-tag';
4
+ import { css, html, LitElement } from 'lit';
5
+ import { property } from 'lit/decorators.js';
6
+ import { client } from '@operato/graphql';
7
+ import { i18next } from '@operato/i18n';
8
+ import { isMobileDevice } from '@operato/utils';
9
+ export class EventImporter extends LitElement {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.events = [];
13
+ this.columns = {
14
+ list: { fields: ['name', 'description'] },
15
+ pagination: { infinite: true },
16
+ columns: [
17
+ {
18
+ type: 'string',
19
+ name: 'name',
20
+ header: i18next.t('field.name'),
21
+ width: 150
22
+ },
23
+ {
24
+ type: 'string',
25
+ name: 'description',
26
+ header: i18next.t('field.description'),
27
+ width: 200
28
+ },
29
+ {
30
+ type: 'checkbox',
31
+ name: 'active',
32
+ header: i18next.t('field.active'),
33
+ width: 60
34
+ }
35
+ ]
36
+ };
37
+ }
38
+ render() {
39
+ return html `
40
+ <ox-grist
41
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
42
+ .config=${this.columns}
43
+ .data=${{
44
+ records: this.events
45
+ }}
46
+ ></ox-grist>
47
+
48
+ <div class="button-container">
49
+ <mwc-button raised @click="${this.save.bind(this)}">${i18next.t('button.save')}</mwc-button>
50
+ </div>
51
+ `;
52
+ }
53
+ async save() {
54
+ var _a;
55
+ const response = await client.mutate({
56
+ mutation: gql `
57
+ mutation importEvents($events: [EventPatch!]!) {
58
+ importEvents(events: $events)
59
+ }
60
+ `,
61
+ variables: { events: this.events }
62
+ });
63
+ if ((_a = response.errors) === null || _a === void 0 ? void 0 : _a.length)
64
+ return;
65
+ this.dispatchEvent(new CustomEvent('imported'));
66
+ }
67
+ }
68
+ EventImporter.styles = [
69
+ css `
70
+ :host {
71
+ display: flex;
72
+ flex-direction: column;
73
+
74
+ background-color: #fff;
75
+ }
76
+
77
+ ox-grist {
78
+ flex: 1;
79
+ }
80
+
81
+ .button-container {
82
+ display: flex;
83
+ margin-left: auto;
84
+ padding: var(--padding-default);
85
+ }
86
+
87
+ mwc-button {
88
+ margin-left: var(--margin-default);
89
+ }
90
+ `
91
+ ];
92
+ __decorate([
93
+ property({ type: Array }),
94
+ __metadata("design:type", Array)
95
+ ], EventImporter.prototype, "events", void 0);
96
+ __decorate([
97
+ property({ type: Object }),
98
+ __metadata("design:type", Object)
99
+ ], EventImporter.prototype, "columns", void 0);
100
+ //# sourceMappingURL=event-importer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-importer.js","sourceRoot":"","sources":["../../../client/pages/event/event-importer.ts"],"names":[],"mappings":";AAAA,OAAO,qBAAqB,CAAA;AAE5B,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,MAAM,OAAO,aAAc,SAAQ,UAAU;IAA7C;;QA0B6B,WAAM,GAAU,EAAE,CAAA;QACjB,YAAO,GAAG;YACpC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE;YACzC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC9B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBACjC,KAAK,EAAE,EAAE;iBACV;aACF;SACF,CAAA;IAmCH,CAAC;IAhCC,MAAM;QACJ,OAAO,IAAI,CAAA;;gBAEC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;kBAChC,IAAI,CAAC,OAAO;gBAEpB;YACE,OAAO,EAAE,IAAI,CAAC,MAAM;SAExB;;;;qCAI6B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;KAEjF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAI;;QACR,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;;;OAIZ;YACD,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;SACnC,CAAC,CAAA;QAEF,IAAI,MAAA,QAAQ,CAAC,MAAM,0CAAE,MAAM;YAAE,OAAM;QAEnC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;IACjD,CAAC;;AAnFM,oBAAM,GAAG;IACd,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;KAqBF;CACF,CAAA;AAED;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;6CAAmB;AAC7C;IAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;8CAuB1B","sourcesContent":["import '@operato/data-grist'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\n\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { isMobileDevice } from '@operato/utils'\n\nexport class EventImporter extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: #fff;\n }\n\n ox-grist {\n flex: 1;\n }\n\n .button-container {\n display: flex;\n margin-left: auto;\n padding: var(--padding-default);\n }\n\n mwc-button {\n margin-left: var(--margin-default);\n }\n `\n ]\n\n @property({ type: Array }) events: any[] = []\n @property({ type: Object }) columns = {\n list: { fields: ['name', 'description'] },\n pagination: { infinite: true },\n columns: [\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n width: 150\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n width: 200\n },\n {\n type: 'checkbox',\n name: 'active',\n header: i18next.t('field.active'),\n width: 60\n }\n ]\n }\n\n\n render() {\n return html`\n <ox-grist\n .mode=${isMobileDevice() ? 'LIST' : 'GRID'}\n .config=${this.columns}\n .data=${\n { \n records: this.events \n }\n }\n ></ox-grist>\n\n <div class=\"button-container\">\n <mwc-button raised @click=\"${this.save.bind(this)}\">${i18next.t('button.save')}</mwc-button>\n </div>\n `\n }\n\n async save() {\n const response = await client.mutate({\n mutation: gql`\n mutation importEvents($events: [EventPatch!]!) {\n importEvents(events: $events)\n }\n `,\n variables: { events: this.events }\n })\n\n if (response.errors?.length) return\n\n this.dispatchEvent(new CustomEvent('imported'))\n }\n}\n\n"]}