@things-factory/asset 0.0.0-stage → 10.1.229
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.
- package/dist-client/components/asset-documents.d.ts +22 -0
- package/dist-client/components/asset-documents.js +190 -0
- package/dist-client/components/asset-documents.js.map +1 -0
- package/dist-client/grid.d.ts +13 -0
- package/dist-client/grid.js +56 -0
- package/dist-client/grid.js.map +1 -0
- package/dist-client/index.d.ts +1 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/pages/asset-list.d.ts +53 -0
- package/dist-client/pages/asset-list.js +171 -0
- package/dist-client/pages/asset-list.js.map +1 -0
- package/dist-client/pages/asset-reconciliation.d.ts +25 -0
- package/dist-client/pages/asset-reconciliation.js +165 -0
- package/dist-client/pages/asset-reconciliation.js.map +1 -0
- package/dist-client/pages/investee-page.d.ts +47 -0
- package/dist-client/pages/investee-page.js +322 -0
- package/dist-client/pages/investee-page.js.map +1 -0
- package/dist-client/pages/investment-list.d.ts +53 -0
- package/dist-client/pages/investment-list.js +131 -0
- package/dist-client/pages/investment-list.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +18 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-client/words.d.ts +25 -0
- package/dist-client/words.js +23 -0
- package/dist-client/words.js.map +1 -0
- package/dist-server/attachment-reader.d.ts +3 -0
- package/dist-server/attachment-reader.js +20 -0
- package/dist-server/attachment-reader.js.map +1 -0
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +11 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/role-tasks.d.ts +2 -0
- package/dist-server/role-tasks.js +13 -0
- package/dist-server/role-tasks.js.map +1 -0
- package/dist-server/service/asset/asset-mutation.d.ts +5 -0
- package/dist-server/service/asset/asset-mutation.js +31 -0
- package/dist-server/service/asset/asset-mutation.js.map +1 -0
- package/dist-server/service/asset/asset-query.d.ts +19 -0
- package/dist-server/service/asset/asset-query.js +108 -0
- package/dist-server/service/asset/asset-query.js.map +1 -0
- package/dist-server/service/asset/asset-rules.d.ts +87 -0
- package/dist-server/service/asset/asset-rules.js +148 -0
- package/dist-server/service/asset/asset-rules.js.map +1 -0
- package/dist-server/service/asset/asset-service.d.ts +23 -0
- package/dist-server/service/asset/asset-service.js +84 -0
- package/dist-server/service/asset/asset-service.js.map +1 -0
- package/dist-server/service/asset/asset-type.d.ts +48 -0
- package/dist-server/service/asset/asset-type.js +182 -0
- package/dist-server/service/asset/asset-type.js.map +1 -0
- package/dist-server/service/asset/asset.d.ts +38 -0
- package/dist-server/service/asset/asset.js +159 -0
- package/dist-server/service/asset/asset.js.map +1 -0
- package/dist-server/service/asset/index.d.ts +6 -0
- package/dist-server/service/asset/index.js +10 -0
- package/dist-server/service/asset/index.js.map +1 -0
- package/dist-server/service/asset-document/asset-document-resolver.d.ts +32 -0
- package/dist-server/service/asset-document/asset-document-resolver.js +94 -0
- package/dist-server/service/asset-document/asset-document-resolver.js.map +1 -0
- package/dist-server/service/asset-document/asset-document-service.d.ts +34 -0
- package/dist-server/service/asset-document/asset-document-service.js +79 -0
- package/dist-server/service/asset-document/asset-document-service.js.map +1 -0
- package/dist-server/service/asset-document/index.d.ts +4 -0
- package/dist-server/service/asset-document/index.js +8 -0
- package/dist-server/service/asset-document/index.js.map +1 -0
- package/dist-server/service/checks.d.ts +12 -0
- package/dist-server/service/checks.js +27 -0
- package/dist-server/service/checks.js.map +1 -0
- package/dist-server/service/index.d.ts +18 -0
- package/dist-server/service/index.js +40 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/investment/index.d.ts +11 -0
- package/dist-server/service/investment/index.js +15 -0
- package/dist-server/service/investment/index.js.map +1 -0
- package/dist-server/service/investment/investee.d.ts +33 -0
- package/dist-server/service/investment/investee.js +135 -0
- package/dist-server/service/investment/investee.js.map +1 -0
- package/dist-server/service/investment/investment-board-seat.d.ts +25 -0
- package/dist-server/service/investment/investment-board-seat.js +98 -0
- package/dist-server/service/investment/investment-board-seat.js.map +1 -0
- package/dist-server/service/investment/investment-filing.d.ts +29 -0
- package/dist-server/service/investment/investment-filing.js +113 -0
- package/dist-server/service/investment/investment-filing.js.map +1 -0
- package/dist-server/service/investment/investment-holding.d.ts +31 -0
- package/dist-server/service/investment/investment-holding.js +127 -0
- package/dist-server/service/investment/investment-holding.js.map +1 -0
- package/dist-server/service/investment/investment-mutation.d.ts +15 -0
- package/dist-server/service/investment/investment-mutation.js +112 -0
- package/dist-server/service/investment/investment-mutation.js.map +1 -0
- package/dist-server/service/investment/investment-query.d.ts +33 -0
- package/dist-server/service/investment/investment-query.js +192 -0
- package/dist-server/service/investment/investment-query.js.map +1 -0
- package/dist-server/service/investment/investment-report.d.ts +37 -0
- package/dist-server/service/investment/investment-report.js +152 -0
- package/dist-server/service/investment/investment-report.js.map +1 -0
- package/dist-server/service/investment/investment-request.d.ts +31 -0
- package/dist-server/service/investment/investment-request.js +123 -0
- package/dist-server/service/investment/investment-request.js.map +1 -0
- package/dist-server/service/investment/investment-rules.d.ts +81 -0
- package/dist-server/service/investment/investment-rules.js +121 -0
- package/dist-server/service/investment/investment-rules.js.map +1 -0
- package/dist-server/service/investment/investment-service.d.ts +34 -0
- package/dist-server/service/investment/investment-service.js +280 -0
- package/dist-server/service/investment/investment-service.js.map +1 -0
- package/dist-server/service/investment/investment-type.d.ts +85 -0
- package/dist-server/service/investment/investment-type.js +324 -0
- package/dist-server/service/investment/investment-type.js.map +1 -0
- package/dist-server/service/patches.d.ts +24 -0
- package/dist-server/service/patches.js +63 -0
- package/dist-server/service/patches.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/package.json +49 -4
- package/things-factory.config.js +11 -0
- package/translations/en.json +187 -0
- package/translations/es.json +187 -0
- package/translations/ja.json +187 -0
- package/translations/ko.json +187 -0
- package/translations/ms.json +187 -0
- package/translations/zh.json +187 -0
- 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"]}
|