@things-factory/personalization 7.0.1-alpha.62

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 (52) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/client/bootstrap.ts +1 -0
  3. package/client/grid-preference-editor.ts +238 -0
  4. package/client/index.ts +0 -0
  5. package/client/tsconfig.json +11 -0
  6. package/dist-client/bootstrap.d.ts +1 -0
  7. package/dist-client/bootstrap.js +2 -0
  8. package/dist-client/bootstrap.js.map +1 -0
  9. package/dist-client/grid-preference-editor.d.ts +26 -0
  10. package/dist-client/grid-preference-editor.js +224 -0
  11. package/dist-client/grid-preference-editor.js.map +1 -0
  12. package/dist-client/index.d.ts +0 -0
  13. package/dist-client/index.js +2 -0
  14. package/dist-client/index.js.map +1 -0
  15. package/dist-client/tsconfig.tsbuildinfo +1 -0
  16. package/dist-server/index.js +4 -0
  17. package/dist-server/index.js.map +1 -0
  18. package/dist-server/migrations/index.js +12 -0
  19. package/dist-server/migrations/index.js.map +1 -0
  20. package/dist-server/routes.js +25 -0
  21. package/dist-server/routes.js.map +1 -0
  22. package/dist-server/service/index.js +22 -0
  23. package/dist-server/service/index.js.map +1 -0
  24. package/dist-server/service/screen-preference/index.js +9 -0
  25. package/dist-server/service/screen-preference/index.js.map +1 -0
  26. package/dist-server/service/screen-preference/screen-preference-mutation.js +105 -0
  27. package/dist-server/service/screen-preference/screen-preference-mutation.js.map +1 -0
  28. package/dist-server/service/screen-preference/screen-preference-query.js +94 -0
  29. package/dist-server/service/screen-preference/screen-preference-query.js.map +1 -0
  30. package/dist-server/service/screen-preference/screen-preference-type.js +74 -0
  31. package/dist-server/service/screen-preference/screen-preference-type.js.map +1 -0
  32. package/dist-server/service/screen-preference/screen-preference.js +90 -0
  33. package/dist-server/service/screen-preference/screen-preference.js.map +1 -0
  34. package/dist-server/tsconfig.tsbuildinfo +1 -0
  35. package/helps/personalization/screen-preference.md +160 -0
  36. package/package.json +39 -0
  37. package/server/index.ts +1 -0
  38. package/server/migrations/index.ts +9 -0
  39. package/server/routes.ts +28 -0
  40. package/server/service/index.ts +21 -0
  41. package/server/service/screen-preference/index.ts +6 -0
  42. package/server/service/screen-preference/screen-preference-mutation.ts +101 -0
  43. package/server/service/screen-preference/screen-preference-query.ts +61 -0
  44. package/server/service/screen-preference/screen-preference-type.ts +50 -0
  45. package/server/service/screen-preference/screen-preference.ts +82 -0
  46. package/server/tsconfig.json +10 -0
  47. package/things-factory.config.js +8 -0
  48. package/translations/en.json +1 -0
  49. package/translations/ja.json +1 -0
  50. package/translations/ko.json +1 -0
  51. package/translations/ms.json +1 -0
  52. package/translations/zh.json +1 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
