@things-factory/asset 10.1.242 → 10.1.244
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/pages/asset-list.js +28 -9
- package/dist-client/pages/asset-list.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/asset/asset-query.d.ts +2 -0
- package/dist-server/service/asset/asset-query.js +12 -1
- package/dist-server/service/asset/asset-query.js.map +1 -1
- package/dist-server/service/asset/asset-rules.d.ts +2 -0
- package/dist-server/service/asset/asset-rules.js +4 -1
- package/dist-server/service/asset/asset-rules.js.map +1 -1
- package/dist-server/service/asset/asset-service.d.ts +1 -1
- package/dist-server/service/asset/asset-service.js +28 -5
- package/dist-server/service/asset/asset-service.js.map +1 -1
- package/dist-server/service/asset/asset-type.d.ts +3 -1
- package/dist-server/service/asset/asset-type.js +10 -2
- package/dist-server/service/asset/asset-type.js.map +1 -1
- package/dist-server/service/asset/asset.d.ts +5 -1
- package/dist-server/service/asset/asset.js +18 -3
- package/dist-server/service/asset/asset.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -7
- package/translations/en.json +6 -2
- package/translations/es.json +6 -2
- package/translations/ja.json +6 -2
- package/translations/ko.json +6 -2
- package/translations/ms.json +6 -2
- package/translations/zh.json +6 -2
|
@@ -5,7 +5,7 @@ import '../components/asset-documents.js';
|
|
|
5
5
|
import gql from 'graphql-tag';
|
|
6
6
|
import { html } from 'lit';
|
|
7
7
|
import { customElement, query, state } from 'lit/decorators.js';
|
|
8
|
-
import { DataGrist } from '@operato/data-grist';
|
|
8
|
+
import { DataGrist, getEditor } from '@operato/data-grist';
|
|
9
9
|
import { client } from '@operato/graphql';
|
|
10
10
|
import { i18next, localize } from '@operato/i18n';
|
|
11
11
|
import { navigate, PageView } from '@operato/shell';
|
|
@@ -19,6 +19,8 @@ const FIELDS = [
|
|
|
19
19
|
'kind',
|
|
20
20
|
'statementCode',
|
|
21
21
|
'acquiredOn',
|
|
22
|
+
'serialNo',
|
|
23
|
+
'capitalized',
|
|
22
24
|
'cost',
|
|
23
25
|
'residualValue',
|
|
24
26
|
'method',
|
|
@@ -47,7 +49,7 @@ let AssetList = class AssetList extends localize(i18next)(PageView) {
|
|
|
47
49
|
filter: { handler: () => this.grist.toggleHeadroom() },
|
|
48
50
|
actions: [
|
|
49
51
|
{ title: i18next.t('button.asset-reconciliation'), icon: 'balance', action: () => navigate('asset-reconciliation') },
|
|
50
|
-
{ title: i18next.t('button.add'), icon: 'add', action: () => this.grist.addRecordToTop({ kind: 'MACHINERY', status: 'IN_USE', method: 'STRAIGHT_LINE', cost: 0, residualValue: 0 }) },
|
|
52
|
+
{ title: i18next.t('button.add'), icon: 'add', action: () => this.grist.addRecordToTop({ kind: 'MACHINERY', status: 'IN_USE', method: 'STRAIGHT_LINE', capitalized: true, cost: 0, residualValue: 0 }) },
|
|
51
53
|
{ title: i18next.t('button.delete'), action: () => this.save(true), ...CommonButtonStyles.delete },
|
|
52
54
|
{ title: i18next.t('button.save'), action: () => this.save(), ...CommonButtonStyles.save }
|
|
53
55
|
],
|
|
@@ -67,9 +69,9 @@ let AssetList = class AssetList extends localize(i18next)(PageView) {
|
|
|
67
69
|
const text = (name, width, extra = {}) => ({ type: 'string', name, header: fieldWord('asset', name), width, sortable: true, ...extra, record: { ...editable, ...extra.record } });
|
|
68
70
|
const day = (name, extra = {}) => text(name, 100, { record: { align: 'center', ...extra.record }, ...extra });
|
|
69
71
|
const money = (name, extra = {}) => ({ type: 'float', name, header: fieldWord('asset', name), width: 120, sortable: true, ...extra, record: { ...editable, align: 'right', renderer: (value) => amountText(value), ...extra.record } });
|
|
70
|
-
const computed = (name) => ({ type: 'float', name, header: fieldWord('asset', name, { year }), width: 120, record: { align: 'right', renderer: (value) => amountText(value) } });
|
|
72
|
+
const computed = (name) => ({ type: 'float', name, header: fieldWord('asset', name, { year }), width: 120, accumulator: 'sum', record: { align: 'right', renderer: (value) => amountText(value) } });
|
|
71
73
|
this.gristConfig = {
|
|
72
|
-
rows: { appendable: true, selectable: { multiple: true } },
|
|
74
|
+
rows: { appendable: true, selectable: { multiple: true }, accumulator: true },
|
|
73
75
|
pagination: { limit: 100, pages: [50, 100, 500] },
|
|
74
76
|
emptyNote: { title: i18next.t('text.asset-empty'), description: i18next.t('text.asset-empty-description') },
|
|
75
77
|
list: { fields: ['name', 'kind'], details: ['acquiredOn', 'cost', 'bookValue'] },
|
|
@@ -87,7 +89,16 @@ let AssetList = class AssetList extends localize(i18next)(PageView) {
|
|
|
87
89
|
filter: { type: 'select', operator: 'eq', options: filterOptionsOf('asset-kind', ASSET_KINDS) }
|
|
88
90
|
},
|
|
89
91
|
day('acquiredOn', { record: { mandatory: true } }),
|
|
90
|
-
|
|
92
|
+
text('serialNo', 120),
|
|
93
|
+
{
|
|
94
|
+
type: 'checkbox',
|
|
95
|
+
name: 'capitalized',
|
|
96
|
+
header: fieldWord('asset', 'capitalized'),
|
|
97
|
+
width: 70,
|
|
98
|
+
record: { ...editable, align: 'center' },
|
|
99
|
+
filter: true
|
|
100
|
+
},
|
|
101
|
+
money('cost', { accumulator: 'sum' }),
|
|
91
102
|
money('residualValue', { hidden: true }),
|
|
92
103
|
{ type: 'select', name: 'method', header: fieldWord('asset', 'method'), width: 90, record: { ...editable, options: optionsOf('depreciation-method', DEPRECIATION_METHODS) } },
|
|
93
104
|
{ type: 'float', name: 'usefulLifeYears', header: fieldWord('asset', 'usefulLifeYears'), width: 70, record: { ...editable, align: 'right' } },
|
|
@@ -108,7 +119,13 @@ let AssetList = class AssetList extends localize(i18next)(PageView) {
|
|
|
108
119
|
day('disposedOn'),
|
|
109
120
|
text('statementCode', 70, { record: { align: 'center' } }),
|
|
110
121
|
text('location', 120),
|
|
111
|
-
|
|
122
|
+
{
|
|
123
|
+
type: 'object',
|
|
124
|
+
name: 'keeper',
|
|
125
|
+
header: fieldWord('asset', 'keeper'),
|
|
126
|
+
width: 100,
|
|
127
|
+
record: { editable: true, editor: getEditor('resource-object'), options: { queryName: 'employees', select: [{ name: 'id', hidden: true }, { name: 'name', width: 160 }, { name: 'controlNo', header: i18next.t('field.control-no'), width: 100 }] } }
|
|
128
|
+
},
|
|
112
129
|
text('source', 180),
|
|
113
130
|
text('project', 140, { hidden: true }),
|
|
114
131
|
{
|
|
@@ -133,8 +150,8 @@ let AssetList = class AssetList extends localize(i18next)(PageView) {
|
|
|
133
150
|
query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {
|
|
134
151
|
responses: assets(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {
|
|
135
152
|
items {
|
|
136
|
-
id name kind statementCode acquiredOn cost residualValue method usefulLifeYears declineRate depreciationStartOn
|
|
137
|
-
status disposedOn location keeper source project description documents
|
|
153
|
+
id name kind statementCode acquiredOn serialNo capitalized cost residualValue method usefulLifeYears declineRate depreciationStartOn
|
|
154
|
+
status disposedOn location keeper { id name } source project description documents
|
|
138
155
|
year { expense accumulated bookValue }
|
|
139
156
|
}
|
|
140
157
|
total
|
|
@@ -152,7 +169,9 @@ let AssetList = class AssetList extends localize(i18next)(PageView) {
|
|
|
152
169
|
};
|
|
153
170
|
}
|
|
154
171
|
async save(deleting = false) {
|
|
155
|
-
|
|
172
|
+
/* The keeper is an employee; the patch names it by id. */
|
|
173
|
+
const shape = ({ keeper, ...patch }) => ({ ...patch, ...(keeper === undefined ? {} : { keeperId: keeper?.id ?? null }) });
|
|
174
|
+
if (await saveGrid(this.grist, FIELDS, 'updateMultipleAsset', 'AssetPatch', {}, deleting, shape))
|
|
156
175
|
this.grist.fetch();
|
|
157
176
|
}
|
|
158
177
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-list.js","sourceRoot":"","sources":["../../client/pages/asset-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '../components/asset-documents.js'\n\nimport gql from 'graphql-tag'\nimport { html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\n\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { navigate, PageView } from '@operato/shell'\nimport { CommonButtonStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { AssetDocuments } from '../components/asset-documents.js'\nimport { saveGrid } from '../grid.js'\nimport { amountText, ASSET_KINDS, ASSET_STATUSES, DEPRECIATION_METHODS, fieldWord, filterOptionsOf, optionsOf } from '../words.js'\n\nconst FIELDS = [\n 'name',\n 'kind',\n 'statementCode',\n 'acquiredOn',\n 'cost',\n 'residualValue',\n 'method',\n 'usefulLifeYears',\n 'declineRate',\n 'depreciationStartOn',\n 'status',\n 'disposedOn',\n 'location',\n 'keeper',\n 'source',\n 'project',\n 'description'\n]\n\n/**\n * 자산 대장 — the domain's tangible and intangible assets (ADR-0175 decisions 3-4), typed like a spreadsheet and saved\n * together. This year's depreciation, its accumulated amount and the book value are computed from each row. The papers of\n * a row open from its count.\n */\n@customElement('asset-list')\nexport class AssetList extends localize(i18next)(PageView) {\n static styles = [WorkSurfacePageStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles]\n\n @state() gristConfig: any\n @query('ox-grist') private grist!: DataGrist\n\n get context() {\n return {\n title: i18next.t('title.asset-list'),\n search: { handler: (search: string) => (this.grist.searchText = search), value: this.grist?.searchText || '' },\n filter: { handler: () => this.grist.toggleHeadroom() },\n actions: [\n { title: i18next.t('button.asset-reconciliation'), icon: 'balance', action: () => navigate('asset-reconciliation') },\n { title: i18next.t('button.add'), icon: 'add', action: () => this.grist.addRecordToTop({ kind: 'MACHINERY', status: 'IN_USE', method: 'STRAIGHT_LINE', cost: 0, residualValue: 0 }) },\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 exportable: { name: i18next.t('title.asset-list'), data: () => this.grist.exportRecords() }\n }\n }\n\n render() {\n return html`<ox-grist class=\"page-fill\" search-mode=\"term\" .mode=${isMobileDevice() ? 'CARD' : 'GRID'} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\"><ox-filters-form without-search autofocus></ox-filters-form></div>\n </div>\n </ox-grist>`\n }\n\n async pageInitialized() {\n const year = new Date().getFullYear()\n const editable = { editable: true }\n const text = (name: string, width: number, extra: any = {}) => ({ type: 'string', name, header: fieldWord('asset', name), width, sortable: true, ...extra, record: { ...editable, ...extra.record } })\n const day = (name: string, extra: any = {}) => text(name, 100, { record: { align: 'center', ...extra.record }, ...extra })\n const money = (name: string, extra: any = {}) => ({ type: 'float', name, header: fieldWord('asset', name), width: 120, sortable: true, ...extra, record: { ...editable, align: 'right', renderer: (value: number) => amountText(value), ...extra.record } })\n const computed = (name: string) => ({ type: 'float', name, header: fieldWord('asset', name, { year }), width: 120, record: { align: 'right', renderer: (value: number) => amountText(value) } })\n this.gristConfig = {\n rows: { appendable: true, selectable: { multiple: true } },\n pagination: { limit: 100, pages: [50, 100, 500] },\n emptyNote: { title: i18next.t('text.asset-empty'), description: i18next.t('text.asset-empty-description') },\n list: { fields: ['name', 'kind'], details: ['acquiredOn', 'cost', 'bookValue'] },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n text('name', 180, { record: { mandatory: true } }),\n {\n type: 'select',\n name: 'kind',\n header: fieldWord('asset', 'kind'),\n width: 100,\n sortable: true,\n record: { ...editable, mandatory: true, options: optionsOf('asset-kind', ASSET_KINDS) },\n filter: { type: 'select', operator: 'eq', options: filterOptionsOf('asset-kind', ASSET_KINDS) }\n },\n day('acquiredOn', { record: { mandatory: true } }),\n money('cost'),\n money('residualValue', { hidden: true }),\n { type: 'select', name: 'method', header: fieldWord('asset', 'method'), width: 90, record: { ...editable, options: optionsOf('depreciation-method', DEPRECIATION_METHODS) } },\n { type: 'float', name: 'usefulLifeYears', header: fieldWord('asset', 'usefulLifeYears'), width: 70, record: { ...editable, align: 'right' } },\n { type: 'float', name: 'declineRate', header: fieldWord('asset', 'declineRate'), width: 70, hidden: true, record: { ...editable, align: 'right' } },\n day('depreciationStartOn', { hidden: true }),\n computed('expense'),\n computed('accumulated'),\n computed('bookValue'),\n {\n type: 'select',\n name: 'status',\n header: fieldWord('asset', 'status'),\n width: 80,\n sortable: true,\n record: { ...editable, options: optionsOf('asset-status', ASSET_STATUSES) },\n filter: { type: 'select', operator: 'eq', options: filterOptionsOf('asset-status', ASSET_STATUSES) }\n },\n day('disposedOn'),\n text('statementCode', 70, { record: { align: 'center' } }),\n text('location', 120),\n text('keeper', 90),\n text('source', 180),\n text('project', 140, { hidden: true }),\n {\n type: 'number',\n name: 'documents',\n header: fieldWord('asset', 'documents'),\n width: 60,\n record: {\n align: 'center',\n renderer: (value: number, _c: any, record: any) => (record?.id ? (value ? `📎 ${value}` : '+') : '')\n },\n handlers: { click: (_c: any, _d: any, _col: any, record: any) => record?.id && AssetDocuments.open('Asset', record.id, record.name, () => this.grist.fetch()) }\n },\n text('description', 200)\n ],\n sorters: [{ name: 'acquiredOn', desc: true }]\n }\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [], search }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {\n responses: assets(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {\n items {\n id name kind statementCode acquiredOn cost residualValue method usefulLifeYears declineRate depreciationStartOn\n status disposedOn location keeper source project description documents\n year { expense accumulated bookValue }\n }\n total\n }\n }\n `,\n variables: { filters, pagination: { page, limit }, sortings, search: search?.trim() || undefined },\n fetchPolicy: 'network-only'\n })\n if (response.errors?.length) throw response\n return {\n total: response.data.responses.total,\n records: response.data.responses.items.map(({ year, ...one }: any) => ({ ...one, ...year }))\n }\n }\n\n private async save(deleting = false) {\n if (await saveGrid(this.grist, FIELDS, 'updateMultipleAsset', 'AssetPatch', {}, deleting)) this.grist.fetch()\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"asset-list.js","sourceRoot":"","sources":["../../client/pages/asset-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\nimport '../components/asset-documents.js'\n\nimport gql from 'graphql-tag'\nimport { html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\n\nimport { DataGrist, FetchOption, getEditor } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { navigate, PageView } from '@operato/shell'\nimport { CommonButtonStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { AssetDocuments } from '../components/asset-documents.js'\nimport { saveGrid } from '../grid.js'\nimport { amountText, ASSET_KINDS, ASSET_STATUSES, DEPRECIATION_METHODS, fieldWord, filterOptionsOf, optionsOf } from '../words.js'\n\nconst FIELDS = [\n 'name',\n 'kind',\n 'statementCode',\n 'acquiredOn',\n 'serialNo',\n 'capitalized',\n 'cost',\n 'residualValue',\n 'method',\n 'usefulLifeYears',\n 'declineRate',\n 'depreciationStartOn',\n 'status',\n 'disposedOn',\n 'location',\n 'keeper',\n 'source',\n 'project',\n 'description'\n]\n\n/**\n * 자산 대장 — the domain's tangible and intangible assets (ADR-0175 decisions 3-4), typed like a spreadsheet and saved\n * together. This year's depreciation, its accumulated amount and the book value are computed from each row. The papers of\n * a row open from its count.\n */\n@customElement('asset-list')\nexport class AssetList extends localize(i18next)(PageView) {\n static styles = [WorkSurfacePageStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles]\n\n @state() gristConfig: any\n @query('ox-grist') private grist!: DataGrist\n\n get context() {\n return {\n title: i18next.t('title.asset-list'),\n search: { handler: (search: string) => (this.grist.searchText = search), value: this.grist?.searchText || '' },\n filter: { handler: () => this.grist.toggleHeadroom() },\n actions: [\n { title: i18next.t('button.asset-reconciliation'), icon: 'balance', action: () => navigate('asset-reconciliation') },\n { title: i18next.t('button.add'), icon: 'add', action: () => this.grist.addRecordToTop({ kind: 'MACHINERY', status: 'IN_USE', method: 'STRAIGHT_LINE', capitalized: true, cost: 0, residualValue: 0 }) },\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 exportable: { name: i18next.t('title.asset-list'), data: () => this.grist.exportRecords() }\n }\n }\n\n render() {\n return html`<ox-grist class=\"page-fill\" search-mode=\"term\" .mode=${isMobileDevice() ? 'CARD' : 'GRID'} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\"><ox-filters-form without-search autofocus></ox-filters-form></div>\n </div>\n </ox-grist>`\n }\n\n async pageInitialized() {\n const year = new Date().getFullYear()\n const editable = { editable: true }\n const text = (name: string, width: number, extra: any = {}) => ({ type: 'string', name, header: fieldWord('asset', name), width, sortable: true, ...extra, record: { ...editable, ...extra.record } })\n const day = (name: string, extra: any = {}) => text(name, 100, { record: { align: 'center', ...extra.record }, ...extra })\n const money = (name: string, extra: any = {}) => ({ type: 'float', name, header: fieldWord('asset', name), width: 120, sortable: true, ...extra, record: { ...editable, align: 'right', renderer: (value: number) => amountText(value), ...extra.record } })\n const computed = (name: string) => ({ type: 'float', name, header: fieldWord('asset', name, { year }), width: 120, accumulator: 'sum', record: { align: 'right', renderer: (value: number) => amountText(value) } })\n this.gristConfig = {\n rows: { appendable: true, selectable: { multiple: true }, accumulator: true },\n pagination: { limit: 100, pages: [50, 100, 500] },\n emptyNote: { title: i18next.t('text.asset-empty'), description: i18next.t('text.asset-empty-description') },\n list: { fields: ['name', 'kind'], details: ['acquiredOn', 'cost', 'bookValue'] },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n text('name', 180, { record: { mandatory: true } }),\n {\n type: 'select',\n name: 'kind',\n header: fieldWord('asset', 'kind'),\n width: 100,\n sortable: true,\n record: { ...editable, mandatory: true, options: optionsOf('asset-kind', ASSET_KINDS) },\n filter: { type: 'select', operator: 'eq', options: filterOptionsOf('asset-kind', ASSET_KINDS) }\n },\n day('acquiredOn', { record: { mandatory: true } }),\n text('serialNo', 120),\n {\n type: 'checkbox',\n name: 'capitalized',\n header: fieldWord('asset', 'capitalized'),\n width: 70,\n record: { ...editable, align: 'center' },\n filter: true\n },\n money('cost', { accumulator: 'sum' }),\n money('residualValue', { hidden: true }),\n { type: 'select', name: 'method', header: fieldWord('asset', 'method'), width: 90, record: { ...editable, options: optionsOf('depreciation-method', DEPRECIATION_METHODS) } },\n { type: 'float', name: 'usefulLifeYears', header: fieldWord('asset', 'usefulLifeYears'), width: 70, record: { ...editable, align: 'right' } },\n { type: 'float', name: 'declineRate', header: fieldWord('asset', 'declineRate'), width: 70, hidden: true, record: { ...editable, align: 'right' } },\n day('depreciationStartOn', { hidden: true }),\n computed('expense'),\n computed('accumulated'),\n computed('bookValue'),\n {\n type: 'select',\n name: 'status',\n header: fieldWord('asset', 'status'),\n width: 80,\n sortable: true,\n record: { ...editable, options: optionsOf('asset-status', ASSET_STATUSES) },\n filter: { type: 'select', operator: 'eq', options: filterOptionsOf('asset-status', ASSET_STATUSES) }\n },\n day('disposedOn'),\n text('statementCode', 70, { record: { align: 'center' } }),\n text('location', 120),\n {\n type: 'object',\n name: 'keeper',\n header: fieldWord('asset', 'keeper'),\n width: 100,\n record: { editable: true, editor: getEditor('resource-object'), options: { queryName: 'employees', select: [{ name: 'id', hidden: true }, { name: 'name', width: 160 }, { name: 'controlNo', header: i18next.t('field.control-no'), width: 100 }] } }\n },\n text('source', 180),\n text('project', 140, { hidden: true }),\n {\n type: 'number',\n name: 'documents',\n header: fieldWord('asset', 'documents'),\n width: 60,\n record: {\n align: 'center',\n renderer: (value: number, _c: any, record: any) => (record?.id ? (value ? `📎 ${value}` : '+') : '')\n },\n handlers: { click: (_c: any, _d: any, _col: any, record: any) => record?.id && AssetDocuments.open('Asset', record.id, record.name, () => this.grist.fetch()) }\n },\n text('description', 200)\n ],\n sorters: [{ name: 'acquiredOn', desc: true }]\n }\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [], search }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {\n responses: assets(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {\n items {\n id name kind statementCode acquiredOn serialNo capitalized cost residualValue method usefulLifeYears declineRate depreciationStartOn\n status disposedOn location keeper { id name } source project description documents\n year { expense accumulated bookValue }\n }\n total\n }\n }\n `,\n variables: { filters, pagination: { page, limit }, sortings, search: search?.trim() || undefined },\n fetchPolicy: 'network-only'\n })\n if (response.errors?.length) throw response\n return {\n total: response.data.responses.total,\n records: response.data.responses.items.map(({ year, ...one }: any) => ({ ...one, ...year }))\n }\n }\n\n private async save(deleting = false) {\n /* The keeper is an employee; the patch names it by id. */\n const shape = ({ keeper, ...patch }: any) => ({ ...patch, ...(keeper === undefined ? {} : { keeperId: keeper?.id ?? null }) })\n if (await saveGrid(this.grist, FIELDS, 'updateMultipleAsset', 'AssetPatch', {}, deleting, shape)) this.grist.fetch()\n }\n}\n\n"]}
|