@things-factory/asset 0.0.0-stage → 10.1.230

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 (122) hide show
  1. package/dist-client/components/asset-documents.d.ts +22 -0
  2. package/dist-client/components/asset-documents.js +190 -0
  3. package/dist-client/components/asset-documents.js.map +1 -0
  4. package/dist-client/grid.d.ts +13 -0
  5. package/dist-client/grid.js +56 -0
  6. package/dist-client/grid.js.map +1 -0
  7. package/dist-client/index.d.ts +1 -0
  8. package/dist-client/index.js +2 -0
  9. package/dist-client/index.js.map +1 -0
  10. package/dist-client/pages/asset-list.d.ts +53 -0
  11. package/dist-client/pages/asset-list.js +171 -0
  12. package/dist-client/pages/asset-list.js.map +1 -0
  13. package/dist-client/pages/asset-reconciliation.d.ts +25 -0
  14. package/dist-client/pages/asset-reconciliation.js +165 -0
  15. package/dist-client/pages/asset-reconciliation.js.map +1 -0
  16. package/dist-client/pages/investee-page.d.ts +47 -0
  17. package/dist-client/pages/investee-page.js +322 -0
  18. package/dist-client/pages/investee-page.js.map +1 -0
  19. package/dist-client/pages/investment-list.d.ts +51 -0
  20. package/dist-client/pages/investment-list.js +134 -0
  21. package/dist-client/pages/investment-list.js.map +1 -0
  22. package/dist-client/route.d.ts +1 -0
  23. package/dist-client/route.js +18 -0
  24. package/dist-client/route.js.map +1 -0
  25. package/dist-client/tsconfig.tsbuildinfo +1 -0
  26. package/dist-client/words.d.ts +25 -0
  27. package/dist-client/words.js +23 -0
  28. package/dist-client/words.js.map +1 -0
  29. package/dist-server/attachment-reader.d.ts +3 -0
  30. package/dist-server/attachment-reader.js +20 -0
  31. package/dist-server/attachment-reader.js.map +1 -0
  32. package/dist-server/index.d.ts +1 -0
  33. package/dist-server/index.js +11 -0
  34. package/dist-server/index.js.map +1 -0
  35. package/dist-server/role-tasks.d.ts +2 -0
  36. package/dist-server/role-tasks.js +13 -0
  37. package/dist-server/role-tasks.js.map +1 -0
  38. package/dist-server/service/asset/asset-mutation.d.ts +5 -0
  39. package/dist-server/service/asset/asset-mutation.js +31 -0
  40. package/dist-server/service/asset/asset-mutation.js.map +1 -0
  41. package/dist-server/service/asset/asset-query.d.ts +19 -0
  42. package/dist-server/service/asset/asset-query.js +108 -0
  43. package/dist-server/service/asset/asset-query.js.map +1 -0
  44. package/dist-server/service/asset/asset-rules.d.ts +87 -0
  45. package/dist-server/service/asset/asset-rules.js +148 -0
  46. package/dist-server/service/asset/asset-rules.js.map +1 -0
  47. package/dist-server/service/asset/asset-service.d.ts +23 -0
  48. package/dist-server/service/asset/asset-service.js +84 -0
  49. package/dist-server/service/asset/asset-service.js.map +1 -0
  50. package/dist-server/service/asset/asset-type.d.ts +48 -0
  51. package/dist-server/service/asset/asset-type.js +182 -0
  52. package/dist-server/service/asset/asset-type.js.map +1 -0
  53. package/dist-server/service/asset/asset.d.ts +38 -0
  54. package/dist-server/service/asset/asset.js +159 -0
  55. package/dist-server/service/asset/asset.js.map +1 -0
  56. package/dist-server/service/asset/index.d.ts +6 -0
  57. package/dist-server/service/asset/index.js +10 -0
  58. package/dist-server/service/asset/index.js.map +1 -0
  59. package/dist-server/service/asset-document/asset-document-resolver.d.ts +32 -0
  60. package/dist-server/service/asset-document/asset-document-resolver.js +94 -0
  61. package/dist-server/service/asset-document/asset-document-resolver.js.map +1 -0
  62. package/dist-server/service/asset-document/asset-document-service.d.ts +34 -0
  63. package/dist-server/service/asset-document/asset-document-service.js +79 -0
  64. package/dist-server/service/asset-document/asset-document-service.js.map +1 -0
  65. package/dist-server/service/asset-document/index.d.ts +4 -0
  66. package/dist-server/service/asset-document/index.js +8 -0
  67. package/dist-server/service/asset-document/index.js.map +1 -0
  68. package/dist-server/service/checks.d.ts +12 -0
  69. package/dist-server/service/checks.js +27 -0
  70. package/dist-server/service/checks.js.map +1 -0
  71. package/dist-server/service/index.d.ts +18 -0
  72. package/dist-server/service/index.js +40 -0
  73. package/dist-server/service/index.js.map +1 -0
  74. package/dist-server/service/investment/index.d.ts +11 -0
  75. package/dist-server/service/investment/index.js +15 -0
  76. package/dist-server/service/investment/index.js.map +1 -0
  77. package/dist-server/service/investment/investee.d.ts +33 -0
  78. package/dist-server/service/investment/investee.js +135 -0
  79. package/dist-server/service/investment/investee.js.map +1 -0
  80. package/dist-server/service/investment/investment-board-seat.d.ts +25 -0
  81. package/dist-server/service/investment/investment-board-seat.js +98 -0
  82. package/dist-server/service/investment/investment-board-seat.js.map +1 -0
  83. package/dist-server/service/investment/investment-filing.d.ts +29 -0
  84. package/dist-server/service/investment/investment-filing.js +113 -0
  85. package/dist-server/service/investment/investment-filing.js.map +1 -0
  86. package/dist-server/service/investment/investment-holding.d.ts +31 -0
  87. package/dist-server/service/investment/investment-holding.js +127 -0
  88. package/dist-server/service/investment/investment-holding.js.map +1 -0
  89. package/dist-server/service/investment/investment-mutation.d.ts +15 -0
  90. package/dist-server/service/investment/investment-mutation.js +112 -0
  91. package/dist-server/service/investment/investment-mutation.js.map +1 -0
  92. package/dist-server/service/investment/investment-query.d.ts +33 -0
  93. package/dist-server/service/investment/investment-query.js +192 -0
  94. package/dist-server/service/investment/investment-query.js.map +1 -0
  95. package/dist-server/service/investment/investment-report.d.ts +37 -0
  96. package/dist-server/service/investment/investment-report.js +152 -0
  97. package/dist-server/service/investment/investment-report.js.map +1 -0
  98. package/dist-server/service/investment/investment-request.d.ts +31 -0
  99. package/dist-server/service/investment/investment-request.js +123 -0
  100. package/dist-server/service/investment/investment-request.js.map +1 -0
  101. package/dist-server/service/investment/investment-rules.d.ts +81 -0
  102. package/dist-server/service/investment/investment-rules.js +121 -0
  103. package/dist-server/service/investment/investment-rules.js.map +1 -0
  104. package/dist-server/service/investment/investment-service.d.ts +34 -0
  105. package/dist-server/service/investment/investment-service.js +280 -0
  106. package/dist-server/service/investment/investment-service.js.map +1 -0
  107. package/dist-server/service/investment/investment-type.d.ts +85 -0
  108. package/dist-server/service/investment/investment-type.js +324 -0
  109. package/dist-server/service/investment/investment-type.js.map +1 -0
  110. package/dist-server/service/patches.d.ts +24 -0
  111. package/dist-server/service/patches.js +63 -0
  112. package/dist-server/service/patches.js.map +1 -0
  113. package/dist-server/tsconfig.tsbuildinfo +1 -0
  114. package/package.json +49 -4
  115. package/things-factory.config.js +11 -0
  116. package/translations/en.json +188 -0
  117. package/translations/es.json +188 -0
  118. package/translations/ja.json +188 -0
  119. package/translations/ko.json +188 -0
  120. package/translations/ms.json +188 -0
  121. package/translations/zh.json +188 -0
  122. package/README.md +0 -3