+ and adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
+
8
+ <!-- ## [Unreleased] -->
@@ -0,0 +1 @@
1
+ export default function bootstrap() {}
@@ -0,0 +1,238 @@
1
+ import '@material/web/icon/icon.js'
2
+
3
+ import gql from 'graphql-tag'
4
+ import { css, html, LitElement } from 'lit'
5
+ import { customElement, property, query } from 'lit/decorators.js'
6
+
7
+ import { i18next, localize } from '@operato/i18n'
8
+ import { client } from '@operato/graphql'
9
+ import { DataGrist } from '@operato/data-grist'
10
+ import { ScrollbarStyles, CommonGristStyles, ButtonContainerStyles } from '@operato/styles'
11
+
12
+ @customElement('grid-preference-editor')
13
+ export class GridPreferenceEditor extends localize(i18next)(LitElement) {
14
+ static styles = [
15
+ ScrollbarStyles,
16
+ CommonGristStyles,
17
+ ButtonContainerStyles,
18
+ css`
19
+ :host {
20
+ display: flex;
21
+ flex-direction: column;
22
+ overflow-x: auto;
23
+ }
24
+
25
+ .container {
26
+ flex: 1;
27
+ display: grid;
28
+ overflow: hidden;
29
+ }
30
+
31
+ .container_detail {
32
+ background-color: var(--main-section-background-color);
33
+ display: flex;
34
+ flex-direction: column;
35
+ flex: 1;
36
+ overflow-y: auto;
37
+ }
38
+
39
+ h2 {
40
+ padding: var(--subtitle-padding);
41
+ font: var(--subtitle-font);
42
+ color: var(--subtitle-text-color);
43
+ border-bottom: var(--subtitle-border-bottom);
44
+ }
45
+
46
+ .container_detail h2 {
47
+ margin: var(--grist-title-margin);
48
+ border: var(--grist-title-border);
49
+ font: var(--grist-title-font);
50
+ color: var(--secondary-color);
51
+ }
52
+
53
+ .container_detail h2 md-icon {
54
+ --md-icon-size: var(--grist-title-icon-size);
55
+ vertical-align: middle;
56
+ margin: var(--grist-title-icon-margin);
57
+ color: var(--grist-title-icon-color);
58
+ }
59
+
60
+ h2 {
61
+ padding-bottom: var(--grist-title-with-grid-padding);
62
+ }
63
+
64
+ ox-grist {
65
+ overflow-y: auto;
66
+ flex: 1;
67
+ }
68
+
69
+ ox-filters-form {
70
+ flex: 1;
71
+ }
72
+ `
73
+ ]
74
+
75
+ @property({ type: Object }) target!: DataGrist
76
+ @property({ type: String }) route!: string
77
+
78
+ @query('ox-grist') private grist!: DataGrist
79
+
80
+ private gridConfig: any
81
+
82
+ async connectedCallback() {
83
+ // 메뉴 그룹 그리드 설정
84
+ this.gridConfig = {
85
+ rows: { selectable: false, appendable: false },
86
+ pagination: { infinite: true },
87
+ list: {
88
+ fields: ['route', 'element'],
89
+ details: ['active', 'updatedAt']
90
+ },
91
+ columns: [
92
+ { type: 'gutter', gutterName: 'sequence' },
93
+ {
94
+ type: 'string',
95
+ name: 'name',
96
+ header: i18next.t('field.name'),
97
+ record: {
98
+ align: 'left'
99
+ },
100
+ filter: 'search',
101
+ sortable: true,
102
+ width: 150
103
+ },
104
+ {
105
+ type: 'string',
106
+ name: 'header',
107
+ header: i18next.t('field.header'),
108
+ record: {
109
+ align: 'left'
110
+ },
111
+ filter: 'search',
112
+ width: 200
113
+ },
114
+ {
115
+ type: 'checkbox',
116
+ name: 'hidden',
117
+ label: true,
118
+ header: i18next.t('field.hidden'),
119
+ record: {
120
+ align: 'center'
121
+ },
122
+ filter: true,
123
+ sortable: true,
124
+ width: 60
125
+ }
126
+ ]
127
+ }
128
+
129
+ await super.connectedCallback()
130
+ }
131
+
132
+ /**
133
+ * @description 라이프 사이클
134
+ ***************************
135
+ */
136
+ render() {
137
+ return html` <div id="container" class="container">
138
+ <div class="container_detail">
139
+ <ox-grist mode="GRID" .config=${this.gridConfig} .fetchHandler=${this.fetchColumns.bind(this)} auto-fetch>
140
+ </ox-grist>
141
+
142
+ <div class="button-container" style="margin-left:unset">
143
+ <button @click=${this.reset.bind(this)}><md-icon>restart_alt</md-icon>${i18next.t('button.reset')}</button>
144
+ <div filler></div>
145
+ <button @click=${this.save.bind(this)}><md-icon>save</md-icon>${i18next.t('button.save')}</button>
146
+ <button danger @click=${this.delete.bind(this)}>
147
+ <md-icon>delete</md-icon>${i18next.t('button.delete')}
148
+ </button>
149
+ </div>
150
+ </div>
151
+ </div>`
152
+ }
153
+
154
+ async fetchColumns() {
155
+ const columns = this.target.config.columns.filter(
156
+ column => column.type != 'gutter' && column.name != 'id' && !column.unusable
157
+ )
158
+
159
+ return { total: 0, records: columns }
160
+ }
161
+
162
+ async delete(e: MouseEvent) {
163
+ const element = this.target.id
164
+
165
+ const response = await client.query({
166
+ query: gql`
167
+ mutation ($route: String!, $element: String!) {
168
+ deleteMyScreenPreference(route: $route, element: $element) {
169
+ id
170
+ }
171
+ }
172
+ `,
173
+ variables: {
174
+ route: this.route,
175
+ element
176
+ }
177
+ })
178
+
179
+ if (!response.errors) {
180
+ this.showToast(i18next.t('text.success to delete'))
181
+ history.back()
182
+ }
183
+ }
184
+
185
+ async reset(e: MouseEvent) {
186
+ await this.grist.fetch()
187
+ }
188
+
189
+ async save(e: MouseEvent) {
190
+ const element = this.target.id
191
+
192
+ const dirties = this.grist.dirtyRecords
193
+ const targetColumns = this.target.config.columns
194
+
195
+ dirties.forEach(record => {
196
+ const { name, hidden } = record
197
+ const targetColumn = targetColumns.find(column => column.name == name)
198
+
199
+ if (targetColumn) {
200
+ targetColumn.hidden = hidden
201
+ }
202
+ })
203
+
204
+ await this.target.requestUpdate()
205
+
206
+ const preference = this.grist.data.records.map(record => {
207
+ const { name, hidden } = record
208
+
209
+ return {
210
+ name,
211
+ hidden
212
+ }
213
+ })
214
+
215
+ const response = await client.query({
216
+ query: gql`
217
+ mutation ($route: String!, $preference: Object!) {
218
+ saveMyScreenPreference(route: $route, preference: $preference) {
219
+ id
220
+ }
221
+ }
222
+ `,
223
+ variables: {
224
+ route: this.route,
225
+ element,
226
+ preference
227
+ }
228
+ })
229
+
230
+ if (!response.errors) {
231
+ this.showToast(i18next.t('text.success to save'))
232
+ }
233
+ }
234
+
235
+ showToast(message) {
236
+ document.dispatchEvent(new CustomEvent('notify', { detail: { message } }))
237
+ }
238
+ }
File without changes
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "../../tsconfig-base.json",
3
+ "compilerOptions": {
4
+ "strict": true,
5
+ "declaration": true,
6
+ "module": "esnext",
7
+ "outDir": "../dist-client",
8
+ "baseUrl": "./"
9
+ },
10
+ "include": ["./**/*"]
11
+ }
@@ -0,0 +1 @@
1
+ export default function bootstrap(): void;
@@ -0,0 +1,2 @@
1
+ export default function bootstrap() { }
2
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../client/bootstrap.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,SAAS,KAAI,CAAC","sourcesContent":["export default function bootstrap() {}\n"]}
@@ -0,0 +1,26 @@
1
+ import '@material/web/icon/icon.js';
2
+ import { LitElement } from 'lit';
3
+ import { DataGrist } from '@operato/data-grist';
4
+ declare const GridPreferenceEditor_base: (new (...args: any[]) => LitElement) & typeof LitElement;
5
+ export declare class GridPreferenceEditor extends GridPreferenceEditor_base {
6
+ static styles: import("lit").CSSResult[];
7
+ target: DataGrist;
8
+ route: string;
9
+ private grist;
10
+ private gridConfig;
11
+ connectedCallback(): Promise<void>;
12
+ /**
13
+ * @description 라이프 사이클
14
+ ***************************
15
+ */
16
+ render(): import("lit").TemplateResult<1>;
17
+ fetchColumns(): Promise<{
18
+ total: number;
19
+ records: any;
20
+ }>;
21
+ delete(e: MouseEvent): Promise<void>;
22
+ reset(e: MouseEvent): Promise<void>;
23
+ save(e: MouseEvent): Promise<void>;
24
+ showToast(message: any): void;
25
+ }
26
+ export {};
@@ -0,0 +1,224 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/icon/icon.js';
3
+ import gql from 'graphql-tag';
4
+ import { css, html, LitElement } from 'lit';
5
+ import { customElement, property, query } from 'lit/decorators.js';
6
+ import { i18next, localize } from '@operato/i18n';
7
+ import { client } from '@operato/graphql';
8
+ import { DataGrist } from '@operato/data-grist';
9
+ import { ScrollbarStyles, CommonGristStyles, ButtonContainerStyles } from '@operato/styles';
10
+ let GridPreferenceEditor = class GridPreferenceEditor extends localize(i18next)(LitElement) {
11
+ async connectedCallback() {
12
+ // 메뉴 그룹 그리드 설정
13
+ this.gridConfig = {
14
+ rows: { selectable: false, appendable: false },
15
+ pagination: { infinite: true },
16
+ list: {
17
+ fields: ['route', 'element'],
18
+ details: ['active', 'updatedAt']
19
+ },
20
+ columns: [
21
+ { type: 'gutter', gutterName: 'sequence' },
22
+ {
23
+ type: 'string',
24
+ name: 'name',
25
+ header: i18next.t('field.name'),
26
+ record: {
27
+ align: 'left'
28
+ },
29
+ filter: 'search',
30
+ sortable: true,
31
+ width: 150
32
+ },
33
+ {
34
+ type: 'string',
35
+ name: 'header',
36
+ header: i18next.t('field.header'),
37
+ record: {
38
+ align: 'left'
39
+ },
40
+ filter: 'search',
41
+ width: 200
42
+ },
43
+ {
44
+ type: 'checkbox',
45
+ name: 'hidden',
46
+ label: true,
47
+ header: i18next.t('field.hidden'),
48
+ record: {
49
+ align: 'center'
50
+ },
51
+ filter: true,
52
+ sortable: true,
53
+ width: 60
54
+ }
55
+ ]
56
+ };
57
+ await super.connectedCallback();
58
+ }
59
+ /**
60
+ * @description 라이프 사이클
61
+ ***************************
62
+ */
63
+ render() {
64
+ return html ` <div id="container" class="container">
65
+ <div class="container_detail">
66
+ <ox-grist mode="GRID" .config=${this.gridConfig} .fetchHandler=${this.fetchColumns.bind(this)} auto-fetch>
67
+ </ox-grist>
68
+
69
+ <div class="button-container" style="margin-left:unset">
70
+ <button @click=${this.reset.bind(this)}><md-icon>restart_alt</md-icon>${i18next.t('button.reset')}</button>
71
+ <div filler></div>
72
+ <button @click=${this.save.bind(this)}><md-icon>save</md-icon>${i18next.t('button.save')}</button>
73
+ <button danger @click=${this.delete.bind(this)}>
74
+ <md-icon>delete</md-icon>${i18next.t('button.delete')}
75
+ </button>
76
+ </div>
77
+ </div>
78
+ </div>`;
79
+ }
80
+ async fetchColumns() {
81
+ const columns = this.target.config.columns.filter(column => column.type != 'gutter' && column.name != 'id' && !column.unusable);
82
+ return { total: 0, records: columns };
83
+ }
84
+ async delete(e) {
85
+ const element = this.target.id;
86
+ const response = await client.query({
87
+ query: gql `
88
+ mutation ($route: String!, $element: String!) {
89
+ deleteMyScreenPreference(route: $route, element: $element) {
90
+ id
91
+ }
92
+ }
93
+ `,
94
+ variables: {
95
+ route: this.route,
96
+ element
97
+ }
98
+ });
99
+ if (!response.errors) {
100
+ this.showToast(i18next.t('text.success to delete'));
101
+ history.back();
102
+ }
103
+ }
104
+ async reset(e) {
105
+ await this.grist.fetch();
106
+ }
107
+ async save(e) {
108
+ const element = this.target.id;
109
+ const dirties = this.grist.dirtyRecords;
110
+ const targetColumns = this.target.config.columns;
111
+ dirties.forEach(record => {
112
+ const { name, hidden } = record;
113
+ const targetColumn = targetColumns.find(column => column.name == name);
114
+ if (targetColumn) {
115
+ targetColumn.hidden = hidden;
116
+ }
117
+ });
118
+ await this.target.requestUpdate();
119
+ const preference = this.grist.data.records.map(record => {
120
+ const { name, hidden } = record;
121
+ return {
122
+ name,
123
+ hidden
124
+ };
125
+ });
126
+ const response = await client.query({
127
+ query: gql `
128
+ mutation ($route: String!, $preference: Object!) {
129
+ saveMyScreenPreference(route: $route, preference: $preference) {
130
+ id
131
+ }
132
+ }
133
+ `,
134
+ variables: {
135
+ route: this.route,
136
+ element,
137
+ preference
138
+ }
139
+ });
140
+ if (!response.errors) {
141
+ this.showToast(i18next.t('text.success to save'));
142
+ }
143
+ }
144
+ showToast(message) {
145
+ document.dispatchEvent(new CustomEvent('notify', { detail: { message } }));
146
+ }
147
+ };
148
+ GridPreferenceEditor.styles = [
149
+ ScrollbarStyles,
150
+ CommonGristStyles,
151
+ ButtonContainerStyles,
152
+ css `
153
+ :host {
154
+ display: flex;
155
+ flex-direction: column;
156
+ overflow-x: auto;
157
+ }
158
+
159
+ .container {
160
+ flex: 1;
161
+ display: grid;
162
+ overflow: hidden;
163
+ }
164
+
165
+ .container_detail {
166
+ background-color: var(--main-section-background-color);
167
+ display: flex;
168
+ flex-direction: column;
169
+ flex: 1;
170
+ overflow-y: auto;
171
+ }
172
+
173
+ h2 {
174
+ padding: var(--subtitle-padding);
175
+ font: var(--subtitle-font);
176
+ color: var(--subtitle-text-color);
177
+ border-bottom: var(--subtitle-border-bottom);
178
+ }
179
+
180
+ .container_detail h2 {
181
+ margin: var(--grist-title-margin);
182
+ border: var(--grist-title-border);
183
+ font: var(--grist-title-font);
184
+ color: var(--secondary-color);
185
+ }
186
+
187
+ .container_detail h2 md-icon {
188
+ --md-icon-size: var(--grist-title-icon-size);
189
+ vertical-align: middle;
190
+ margin: var(--grist-title-icon-margin);
191
+ color: var(--grist-title-icon-color);
192
+ }
193
+
194
+ h2 {
195
+ padding-bottom: var(--grist-title-with-grid-padding);
196
+ }
197
+
198
+ ox-grist {
199
+ overflow-y: auto;
200
+ flex: 1;
201
+ }
202
+
203
+ ox-filters-form {
204
+ flex: 1;
205
+ }
206
+ `
207
+ ];
208
+ __decorate([
209
+ property({ type: Object }),
210
+ __metadata("design:type", DataGrist)
211
+ ], GridPreferenceEditor.prototype, "target", void 0);
212
+ __decorate([
213
+ property({ type: String }),
214
+ __metadata("design:type", String)
215
+ ], GridPreferenceEditor.prototype, "route", void 0);
216
+ __decorate([
217
+ query('ox-grist'),
218
+ __metadata("design:type", DataGrist)
219
+ ], GridPreferenceEditor.prototype, "grist", void 0);
220
+ GridPreferenceEditor = __decorate([
221
+ customElement('grid-preference-editor')
222
+ ], GridPreferenceEditor);
223
+ export { GridPreferenceEditor };
224
+ //# sourceMappingURL=grid-preference-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-preference-editor.js","sourceRoot":"","sources":["../client/grid-preference-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { client } from '@operato/graphql'\nimport { DataGrist } from '@operato/data-grist'\nimport { ScrollbarStyles, CommonGristStyles, ButtonContainerStyles } from '@operato/styles'\n\n@customElement('grid-preference-editor')\nexport class GridPreferenceEditor extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n ButtonContainerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow-x: auto;\n }\n\n .container {\n flex: 1;\n display: grid;\n overflow: hidden;\n }\n\n .container_detail {\n background-color: var(--main-section-background-color);\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow-y: auto;\n }\n\n h2 {\n padding: var(--subtitle-padding);\n font: var(--subtitle-font);\n color: var(--subtitle-text-color);\n border-bottom: var(--subtitle-border-bottom);\n }\n\n .container_detail h2 {\n margin: var(--grist-title-margin);\n border: var(--grist-title-border);\n font: var(--grist-title-font);\n color: var(--secondary-color);\n }\n\n .container_detail h2 md-icon {\n --md-icon-size: var(--grist-title-icon-size);\n vertical-align: middle;\n margin: var(--grist-title-icon-margin);\n color: var(--grist-title-icon-color);\n }\n\n h2 {\n padding-bottom: var(--grist-title-with-grid-padding);\n }\n\n ox-grist {\n overflow-y: auto;\n flex: 1;\n }\n\n ox-filters-form {\n flex: 1;\n }\n `\n ]\n\n @property({ type: Object }) target!: DataGrist\n @property({ type: String }) route!: string\n\n @query('ox-grist') private grist!: DataGrist\n\n private gridConfig: any\n\n async connectedCallback() {\n // 메뉴 그룹 그리드 설정\n this.gridConfig = {\n rows: { selectable: false, appendable: false },\n pagination: { infinite: true },\n list: {\n fields: ['route', 'element'],\n details: ['active', 'updatedAt']\n },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n record: {\n align: 'left'\n },\n filter: 'search',\n sortable: true,\n width: 150\n },\n {\n type: 'string',\n name: 'header',\n header: i18next.t('field.header'),\n record: {\n align: 'left'\n },\n filter: 'search',\n width: 200\n },\n {\n type: 'checkbox',\n name: 'hidden',\n label: true,\n header: i18next.t('field.hidden'),\n record: {\n align: 'center'\n },\n filter: true,\n sortable: true,\n width: 60\n }\n ]\n }\n\n await super.connectedCallback()\n }\n\n /**\n * @description 라이프 사이클\n ***************************\n */\n render() {\n return html` <div id=\"container\" class=\"container\">\n <div class=\"container_detail\">\n <ox-grist mode=\"GRID\" .config=${this.gridConfig} .fetchHandler=${this.fetchColumns.bind(this)} auto-fetch>\n </ox-grist>\n\n <div class=\"button-container\" style=\"margin-left:unset\">\n <button @click=${this.reset.bind(this)}><md-icon>restart_alt</md-icon>${i18next.t('button.reset')}</button>\n <div filler></div>\n <button @click=${this.save.bind(this)}><md-icon>save</md-icon>${i18next.t('button.save')}</button>\n <button danger @click=${this.delete.bind(this)}>\n <md-icon>delete</md-icon>${i18next.t('button.delete')}\n </button>\n </div>\n </div>\n </div>`\n }\n\n async fetchColumns() {\n const columns = this.target.config.columns.filter(\n column => column.type != 'gutter' && column.name != 'id' && !column.unusable\n )\n\n return { total: 0, records: columns }\n }\n\n async delete(e: MouseEvent) {\n const element = this.target.id\n\n const response = await client.query({\n query: gql`\n mutation ($route: String!, $element: String!) {\n deleteMyScreenPreference(route: $route, element: $element) {\n id\n }\n }\n `,\n variables: {\n route: this.route,\n element\n }\n })\n\n if (!response.errors) {\n this.showToast(i18next.t('text.success to delete'))\n history.back()\n }\n }\n\n async reset(e: MouseEvent) {\n await this.grist.fetch()\n }\n\n async save(e: MouseEvent) {\n const element = this.target.id\n\n const dirties = this.grist.dirtyRecords\n const targetColumns = this.target.config.columns\n\n dirties.forEach(record => {\n const { name, hidden } = record\n const targetColumn = targetColumns.find(column => column.name == name)\n\n if (targetColumn) {\n targetColumn.hidden = hidden\n }\n })\n\n await this.target.requestUpdate()\n\n const preference = this.grist.data.records.map(record => {\n const { name, hidden } = record\n\n return {\n name,\n hidden\n }\n })\n\n const response = await client.query({\n query: gql`\n mutation ($route: String!, $preference: Object!) {\n saveMyScreenPreference(route: $route, preference: $preference) {\n id\n }\n }\n `,\n variables: {\n route: this.route,\n element,\n preference\n }\n })\n\n if (!response.errors) {\n this.showToast(i18next.t('text.success to save'))\n }\n }\n\n showToast(message) {\n document.dispatchEvent(new CustomEvent('notify', { detail: { message } }))\n }\n}\n"]}
File without changes
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"","sourcesContent":[""]}