@things-factory/asset 10.1.243 → 10.1.245

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.
@@ -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
- money('cost'),
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
- text('keeper', 90),
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
- if (await saveGrid(this.grist, FIELDS, 'updateMultipleAsset', 'AssetPatch', {}, deleting))
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":";AAAA,OAAO,iCAAiC,CAAA;AACxC,OAAO,wCAAwC,CAAA;AAC/C,OAAO,kCAAkC,CAAA;AAEzC,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE/D,OAAO,EAAE,SAAS,EAAe,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACnI,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAElI,MAAM,MAAM,GAAG;IACb,MAAM;IACN,MAAM;IACN,eAAe;IACf,YAAY;IACZ,MAAM;IACN,eAAe;IACf,QAAQ;IACR,iBAAiB;IACjB,aAAa;IACb,qBAAqB;IACrB,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,aAAa;CACd,CAAA;AAED;;;;GAIG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;aACjD,WAAM,GAAG,CAAC,qBAAqB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,CAAC,AAAlF,CAAkF;IAK/F,IAAI,OAAO;QACT,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACpC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,EAAE,EAAE;YAC9G,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE;YACtD,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE;gBACpH,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE;gBACrL,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,kBAAkB,CAAC,MAAM,EAAE;gBAClG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,kBAAkB,CAAC,IAAI,EAAE;aAC3F;YACD,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE;SAC5F,CAAA;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA,wDAAwD,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,YAAY,IAAI,CAAC,WAAW,kBAAkB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;;;gBAInK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACrC,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;QACnC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,QAAa,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACtM,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,QAAa,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAA;QAC1H,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,QAAa,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC5P,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;QAChM,IAAI,CAAC,WAAW,GAAG;YACjB,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YAC1D,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;YACjD,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,EAAE;YAC3G,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE;YAChF,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE;gBAC1C,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC9D,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;gBAClD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;oBAClC,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE;oBACvF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE;iBAChG;gBACD,GAAG,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;gBAClD,KAAK,CAAC,MAAM,CAAC;gBACb,KAAK,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACxC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,EAAE,EAAE;gBAC7K,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBAC7I,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACnJ,GAAG,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBAC5C,QAAQ,CAAC,SAAS,CAAC;gBACnB,QAAQ,CAAC,aAAa,CAAC;gBACvB,QAAQ,CAAC,WAAW,CAAC;gBACrB;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;oBACpC,KAAK,EAAE,EAAE;oBACT,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE;oBAC3E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE;iBACrG;gBACD,GAAG,CAAC,YAAY,CAAC;gBACjB,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;gBAC1D,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;gBACrB,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;gBACnB,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACtC;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,WAAW;oBACjB,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;oBACvC,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE;wBACN,KAAK,EAAE,QAAQ;wBACf,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAO,EAAE,MAAW,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;qBACrG;oBACD,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAO,EAAE,EAAO,EAAE,IAAS,EAAE,MAAW,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE;iBAChK;gBACD,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;aACzB;YACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SAC9C,CAAA;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,QAAQ,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,MAAM,EAAe;QAC5F,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;YAClC,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;OAWT;YACD,SAAS,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE;YAClG,WAAW,EAAE,cAAc;SAC5B,CAAC,CAAA;QACF,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM;YAAE,MAAM,QAAQ,CAAA;QAC3C,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK;YACpC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,EAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;SAC7F,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK;QACjC,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAC/G,CAAC;;AAvHQ;IAAR,KAAK,EAAE;;8CAAiB;AACE;IAA1B,KAAK,CAAC,UAAU,CAAC;8BAAiB,SAAS;wCAAA;AAJjC,SAAS;IADrB,aAAa,CAAC,YAAY,CAAC;GACf,SAAS,CA2HrB","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"]}