@@ -0,0 +1,165 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@operato/input/ox-select.js';
3
+ import '@operato/popup/ox-popup-list.js';
4
+ import gql from 'graphql-tag';
5
+ import { css, html, nothing } from 'lit';
6
+ import { customElement, state } from 'lit/decorators.js';
7
+ import { client } from '@operato/graphql';
8
+ import { i18next, localize } from '@operato/i18n';
9
+ import { navigate, PageView } from '@operato/shell';
10
+ import { ScrollbarStyles } from '@operato/styles';
11
+ import { failureOf } from '../grid.js';
12
+ import { amountText } from '../words.js';
13
+ /**
14
+ * 신고 재무제표와 맞춤 — the register beside the filed balance sheet of a year, line by line (ADR-0175 decision 5): cost
15
+ * and accumulated depreciation as the register computes them and as the books carry them. Nothing is changed here; a
16
+ * difference is for the accountant to explain.
17
+ */
18
+ let AssetReconciliationPage = class AssetReconciliationPage extends localize(i18next)(PageView) {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.fiscalYear = new Date().getFullYear() - 1;
22
+ this.failure = '';
23
+ }
24
+ static { this.styles = [
25
+ ScrollbarStyles,
26
+ css `
27
+ :host {
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: var(--spacing-medium, 8px);
31
+ padding: var(--spacing-large, 12px);
32
+ overflow: auto;
33
+ }
34
+ .bar {
35
+ display: flex;
36
+ align-items: center;
37
+ gap: var(--spacing-medium, 8px);
38
+ }
39
+ .muted {
40
+ color: var(--md-sys-color-on-surface-variant);
41
+ }
42
+ table {
43
+ border-collapse: collapse;
44
+ font-size: var(--ui-t-body, 14px);
45
+ min-width: 640px;
46
+ }
47
+ th,
48
+ td {
49
+ padding: 6px 10px;
50
+ border-bottom: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));
51
+ }
52
+ th {
53
+ text-align: left;
54
+ font-weight: 600;
55
+ color: var(--md-sys-color-on-surface-variant);
56
+ }
57
+ td.num,
58
+ th.num {
59
+ text-align: right;
60
+ white-space: nowrap;
61
+ }
62
+ tr[differs] td {
63
+ background: var(--md-sys-color-error-container);
64
+ color: var(--md-sys-color-on-error-container);
65
+ }
66
+ .failure {
67
+ color: var(--md-sys-color-error);
68
+ }
69
+ `
70
+ ]; }
71
+ get context() {
72
+ return { title: i18next.t('title.asset-reconciliation') };
73
+ }
74
+ async pageUpdated(changes, lifecycle) {
75
+ if (!this.active)
76
+ return;
77
+ const year = Number(lifecycle?.params?.year);
78
+ if (year)
79
+ this.fiscalYear = year;
80
+ await this.read();
81
+ }
82
+ async read() {
83
+ this.failure = '';
84
+ try {
85
+ const response = await client.query({
86
+ query: gql `
87
+ query ($fiscalYear: Int!) {
88
+ assetReconciliation(fiscalYear: $fiscalYear) {
89
+ filed
90
+ rows { code name assets registerCost registerAccumulated statementCost statementAccumulated differs }
91
+ }
92
+ }
93
+ `,
94
+ variables: { fiscalYear: this.fiscalYear },
95
+ fetchPolicy: 'network-only'
96
+ });
97
+ if (response.errors?.length)
98
+ throw response;
99
+ this.answer = response.data.assetReconciliation;
100
+ }
101
+ catch (error) {
102
+ this.failure = failureOf(error);
103
+ }
104
+ }
105
+ render() {
106
+ const thisYear = new Date().getFullYear();
107
+ const years = Array.from({ length: 8 }, (_, at) => thisYear - at);
108
+ const a = this.answer;
109
+ return html `
110
+ <div class="bar">
111
+ <ox-select
112
+ aria-label=${i18next.t('field.asset-fiscal-year')}
113
+ .value=${String(this.fiscalYear)}
114
+ @change=${(e) => String(e.detail ?? '') !== String(this.fiscalYear) && navigate(`asset-reconciliation?year=${e.detail}`)}
115
+ >
116
+ <span slot="label">${this.fiscalYear}</span>
117
+ <ox-popup-list align-left nowrap>${years.map(year => html `<div option value=${year}>${year}</div>`)}</ox-popup-list>
118
+ </ox-select>
119
+ <span class="muted">${a && !a.filed ? i18next.t('text.asset-reconciliation-not-filed') : i18next.t('text.asset-reconciliation-note')}</span>
120
+ </div>
121
+ ${a?.rows.length
122
+ ? html `<table>
123
+ <tr>
124
+ <th>${i18next.t('field.asset-statement-code')}</th>
125
+ <th>${i18next.t('field.asset-statement-line')}</th>
126
+ <th class="num">${i18next.t('field.asset-count')}</th>
127
+ <th class="num">${i18next.t('field.asset-register-cost')}</th>
128
+ <th class="num">${i18next.t('field.asset-statement-cost')}</th>
129
+ <th class="num">${i18next.t('field.asset-register-accumulated')}</th>
130
+ <th class="num">${i18next.t('field.asset-statement-accumulated')}</th>
131
+ </tr>
132
+ ${a.rows.map(row => html `<tr ?differs=${row.differs}>
133
+ <td>${row.code}</td>
134
+ <td>${row.name}</td>
135
+ <td class="num">${row.assets}</td>
136
+ <td class="num">${amountText(row.registerCost)}</td>
137
+ <td class="num">${amountText(row.statementCost)}</td>
138
+ <td class="num">${amountText(row.registerAccumulated)}</td>
139
+ <td class="num">${amountText(row.statementAccumulated)}</td>
140
+ </tr>`)}
141
+ </table>`
142
+ : a
143
+ ? html `<div class="muted">${i18next.t('text.asset-reconciliation-empty')}</div>`
144
+ : nothing}
145
+ ${this.failure ? html `<div class="failure" role="alert">${this.failure}</div>` : nothing}
146
+ `;
147
+ }
148
+ };
149
+ __decorate([
150
+ state(),
151
+ __metadata("design:type", Object)
152
+ ], AssetReconciliationPage.prototype, "fiscalYear", void 0);
153
+ __decorate([
154
+ state(),
155
+ __metadata("design:type", Object)
156
+ ], AssetReconciliationPage.prototype, "answer", void 0);
157
+ __decorate([
158
+ state(),
159
+ __metadata("design:type", Object)
160
+ ], AssetReconciliationPage.prototype, "failure", void 0);
161
+ AssetReconciliationPage = __decorate([
162
+ customElement('asset-reconciliation')
163
+ ], AssetReconciliationPage);
164
+ export { AssetReconciliationPage };
165
+ //# sourceMappingURL=asset-reconciliation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-reconciliation.js","sourceRoot":"","sources":["../../client/pages/asset-reconciliation.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-select.js'\nimport '@operato/popup/ox-popup-list.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\n\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { navigate, PageView } from '@operato/shell'\nimport { ScrollbarStyles } from '@operato/styles'\n\nimport { failureOf } from '../grid.js'\nimport { amountText } from '../words.js'\n\n/**\n * 신고 재무제표와 맞춤 — the register beside the filed balance sheet of a year, line by line (ADR-0175 decision 5): cost\n * and accumulated depreciation as the register computes them and as the books carry them. Nothing is changed here; a\n * difference is for the accountant to explain.\n */\n@customElement('asset-reconciliation')\nexport class AssetReconciliationPage extends localize(i18next)(PageView) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-large, 12px);\n overflow: auto;\n }\n .bar {\n display: flex;\n align-items: center;\n gap: var(--spacing-medium, 8px);\n }\n .muted {\n color: var(--md-sys-color-on-surface-variant);\n }\n table {\n border-collapse: collapse;\n font-size: var(--ui-t-body, 14px);\n min-width: 640px;\n }\n th,\n td {\n padding: 6px 10px;\n border-bottom: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n }\n th {\n text-align: left;\n font-weight: 600;\n color: var(--md-sys-color-on-surface-variant);\n }\n td.num,\n th.num {\n text-align: right;\n white-space: nowrap;\n }\n tr[differs] td {\n background: var(--md-sys-color-error-container);\n color: var(--md-sys-color-on-error-container);\n }\n .failure {\n color: var(--md-sys-color-error);\n }\n `\n ]\n\n @state() fiscalYear = new Date().getFullYear() - 1\n @state() answer?: { filed: boolean; rows: any[] }\n @state() failure = ''\n\n get context() {\n return { title: i18next.t('title.asset-reconciliation') }\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active) return\n const year = Number(lifecycle?.params?.year)\n if (year) this.fiscalYear = year\n await this.read()\n }\n\n private async read() {\n this.failure = ''\n try {\n const response = await client.query({\n query: gql`\n query ($fiscalYear: Int!) {\n assetReconciliation(fiscalYear: $fiscalYear) {\n filed\n rows { code name assets registerCost registerAccumulated statementCost statementAccumulated differs }\n }\n }\n `,\n variables: { fiscalYear: this.fiscalYear },\n fetchPolicy: 'network-only'\n })\n if (response.errors?.length) throw response\n this.answer = response.data.assetReconciliation\n } catch (error) {\n this.failure = failureOf(error)\n }\n }\n\n render() {\n const thisYear = new Date().getFullYear()\n const years = Array.from({ length: 8 }, (_, at) => thisYear - at)\n const a = this.answer\n return html`\n <div class=\"bar\">\n <ox-select\n aria-label=${i18next.t('field.asset-fiscal-year')}\n .value=${String(this.fiscalYear)}\n @change=${(e: CustomEvent) => String(e.detail ?? '') !== String(this.fiscalYear) && navigate(`asset-reconciliation?year=${e.detail}`)}\n >\n <span slot=\"label\">${this.fiscalYear}</span>\n <ox-popup-list align-left nowrap>${years.map(year => html`<div option value=${year}>${year}</div>`)}</ox-popup-list>\n </ox-select>\n <span class=\"muted\">${a && !a.filed ? i18next.t('text.asset-reconciliation-not-filed') : i18next.t('text.asset-reconciliation-note')}</span>\n </div>\n ${a?.rows.length\n ? html`<table>\n <tr>\n <th>${i18next.t('field.asset-statement-code')}</th>\n <th>${i18next.t('field.asset-statement-line')}</th>\n <th class=\"num\">${i18next.t('field.asset-count')}</th>\n <th class=\"num\">${i18next.t('field.asset-register-cost')}</th>\n <th class=\"num\">${i18next.t('field.asset-statement-cost')}</th>\n <th class=\"num\">${i18next.t('field.asset-register-accumulated')}</th>\n <th class=\"num\">${i18next.t('field.asset-statement-accumulated')}</th>\n </tr>\n ${a.rows.map(\n row => html`<tr ?differs=${row.differs}>\n <td>${row.code}</td>\n <td>${row.name}</td>\n <td class=\"num\">${row.assets}</td>\n <td class=\"num\">${amountText(row.registerCost)}</td>\n <td class=\"num\">${amountText(row.statementCost)}</td>\n <td class=\"num\">${amountText(row.registerAccumulated)}</td>\n <td class=\"num\">${amountText(row.statementAccumulated)}</td>\n </tr>`\n )}\n </table>`\n : a\n ? html`<div class=\"muted\">${i18next.t('text.asset-reconciliation-empty')}</div>`\n : nothing}\n ${this.failure ? html`<div class=\"failure\" role=\"alert\">${this.failure}</div>` : nothing}\n `\n }\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import '@operato/data-grist/ox-grist.js';
2
+ import '../components/asset-documents.js';
3
+ import { PageView } from '@operato/shell';
4
+ type Tab = 'holdings' | 'seats' | 'reports' | 'requests' | 'filings';
5
+ declare const InvesteePage_base: (new (...args: any[]) => import("lit").LitElement) & typeof PageView;
6
+ /**
7
+ * 피투자회사 — one company the domain holds shares in: where the holding stands, and tab by tab its holding day by day, who
8
+ * of ours sat on its board, its reports with our part of each one's equity, what it asked of us and the filings the law
9
+ * asks of us (ADR-0175 decisions 7-10). Each tab's grid saves on its own; a row's papers open from its count.
10
+ */
11
+ export declare class InvesteePage extends InvesteePage_base {
12
+ static styles: import("lit").CSSResult[];
13
+ investeeId: string;
14
+ investee?: any;
15
+ tab: Tab;
16
+ gristConfig: any;
17
+ private grist;
18
+ get context(): {
19
+ title: any;
20
+ actions: ({
21
+ title: string;
22
+ icon: string;
23
+ action: () => void;
24
+ } | {
25
+ icon: string;
26
+ emphasis: {
27
+ raised: boolean;
28
+ outlined: boolean;
29
+ dense: boolean;
30
+ danger: boolean;
31
+ };
32
+ title: string;
33
+ action: () => Promise<void>;
34
+ })[];
35
+ };
36
+ pageUpdated(changes: any, lifecycle: any): Promise<void>;
37
+ private readInvestee;
38
+ private blank;
39
+ render(): import("lit-html").TemplateResult<1>;
40
+ private configOf;
41
+ fetchHandler(): Promise<{
42
+ total: any;
43
+ records: any;
44
+ }>;
45
+ private save;
46
+ }
47
+ export {};
@@ -0,0 +1,322 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@operato/data-grist/ox-grist.js';
3
+ import '../components/asset-documents.js';
4
+ import gql from 'graphql-tag';
5
+ import { css, html, nothing } from 'lit';
6
+ import { customElement, query, state } from 'lit/decorators.js';
7
+ import { DataGrist } from '@operato/data-grist';
8
+ import { client } from '@operato/graphql';
9
+ import { i18next, localize } from '@operato/i18n';
10
+ import { navigate, PageView } from '@operato/shell';
11
+ import { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles';
12
+ import { AssetDocuments } from '../components/asset-documents.js';
13
+ import { saveGrid } from '../grid.js';
14
+ import { amountText, CONTRIBUTIONS, fieldWord, HOLDING_REASONS, optionsOf, percentText, REPORT_KINDS, REQUEST_KINDS } from '../words.js';
15
+ const TABS = ['holdings', 'seats', 'reports', 'requests', 'filings'];
16
+ /** Each tab's grid: what it reads, what it saves and the fields a row writes (ADR-0175 decisions 7-10). */
17
+ const GRIDS = {
18
+ holdings: {
19
+ query: 'investmentHoldings',
20
+ fields: 'id recordDate ourShares totalShares ratio reason contribution amount currency description',
21
+ mutation: 'updateMultipleInvestmentHolding',
22
+ type: 'InvestmentHoldingPatch',
23
+ writes: ['recordDate', 'ourShares', 'totalShares', 'reason', 'contribution', 'amount', 'currency', 'description'],
24
+ owner: 'InvestmentHolding'
25
+ },
26
+ seats: {
27
+ query: 'investmentBoardSeats',
28
+ fields: 'id director appointedOn resignedOn description',
29
+ mutation: 'updateMultipleInvestmentBoardSeat',
30
+ type: 'InvestmentBoardSeatPatch',
31
+ writes: ['director', 'appointedOn', 'resignedOn', 'description']
32
+ },
33
+ reports: {
34
+ query: 'investmentReports',
35
+ fields: 'id periodFrom periodTo kind standard auditor signedOn receivedOn revenue netIncome shareCapital totalEquity totalAssets ourShare documents description',
36
+ mutation: 'updateMultipleInvestmentReport',
37
+ type: 'InvestmentReportPatch',
38
+ writes: ['periodFrom', 'periodTo', 'kind', 'standard', 'auditor', 'signedOn', 'receivedOn', 'revenue', 'netIncome', 'shareCapital', 'totalEquity', 'totalAssets', 'description'],
39
+ owner: 'InvestmentReport'
40
+ },
41
+ requests: {
42
+ query: 'investmentRequests',
43
+ fields: 'id kind title receivedOn dueOn sentOn signer items documents description',
44
+ mutation: 'updateMultipleInvestmentRequest',
45
+ type: 'InvestmentRequestPatch',
46
+ writes: ['kind', 'title', 'receivedOn', 'dueOn', 'sentOn', 'signer', 'items', 'description'],
47
+ owner: 'InvestmentRequest'
48
+ },
49
+ filings: {
50
+ query: 'investmentFilings',
51
+ fields: 'id name law authority dueOn filedOn documents description',
52
+ mutation: 'updateMultipleInvestmentFiling',
53
+ type: 'InvestmentFilingPatch',
54
+ writes: ['name', 'law', 'authority', 'dueOn', 'filedOn', 'description'],
55
+ owner: 'InvestmentFiling'
56
+ }
57
+ };
58
+ /**
59
+ * 피투자회사 — one company the domain holds shares in: where the holding stands, and tab by tab its holding day by day, who
60
+ * of ours sat on its board, its reports with our part of each one's equity, what it asked of us and the filings the law
61
+ * asks of us (ADR-0175 decisions 7-10). Each tab's grid saves on its own; a row's papers open from its count.
62
+ */
63
+ let InvesteePage = class InvesteePage extends localize(i18next)(PageView) {
64
+ constructor() {
65
+ super(...arguments);
66
+ this.investeeId = '';
67
+ this.tab = 'holdings';
68
+ }
69
+ static { this.styles = [
70
+ CommonGristStyles,
71
+ ScrollbarStyles,
72
+ css `
73
+ :host {
74
+ display: flex;
75
+ flex-direction: column;
76
+ overflow: hidden;
77
+ }
78
+ .head {
79
+ display: flex;
80
+ flex-wrap: wrap;
81
+ align-items: baseline;
82
+ gap: var(--spacing-small, 4px) var(--spacing-large, 12px);
83
+ padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);
84
+ }
85
+ .muted {
86
+ color: var(--md-sys-color-on-surface-variant);
87
+ }
88
+ .papers {
89
+ border: none;
90
+ background: none;
91
+ color: var(--md-sys-color-primary);
92
+ font: inherit;
93
+ cursor: pointer;
94
+ }
95
+ .tabs {
96
+ display: flex;
97
+ gap: var(--spacing-small, 4px);
98
+ overflow-x: auto;
99
+ padding: 0 var(--spacing-large, 12px) var(--spacing-medium, 8px);
100
+ }
101
+ .tabs button {
102
+ flex: none;
103
+ padding: 4px var(--spacing-large, 12px);
104
+ border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));
105
+ border-radius: 999px;
106
+ background: none;
107
+ color: var(--md-sys-color-on-surface);
108
+ font: inherit;
109
+ font-size: var(--ui-t-body, 14px);
110
+ cursor: pointer;
111
+ }
112
+ .tabs button[aria-selected='true'] {
113
+ border-color: var(--md-sys-color-primary);
114
+ background: var(--md-sys-color-primary-container);
115
+ color: var(--md-sys-color-on-primary-container);
116
+ }
117
+ ox-grist {
118
+ flex: 1;
119
+ overflow-y: auto;
120
+ }
121
+ `
122
+ ]; }
123
+ get context() {
124
+ return {
125
+ title: this.investee?.name ?? i18next.t('title.investee-page'),
126
+ actions: [
127
+ { title: i18next.t('button.add'), icon: 'add', action: () => this.grist.addRecordToTop(this.blank()) },
128
+ { title: i18next.t('button.delete'), action: () => this.save(true), ...CommonButtonStyles.delete },
129
+ { title: i18next.t('button.save'), action: () => this.save(), ...CommonButtonStyles.save }
130
+ ]
131
+ };
132
+ }
133
+ async pageUpdated(changes, lifecycle) {
134
+ if (!this.active)
135
+ return;
136
+ const tab = lifecycle?.params?.tab;
137
+ this.tab = TABS.includes(tab) ? tab : 'holdings';
138
+ const id = lifecycle?.params?.id ?? '';
139
+ if (id !== this.investeeId || changes.active) {
140
+ this.investeeId = id;
141
+ await this.readInvestee();
142
+ }
143
+ this.gristConfig = this.configOf(this.tab);
144
+ }
145
+ async readInvestee() {
146
+ if (!this.investeeId)
147
+ return;
148
+ const response = await client.query({
149
+ query: gql `
150
+ query ($id: String!) {
151
+ investee(id: $id) { id name country currency fiscalYearEndMonth reportDueMonths representative ourShares totalShares ratio }
152
+ }
153
+ `,
154
+ variables: { id: this.investeeId },
155
+ fetchPolicy: 'network-only'
156
+ });
157
+ this.investee = response.data?.investee;
158
+ this.updateContext();
159
+ }
160
+ blank() {
161
+ const today = new Date().toISOString().slice(0, 10);
162
+ switch (this.tab) {
163
+ case 'holdings':
164
+ return { recordDate: today, reason: 'SUBSCRIPTION', contribution: 'CASH', currency: this.investee?.currency };
165
+ case 'reports':
166
+ return { kind: 'AUDITED', receivedOn: today };
167
+ case 'requests':
168
+ return { kind: 'WRITTEN_RESOLUTION', receivedOn: today };
169
+ default:
170
+ return {};
171
+ }
172
+ }
173
+ render() {
174
+ const one = this.investee;
175
+ return html `
176
+ <div class="head">
177
+ ${one
178
+ ? html `<span class="muted">
179
+ ${i18next.t('text.investee-holding-now', { ours: amountText(one.ourShares), total: amountText(one.totalShares), ratio: percentText(one.ratio) })}
180
+ ${one.fiscalYearEndMonth ? ` · ${i18next.t('text.investee-year-end', { month: one.fiscalYearEndMonth })}` : ''}
181
+ ${one.currency ? ` · ${one.currency}` : ''}
182
+ </span>
183
+ <button class="papers" @click=${() => AssetDocuments.open('Investee', one.id, one.name)}>${i18next.t('button.investee-documents')}</button>`
184
+ : nothing}
185
+ </div>
186
+ <div class="tabs" role="tablist">
187
+ ${TABS.map(tab => html `<button role="tab" aria-selected=${String(this.tab === tab)} @click=${() => navigate(`investee-page?id=${this.investeeId}&tab=${tab}`)}>${i18next.t(`text.investee-tab-${tab}`)}</button>`)}
188
+ </div>
189
+ ${this.gristConfig ? html `<ox-grist .mode=${'GRID'} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>` : nothing}
190
+ `;
191
+ }
192
+ configOf(tab) {
193
+ const editable = { editable: true };
194
+ const set = `investment-${tab}`;
195
+ const text = (name, width, extra = {}) => ({ type: 'string', name, header: fieldWord(set, name), width, ...extra, record: { ...editable, ...extra.record } });
196
+ const day = (name, extra = {}) => text(name, 100, { ...extra, record: { align: 'center', ...extra.record } });
197
+ const number = (name, width = 120, extra = {}) => ({ type: 'float', name, header: fieldWord(set, name), width, ...extra, record: { ...editable, align: 'right', renderer: (value) => amountText(value), ...extra.record } });
198
+ const shown = (name, width, renderer) => ({ type: 'float', name, header: fieldWord(set, name), width, record: { align: 'right', renderer } });
199
+ const select = (name, words, codes, width = 100) => ({ type: 'select', name, header: fieldWord(set, name), width, record: { ...editable, options: optionsOf(words, codes) } });
200
+ const owner = GRIDS[tab].owner;
201
+ const papers = owner
202
+ ? [
203
+ {
204
+ type: 'number',
205
+ name: 'documents',
206
+ header: fieldWord('asset', 'documents'),
207
+ width: 60,
208
+ record: { align: 'center', renderer: (value, _c, record) => (record?.id ? (value ? `📎 ${value}` : '+') : '') },
209
+ handlers: { click: (_c, _d, _col, record) => record?.id && AssetDocuments.open(owner, record.id, this.investee?.name ?? '', () => this.grist.fetch()) }
210
+ }
211
+ ]
212
+ : [];
213
+ const columns = {
214
+ holdings: [
215
+ day('recordDate', { record: { mandatory: true } }),
216
+ number('ourShares', 110, { record: { mandatory: true } }),
217
+ number('totalShares', 120, { record: { mandatory: true } }),
218
+ shown('ratio', 80, value => percentText(value)),
219
+ select('reason', 'holding-reason', HOLDING_REASONS),
220
+ select('contribution', 'contribution', CONTRIBUTIONS, 90),
221
+ number('amount'),
222
+ text('currency', 60, { record: { align: 'center' } }),
223
+ ...papers,
224
+ text('description', 240)
225
+ ],
226
+ seats: [text('director', 140, { record: { mandatory: true } }), day('appointedOn'), day('resignedOn'), text('description', 280)],
227
+ reports: [
228
+ day('periodFrom'),
229
+ day('periodTo', { record: { mandatory: true } }),
230
+ select('kind', 'report-kind', REPORT_KINDS, 130),
231
+ day('receivedOn'),
232
+ day('signedOn'),
233
+ number('revenue'),
234
+ number('netIncome'),
235
+ number('shareCapital', 120, { hidden: true }),
236
+ number('totalEquity'),
237
+ number('totalAssets', 120, { hidden: true }),
238
+ shown('ourShare', 120, value => amountText(value)),
239
+ text('standard', 140, { hidden: true }),
240
+ text('auditor', 140),
241
+ ...papers,
242
+ text('description', 200)
243
+ ],
244
+ requests: [
245
+ select('kind', 'request-kind', REQUEST_KINDS, 120),
246
+ text('title', 220, { record: { mandatory: true } }),
247
+ day('receivedOn'),
248
+ day('dueOn'),
249
+ day('sentOn'),
250
+ text('signer', 110),
251
+ { type: 'textarea', name: 'items', header: fieldWord(set, 'items'), width: 280, record: editable },
252
+ ...papers,
253
+ text('description', 160)
254
+ ],
255
+ filings: [
256
+ text('name', 200, { record: { mandatory: true } }),
257
+ text('law', 160),
258
+ text('authority', 140),
259
+ day('dueOn'),
260
+ day('filedOn'),
261
+ ...papers,
262
+ text('description', 240)
263
+ ]
264
+ };
265
+ return {
266
+ rows: { appendable: true, selectable: { multiple: true } },
267
+ pagination: { infinite: true },
268
+ emptyNote: { title: i18next.t(`text.investee-${tab}-empty`) },
269
+ columns: [{ type: 'gutter', gutterName: 'sequence' }, { type: 'gutter', gutterName: 'row-selector', multiple: true }, ...columns[tab]]
270
+ };
271
+ }
272
+ async fetchHandler() {
273
+ if (!this.investeeId)
274
+ return { total: 0, records: [] };
275
+ const grid = GRIDS[this.tab];
276
+ const response = await client.query({
277
+ query: gql `
278
+ query ($investeeId: String!) {
279
+ rows: ${grid.query}(investeeId: $investeeId) { ${grid.fields} }
280
+ }
281
+ `,
282
+ variables: { investeeId: this.investeeId },
283
+ fetchPolicy: 'network-only'
284
+ });
285
+ if (response.errors?.length)
286
+ throw response;
287
+ return { total: response.data.rows.length, records: response.data.rows };
288
+ }
289
+ async save(deleting = false) {
290
+ const grid = GRIDS[this.tab];
291
+ if (await saveGrid(this.grist, grid.writes, grid.mutation, grid.type, { investeeId: this.investeeId }, deleting)) {
292
+ this.grist.fetch();
293
+ if (this.tab === 'holdings')
294
+ await this.readInvestee();
295
+ }
296
+ }
297
+ };
298
+ __decorate([
299
+ state(),
300
+ __metadata("design:type", Object)
301
+ ], InvesteePage.prototype, "investeeId", void 0);
302
+ __decorate([
303
+ state(),
304
+ __metadata("design:type", Object)
305
+ ], InvesteePage.prototype, "investee", void 0);
306
+ __decorate([
307
+ state(),
308
+ __metadata("design:type", String)
309
+ ], InvesteePage.prototype, "tab", void 0);
310
+ __decorate([
311
+ state(),
312
+ __metadata("design:type", Object)
313
+ ], InvesteePage.prototype, "gristConfig", void 0);
314
+ __decorate([
315
+ query('ox-grist'),
316
+ __metadata("design:type", DataGrist)
317
+ ], InvesteePage.prototype, "grist", void 0);
318
+ InvesteePage = __decorate([
319
+ customElement('investee-page')
320
+ ], InvesteePage);
321
+ export { InvesteePage };
322
+ //# sourceMappingURL=investee-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"investee-page.js","sourceRoot":"","sources":["../../client/pages/investee-page.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport '../components/asset-documents.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, nothing } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\n\nimport { DataGrist } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { navigate, PageView } from '@operato/shell'\nimport { CommonButtonStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'\n\nimport { AssetDocuments } from '../components/asset-documents.js'\nimport { saveGrid } from '../grid.js'\nimport { amountText, CONTRIBUTIONS, fieldWord, HOLDING_REASONS, optionsOf, percentText, REPORT_KINDS, REQUEST_KINDS } from '../words.js'\n\ntype Tab = 'holdings' | 'seats' | 'reports' | 'requests' | 'filings'\nconst TABS: Tab[] = ['holdings', 'seats', 'reports', 'requests', 'filings']\n\n/** Each tab's grid: what it reads, what it saves and the fields a row writes (ADR-0175 decisions 7-10). */\nconst GRIDS: Record<Tab, { query: string; fields: string; mutation: string; type: string; writes: string[]; owner?: string }> = {\n holdings: {\n query: 'investmentHoldings',\n fields: 'id recordDate ourShares totalShares ratio reason contribution amount currency description',\n mutation: 'updateMultipleInvestmentHolding',\n type: 'InvestmentHoldingPatch',\n writes: ['recordDate', 'ourShares', 'totalShares', 'reason', 'contribution', 'amount', 'currency', 'description'],\n owner: 'InvestmentHolding'\n },\n seats: {\n query: 'investmentBoardSeats',\n fields: 'id director appointedOn resignedOn description',\n mutation: 'updateMultipleInvestmentBoardSeat',\n type: 'InvestmentBoardSeatPatch',\n writes: ['director', 'appointedOn', 'resignedOn', 'description']\n },\n reports: {\n query: 'investmentReports',\n fields: 'id periodFrom periodTo kind standard auditor signedOn receivedOn revenue netIncome shareCapital totalEquity totalAssets ourShare documents description',\n mutation: 'updateMultipleInvestmentReport',\n type: 'InvestmentReportPatch',\n writes: ['periodFrom', 'periodTo', 'kind', 'standard', 'auditor', 'signedOn', 'receivedOn', 'revenue', 'netIncome', 'shareCapital', 'totalEquity', 'totalAssets', 'description'],\n owner: 'InvestmentReport'\n },\n requests: {\n query: 'investmentRequests',\n fields: 'id kind title receivedOn dueOn sentOn signer items documents description',\n mutation: 'updateMultipleInvestmentRequest',\n type: 'InvestmentRequestPatch',\n writes: ['kind', 'title', 'receivedOn', 'dueOn', 'sentOn', 'signer', 'items', 'description'],\n owner: 'InvestmentRequest'\n },\n filings: {\n query: 'investmentFilings',\n fields: 'id name law authority dueOn filedOn documents description',\n mutation: 'updateMultipleInvestmentFiling',\n type: 'InvestmentFilingPatch',\n writes: ['name', 'law', 'authority', 'dueOn', 'filedOn', 'description'],\n owner: 'InvestmentFiling'\n }\n}\n\n/**\n * 피투자회사 — one company the domain holds shares in: where the holding stands, and tab by tab its holding day by day, who\n * of ours sat on its board, its reports with our part of each one's equity, what it asked of us and the filings the law\n * asks of us (ADR-0175 decisions 7-10). Each tab's grid saves on its own; a row's papers open from its count.\n */\n@customElement('investee-page')\nexport class InvesteePage extends localize(i18next)(PageView) {\n static styles = [\n CommonGristStyles,\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .head {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--spacing-small, 4px) var(--spacing-large, 12px);\n padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n }\n .muted {\n color: var(--md-sys-color-on-surface-variant);\n }\n .papers {\n border: none;\n background: none;\n color: var(--md-sys-color-primary);\n font: inherit;\n cursor: pointer;\n }\n .tabs {\n display: flex;\n gap: var(--spacing-small, 4px);\n overflow-x: auto;\n padding: 0 var(--spacing-large, 12px) var(--spacing-medium, 8px);\n }\n .tabs button {\n flex: none;\n padding: 4px var(--spacing-large, 12px);\n border: 1px solid var(--ui-line-soft, var(--md-sys-color-outline-variant));\n border-radius: 999px;\n background: none;\n color: var(--md-sys-color-on-surface);\n font: inherit;\n font-size: var(--ui-t-body, 14px);\n cursor: pointer;\n }\n .tabs button[aria-selected='true'] {\n border-color: var(--md-sys-color-primary);\n background: var(--md-sys-color-primary-container);\n color: var(--md-sys-color-on-primary-container);\n }\n ox-grist {\n flex: 1;\n overflow-y: auto;\n }\n `\n ]\n\n @state() investeeId = ''\n @state() investee?: any\n @state() tab: Tab = 'holdings'\n @state() gristConfig: any\n @query('ox-grist') private grist!: DataGrist\n\n get context() {\n return {\n title: this.investee?.name ?? i18next.t('title.investee-page'),\n actions: [\n { title: i18next.t('button.add'), icon: 'add', action: () => this.grist.addRecordToTop(this.blank()) },\n { title: i18next.t('button.delete'), action: () => this.save(true), ...CommonButtonStyles.delete },\n { title: i18next.t('button.save'), action: () => this.save(), ...CommonButtonStyles.save }\n ]\n }\n }\n\n async pageUpdated(changes: any, lifecycle: any) {\n if (!this.active) return\n const tab = lifecycle?.params?.tab\n this.tab = TABS.includes(tab) ? tab : 'holdings'\n const id = lifecycle?.params?.id ?? ''\n if (id !== this.investeeId || changes.active) {\n this.investeeId = id\n await this.readInvestee()\n }\n this.gristConfig = this.configOf(this.tab)\n }\n\n private async readInvestee() {\n if (!this.investeeId) return\n const response = await client.query({\n query: gql`\n query ($id: String!) {\n investee(id: $id) { id name country currency fiscalYearEndMonth reportDueMonths representative ourShares totalShares ratio }\n }\n `,\n variables: { id: this.investeeId },\n fetchPolicy: 'network-only'\n })\n this.investee = response.data?.investee\n this.updateContext()\n }\n\n private blank(): any {\n const today = new Date().toISOString().slice(0, 10)\n switch (this.tab) {\n case 'holdings':\n return { recordDate: today, reason: 'SUBSCRIPTION', contribution: 'CASH', currency: this.investee?.currency }\n case 'reports':\n return { kind: 'AUDITED', receivedOn: today }\n case 'requests':\n return { kind: 'WRITTEN_RESOLUTION', receivedOn: today }\n default:\n return {}\n }\n }\n\n render() {\n const one = this.investee\n return html`\n <div class=\"head\">\n ${one\n ? html`<span class=\"muted\">\n ${i18next.t('text.investee-holding-now', { ours: amountText(one.ourShares), total: amountText(one.totalShares), ratio: percentText(one.ratio) })}\n ${one.fiscalYearEndMonth ? ` · ${i18next.t('text.investee-year-end', { month: one.fiscalYearEndMonth })}` : ''}\n ${one.currency ? ` · ${one.currency}` : ''}\n </span>\n <button class=\"papers\" @click=${() => AssetDocuments.open('Investee', one.id, one.name)}>${i18next.t('button.investee-documents')}</button>`\n : nothing}\n </div>\n <div class=\"tabs\" role=\"tablist\">\n ${TABS.map(\n tab => html`<button role=\"tab\" aria-selected=${String(this.tab === tab)} @click=${() => navigate(`investee-page?id=${this.investeeId}&tab=${tab}`)}>${i18next.t(`text.investee-tab-${tab}`)}</button>`\n )}\n </div>\n ${this.gristConfig ? html`<ox-grist .mode=${'GRID'} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>` : nothing}\n `\n }\n\n private configOf(tab: Tab) {\n const editable = { editable: true }\n const set = `investment-${tab}`\n const text = (name: string, width: number, extra: any = {}) => ({ type: 'string', name, header: fieldWord(set, name), width, ...extra, record: { ...editable, ...extra.record } })\n const day = (name: string, extra: any = {}) => text(name, 100, { ...extra, record: { align: 'center', ...extra.record } })\n const number = (name: string, width = 120, extra: any = {}) => ({ type: 'float', name, header: fieldWord(set, name), width, ...extra, record: { ...editable, align: 'right', renderer: (value: number) => amountText(value), ...extra.record } })\n const shown = (name: string, width: number, renderer: (value: any) => string) => ({ type: 'float', name, header: fieldWord(set, name), width, record: { align: 'right', renderer } })\n const select = (name: string, words: string, codes: string[], width = 100) => ({ type: 'select', name, header: fieldWord(set, name), width, record: { ...editable, options: optionsOf(words, codes) } })\n const owner = GRIDS[tab].owner\n const papers = owner\n ? [\n {\n type: 'number',\n name: 'documents',\n header: fieldWord('asset', 'documents'),\n width: 60,\n record: { align: 'center', renderer: (value: number, _c: any, record: any) => (record?.id ? (value ? `📎 ${value}` : '+') : '') },\n handlers: { click: (_c: any, _d: any, _col: any, record: any) => record?.id && AssetDocuments.open(owner, record.id, this.investee?.name ?? '', () => this.grist.fetch()) }\n }\n ]\n : []\n const columns: Record<Tab, any[]> = {\n holdings: [\n day('recordDate', { record: { mandatory: true } }),\n number('ourShares', 110, { record: { mandatory: true } }),\n number('totalShares', 120, { record: { mandatory: true } }),\n shown('ratio', 80, value => percentText(value)),\n select('reason', 'holding-reason', HOLDING_REASONS),\n select('contribution', 'contribution', CONTRIBUTIONS, 90),\n number('amount'),\n text('currency', 60, { record: { align: 'center' } }),\n ...papers,\n text('description', 240)\n ],\n seats: [text('director', 140, { record: { mandatory: true } }), day('appointedOn'), day('resignedOn'), text('description', 280)],\n reports: [\n day('periodFrom'),\n day('periodTo', { record: { mandatory: true } }),\n select('kind', 'report-kind', REPORT_KINDS, 130),\n day('receivedOn'),\n day('signedOn'),\n number('revenue'),\n number('netIncome'),\n number('shareCapital', 120, { hidden: true }),\n number('totalEquity'),\n number('totalAssets', 120, { hidden: true }),\n shown('ourShare', 120, value => amountText(value)),\n text('standard', 140, { hidden: true }),\n text('auditor', 140),\n ...papers,\n text('description', 200)\n ],\n requests: [\n select('kind', 'request-kind', REQUEST_KINDS, 120),\n text('title', 220, { record: { mandatory: true } }),\n day('receivedOn'),\n day('dueOn'),\n day('sentOn'),\n text('signer', 110),\n { type: 'textarea', name: 'items', header: fieldWord(set, 'items'), width: 280, record: editable },\n ...papers,\n text('description', 160)\n ],\n filings: [\n text('name', 200, { record: { mandatory: true } }),\n text('law', 160),\n text('authority', 140),\n day('dueOn'),\n day('filedOn'),\n ...papers,\n text('description', 240)\n ]\n }\n return {\n rows: { appendable: true, selectable: { multiple: true } },\n pagination: { infinite: true },\n emptyNote: { title: i18next.t(`text.investee-${tab}-empty`) },\n columns: [{ type: 'gutter', gutterName: 'sequence' }, { type: 'gutter', gutterName: 'row-selector', multiple: true }, ...columns[tab]]\n }\n }\n\n async fetchHandler() {\n if (!this.investeeId) return { total: 0, records: [] }\n const grid = GRIDS[this.tab]\n const response = await client.query({\n query: gql`\n query ($investeeId: String!) {\n rows: ${grid.query}(investeeId: $investeeId) { ${grid.fields} }\n }\n `,\n variables: { investeeId: this.investeeId },\n fetchPolicy: 'network-only'\n })\n if (response.errors?.length) throw response\n return { total: response.data.rows.length, records: response.data.rows }\n }\n\n private async save(deleting = false) {\n const grid = GRIDS[this.tab]\n if (await saveGrid(this.grist, grid.writes, grid.mutation, grid.type, { investeeId: this.investeeId }, deleting)) {\n this.grist.fetch()\n if (this.tab === 'holdings') await this.readInvestee()\n }\n }\n}\n\n"]}