@design.estate/dees-document 1.6.9 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist_bundle/bundle.js +622 -605
  2. package/dist_bundle/bundle.js.map +4 -4
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/classes.pdfservice.d.ts +3 -3
  5. package/dist_ts/classes.pdfservice.js +6 -3
  6. package/dist_ts/helpers.d.ts +1 -1
  7. package/dist_ts/helpers.js +2 -2
  8. package/dist_ts/paths.js +4 -2
  9. package/dist_ts/plugins.d.ts +2 -0
  10. package/dist_ts/plugins.js +3 -1
  11. package/dist_ts_shared/demoletter.d.ts +3 -3
  12. package/dist_ts_shared/demoletter.js +223 -192
  13. package/dist_ts_shared/index.d.ts +6 -7
  14. package/dist_ts_shared/index.js +10 -8
  15. package/dist_ts_shared/interfaces/document.d.ts +15 -2
  16. package/dist_ts_shared/interfaces/document.js +1 -1
  17. package/dist_ts_shared/translation.d.ts +79 -28
  18. package/dist_ts_shared/translation.js +121 -107
  19. package/dist_ts_web/00_commitinfo_data.js +2 -2
  20. package/dist_ts_web/elements/contentinvoice.js +4 -10
  21. package/dist_ts_web/elements/document.js +8 -18
  22. package/dist_ts_web/elements/letterheader.js +5 -12
  23. package/dist_ts_web/elements/page.js +10 -22
  24. package/dist_ts_web/elements/pagecontainer.js +4 -10
  25. package/dist_ts_web/elements/pagecontent.js +5 -12
  26. package/dist_ts_web/elements/pagefooter.js +6 -14
  27. package/dist_ts_web/elements/pageheader.js +6 -14
  28. package/dist_ts_web/elements/viewer.js +3 -8
  29. package/dist_ts_web/ts_shared/translation.d.ts +82 -0
  30. package/dist_ts_web/ts_shared/translation.js +134 -0
  31. package/dist_ts_web/ts_web/00_commitinfo_data.d.ts +8 -0
  32. package/dist_ts_web/ts_web/00_commitinfo_data.js +9 -0
  33. package/dist_ts_web/ts_web/elements/contentinvoice.d.ts +41 -0
  34. package/dist_ts_web/ts_web/elements/contentinvoice.js +466 -0
  35. package/dist_ts_web/ts_web/elements/document.d.ts +27 -0
  36. package/dist_ts_web/ts_web/elements/document.demo.d.ts +1 -0
  37. package/dist_ts_web/ts_web/elements/document.demo.js +9 -0
  38. package/dist_ts_web/ts_web/elements/document.js +306 -0
  39. package/dist_ts_web/ts_web/elements/index.d.ts +10 -0
  40. package/dist_ts_web/ts_web/elements/index.js +11 -0
  41. package/dist_ts_web/ts_web/elements/letterheader.d.ts +18 -0
  42. package/dist_ts_web/ts_web/elements/letterheader.js +224 -0
  43. package/dist_ts_web/ts_web/elements/page.d.ts +25 -0
  44. package/dist_ts_web/ts_web/elements/page.js +335 -0
  45. package/dist_ts_web/ts_web/elements/pagecontainer.d.ts +14 -0
  46. package/dist_ts_web/ts_web/elements/pagecontainer.js +114 -0
  47. package/dist_ts_web/ts_web/elements/pagecontent.d.ts +19 -0
  48. package/dist_ts_web/ts_web/elements/pagecontent.js +177 -0
  49. package/dist_ts_web/ts_web/elements/pagefooter.d.ts +17 -0
  50. package/dist_ts_web/ts_web/elements/pagefooter.js +234 -0
  51. package/dist_ts_web/ts_web/elements/pageheader.d.ts +17 -0
  52. package/dist_ts_web/ts_web/elements/pageheader.js +165 -0
  53. package/dist_ts_web/ts_web/elements/paymentcode.d.ts +19 -0
  54. package/dist_ts_web/ts_web/elements/paymentcode.js +162 -0
  55. package/dist_ts_web/ts_web/elements/viewer.d.ts +15 -0
  56. package/dist_ts_web/ts_web/elements/viewer.demo.d.ts +1 -0
  57. package/dist_ts_web/ts_web/elements/viewer.demo.js +9 -0
  58. package/dist_ts_web/ts_web/elements/viewer.js +150 -0
  59. package/dist_ts_web/ts_web/index.d.ts +1 -0
  60. package/dist_ts_web/ts_web/index.js +2 -0
  61. package/dist_ts_web/ts_web/pages/index.d.ts +2 -0
  62. package/dist_ts_web/ts_web/pages/index.js +3 -0
  63. package/dist_ts_web/ts_web/pages/page1.d.ts +1 -0
  64. package/dist_ts_web/ts_web/pages/page1.js +21 -0
  65. package/dist_ts_web/ts_web/pages/page2.d.ts +1 -0
  66. package/dist_ts_web/ts_web/pages/page2.js +18 -0
  67. package/dist_ts_web/ts_web/plugins.d.ts +9 -0
  68. package/dist_ts_web/ts_web/plugins.js +14 -0
  69. package/dist_ts_web/ts_web/style.d.ts +1 -0
  70. package/dist_ts_web/ts_web/style.js +38 -0
  71. package/dist_watch/bundle.js +20421 -12784
  72. package/dist_watch/bundle.js.map +4 -4
  73. package/license +2 -2
  74. package/package.json +21 -19
  75. package/readme.hints.md +40 -1
  76. package/readme.md +202 -125
  77. package/ts/00_commitinfo_data.ts +1 -1
  78. package/ts/classes.pdfservice.ts +15 -7
  79. package/ts/helpers.ts +1 -1
  80. package/ts/paths.ts +3 -1
  81. package/ts/plugins.ts +3 -0
  82. package/ts_web/00_commitinfo_data.ts +1 -1
  83. package/ts_web/elements/contentinvoice.ts +272 -250
  84. package/ts_web/elements/document.demo.ts +7 -4
  85. package/ts_web/elements/document.ts +68 -82
  86. package/ts_web/elements/index.ts +10 -9
  87. package/ts_web/elements/letterheader.ts +106 -39
  88. package/ts_web/elements/page.ts +106 -48
  89. package/ts_web/elements/pagecontainer.ts +14 -13
  90. package/ts_web/elements/pagecontent.ts +34 -53
  91. package/ts_web/elements/pagefooter.ts +125 -45
  92. package/ts_web/elements/pageheader.ts +22 -16
  93. package/ts_web/elements/paymentcode.ts +95 -0
  94. package/ts_web/elements/viewer.demo.ts +7 -4
  95. package/ts_web/elements/viewer.ts +26 -12
  96. package/ts_web/pages/page1.ts +10 -6
  97. package/ts_web/style.ts +34 -3
@@ -1,7 +1,10 @@
1
- import * as plugins from '../plugins.js';
1
+ import * as plugins from "../plugins.js";
2
2
 
3
- import { html } from '@design.estate/dees-element';
3
+ import { html } from "@design.estate/dees-element";
4
4
 
5
5
  export const demoFunc = () => html`
6
- <dedocument-dedocument .format="${'a4'}" .letterData=${plugins.shared.demoLetter}></dedocument-dedocument>
7
- `;
6
+ <dedocument-dedocument
7
+ .format="${"a4"}"
8
+ .letterData=${plugins.shared.demoLetter}
9
+ ></dedocument-dedocument>
10
+ `;
@@ -5,34 +5,34 @@ import {
5
5
  customElement,
6
6
  type TemplateResult,
7
7
  css,
8
- state,
9
- cssManager,
10
- unsafeCSS,
11
8
  domtools,
12
- } from '@design.estate/dees-element';
13
- import * as plugins from '../plugins.js';
14
-
15
- export const defaultDocumentSettings: plugins.shared.interfaces.IDocumentSettings = {
16
- enableTopDraftText: true,
17
- enableDefaultHeader: true,
18
- enableDefaultFooter: true,
19
- languageCode: 'EN',
20
- vatGroupPositions: true,
21
- };
22
-
23
-
24
- import { DePage } from './page.js';
25
- import { DeContentInvoice } from './contentinvoice.js';
26
-
27
- import { demoFunc } from './document.demo.js';
9
+ } from "@design.estate/dees-element";
10
+ import * as plugins from "../plugins.js";
11
+
12
+ export const defaultDocumentSettings: plugins.shared.interfaces.IDocumentSettings =
13
+ {
14
+ enableTopDraftText: true,
15
+ enableDefaultHeader: true,
16
+ enableDefaultFooter: true,
17
+ enableFoldMarks: true,
18
+ enableInvoiceContractRefSection: true,
19
+ languageCode: "EN",
20
+ vatGroupPositions: true,
21
+ dateStyle: "short",
22
+ };
23
+
24
+ import { DePage } from "./page.js";
25
+ import { DeContentInvoice } from "./contentinvoice.js";
26
+
27
+ import { demoFunc } from "./document.demo.js";
28
28
 
29
29
  declare global {
30
30
  interface HTMLElementTagNameMap {
31
- 'dedocument-dedocument': DeDocument;
31
+ "dedocument-dedocument": DeDocument;
32
32
  }
33
33
  }
34
34
 
35
- @customElement('dedocument-dedocument')
35
+ @customElement("dedocument-dedocument")
36
36
  export class DeDocument extends DeesElement {
37
37
  public static demo = demoFunc;
38
38
 
@@ -40,51 +40,52 @@ export class DeDocument extends DeesElement {
40
40
  type: String,
41
41
  reflect: true,
42
42
  })
43
- public format: 'a4' = 'a4';
43
+ accessor format: "a4" = "a4";
44
44
 
45
45
  @property({
46
46
  type: Number,
47
47
  reflect: true,
48
48
  })
49
- public viewWidth: number = null;
49
+ accessor viewWidth: number = null;
50
50
 
51
51
  @property({
52
52
  type: Number,
53
53
  reflect: true,
54
54
  })
55
- public viewHeight: number = null;
55
+ accessor viewHeight: number = null;
56
56
 
57
57
  @property({
58
58
  type: Boolean,
59
59
  reflect: true,
60
60
  })
61
- printMode = false;
61
+ accessor printMode = false;
62
62
 
63
63
  @property({
64
64
  type: Object,
65
65
  reflect: true,
66
66
  converter: (valueArg) => {
67
- if (typeof valueArg === 'string') {
68
- return plugins.smartjson.parseBase64(valueArg)
67
+ if (typeof valueArg === "string") {
68
+ return plugins.smartjson.parseBase64(valueArg);
69
69
  } else {
70
70
  return valueArg;
71
71
  }
72
72
  },
73
73
  })
74
- public letterData: plugins.tsclass.business.ILetter;
74
+ accessor letterData: plugins.tsclass.business.TLetter;
75
75
 
76
76
  @property({
77
77
  type: Object,
78
78
  reflect: true,
79
79
  converter: (valueArg) => {
80
- if (typeof valueArg === 'string') {
81
- return plugins.smartjson.parseBase64(valueArg)
80
+ if (typeof valueArg === "string") {
81
+ return plugins.smartjson.parseBase64(valueArg);
82
82
  } else {
83
83
  return valueArg;
84
84
  }
85
85
  },
86
86
  })
87
- public documentSettings: plugins.shared.interfaces.IDocumentSettings = defaultDocumentSettings;
87
+ accessor documentSettings: plugins.shared.interfaces.IDocumentSettings =
88
+ defaultDocumentSettings;
88
89
 
89
90
  constructor() {
90
91
  super();
@@ -96,10 +97,6 @@ export class DeDocument extends DeesElement {
96
97
  css`
97
98
  :host {
98
99
  display: block;
99
- color: #333;
100
- padding: 0px;
101
- position: relative;
102
- font-family: 'Dees Sans', sans-serif;
103
100
  }
104
101
 
105
102
  .betweenPagesSpacer {
@@ -109,41 +106,17 @@ export class DeDocument extends DeesElement {
109
106
  ];
110
107
 
111
108
  public render(): TemplateResult {
112
- return html`
113
- <div class="documentContainer"></div>
114
- `;
109
+ return html` <div class="documentContainer"></div> `;
115
110
  }
116
111
 
117
- public async firstUpdated(_changedProperties: Map<string | number | symbol, unknown>) {
112
+ public async firstUpdated(
113
+ _changedProperties: Map<string | number | symbol, unknown>
114
+ ) {
118
115
  domtools.plugins.smartdelay.delayFor(0).then(async () => {
119
116
  this.documentSettings = {
120
117
  ...defaultDocumentSettings,
121
118
  ...this.documentSettings,
122
- }
123
-
124
- while (false) {
125
- await domtools.plugins.smartdelay.delayFor(1000);
126
- this.letterData = {
127
- ...this.letterData,
128
- content: {
129
- ...this.letterData.content,
130
- invoiceData: {
131
- ...this.letterData.content.invoiceData,
132
- items: [
133
- ...this.letterData.content.invoiceData.items,
134
- {
135
- name: 'Test Item',
136
- unitQuantity: 1,
137
- unitNetPrice: 100,
138
- unitType: 'hours',
139
- vatPercentage: 19,
140
- position: 1,
141
- },
142
- ],
143
- },
144
- }
145
- }
146
- }
119
+ };
147
120
  });
148
121
  const resizeObserver = new ResizeObserver((entries) => {
149
122
  for (const entry of entries) {
@@ -156,16 +129,15 @@ export class DeDocument extends DeesElement {
156
129
  resizeObserver.observe(this);
157
130
  this.registerGarbageFunction(() => {
158
131
  resizeObserver.disconnect();
159
- })
132
+ });
160
133
  }
161
134
 
162
- public latestDocumentSettings: plugins.shared.interfaces.IDocumentSettings = null;
163
- public latestRenderedLetterData: plugins.tsclass.business.ILetter = null;
135
+ public latestDocumentSettings: plugins.shared.interfaces.IDocumentSettings =
136
+ null;
137
+ public latestRenderedLetterData: plugins.tsclass.business.TLetter = null;
164
138
  public cleanupStore: any[] = [];
165
139
 
166
-
167
140
  public async renderDocument() {
168
-
169
141
  this.latestDocumentSettings = this.documentSettings;
170
142
  this.latestRenderedLetterData = this.letterData;
171
143
 
@@ -173,7 +145,7 @@ export class DeDocument extends DeesElement {
173
145
  const cleanUpStoreNextRender = [];
174
146
 
175
147
  const domtools = await this.domtoolsPromise;
176
- const documentBuildContainer = document.createElement('div');
148
+ const documentBuildContainer = document.createElement("div");
177
149
  cleanUpStoreCurrentRender.push(documentBuildContainer);
178
150
  document.body.appendChild(documentBuildContainer);
179
151
 
@@ -184,7 +156,8 @@ export class DeDocument extends DeesElement {
184
156
  // lets append the content
185
157
  const content: DeContentInvoice = new DeContentInvoice();
186
158
  cleanUpStoreCurrentRender.push(content);
187
- content.letterData = this.letterData;
159
+ content.letterData = this
160
+ .letterData as unknown as plugins.tsclass.finance.TInvoice;
188
161
  content.documentSettings = this.documentSettings;
189
162
  document.body.appendChild(content);
190
163
 
@@ -208,7 +181,7 @@ export class DeDocument extends DeesElement {
208
181
  // store current page
209
182
  cleanUpStoreNextRender.push(newPage);
210
183
  documentBuildContainer.append(newPage);
211
-
184
+
212
185
  await currentContent.elementDomReady;
213
186
  await currentContent.trimStartToOffset(overallContentOffset);
214
187
  let newPageOverflows = await newPage.checkOverflow();
@@ -224,17 +197,18 @@ export class DeDocument extends DeesElement {
224
197
  complete = true;
225
198
  }
226
199
  }
227
-
200
+
228
201
  for (const cleanUp of this.cleanupStore) {
229
202
  cleanUp.remove();
230
203
  }
231
- this.cleanupStore = cleanUpStoreNextRender
204
+ this.cleanupStore = cleanUpStoreNextRender;
232
205
 
233
206
  cleanUpStoreCurrentRender.forEach((cleanUp) => {
234
207
  cleanUp.remove();
235
208
  });
236
209
 
237
- const documentContainer = this.shadowRoot.querySelector('.documentContainer');
210
+ const documentContainer =
211
+ this.shadowRoot.querySelector(".documentContainer");
238
212
  if (documentContainer) {
239
213
  const children = Array.from(documentContainer.children);
240
214
  children.forEach((child) => {
@@ -247,24 +221,36 @@ export class DeDocument extends DeesElement {
247
221
  documentContainer.append(page);
248
222
  // betweenPagesSpacer
249
223
  if (!this.printMode) {
250
- const betweenPagesSpacerDiv = document.createElement('div');
251
- betweenPagesSpacerDiv.classList.add('betweenPagesSpacer');
224
+ const betweenPagesSpacerDiv = document.createElement("div");
225
+ betweenPagesSpacerDiv.classList.add("betweenPagesSpacer");
252
226
  documentContainer.appendChild(betweenPagesSpacerDiv);
253
227
  }
254
228
  }
255
229
  this.adjustDePageScaling();
256
230
  }
257
231
 
258
- async updated(changedProperties: Map<string | number | symbol, unknown>): Promise<void> {
232
+ async updated(
233
+ changedProperties: Map<string | number | symbol, unknown>
234
+ ): Promise<void> {
259
235
  super.updated(changedProperties);
260
236
  const domtools = await this.domtoolsPromise;
261
- let renderedDocIsUpToDate = domtools.convenience.smartjson.deepEqualObjects(this.letterData, this.latestRenderedLetterData)
262
- && domtools.convenience.smartjson.deepEqualObjects(this.documentSettings, this.latestDocumentSettings);
237
+ let renderedDocIsUpToDate =
238
+ domtools.convenience.smartjson.deepEqualObjects(
239
+ this.letterData,
240
+ this.latestRenderedLetterData
241
+ ) &&
242
+ domtools.convenience.smartjson.deepEqualObjects(
243
+ this.documentSettings,
244
+ this.latestDocumentSettings
245
+ );
263
246
  if (!renderedDocIsUpToDate) {
264
247
  this.renderDocument();
265
248
  }
266
249
 
267
- if (changedProperties.has('viewHeight') || changedProperties.has('viewWidth')) {
250
+ if (
251
+ changedProperties.has("viewHeight") ||
252
+ changedProperties.has("viewWidth")
253
+ ) {
268
254
  this.adjustDePageScaling();
269
255
  }
270
256
  }
@@ -275,7 +261,7 @@ export class DeDocument extends DeesElement {
275
261
  }
276
262
  this.viewWidth = this.clientWidth;
277
263
  // Find all DePage instances within this DeDocument
278
- const pages = this.shadowRoot.querySelectorAll('dedocument-page');
264
+ const pages = this.shadowRoot.querySelectorAll("dedocument-page");
279
265
 
280
266
  // Update each DePage instance's viewHeight and viewWidth
281
267
  pages.forEach((page: DePage) => {
@@ -1,9 +1,10 @@
1
- export * from './contentinvoice.js';
2
- export * from './document.js';
3
- export * from './letterheader.js';
4
- export * from './page.js';
5
- export * from './pagecontainer.js';
6
- export * from './pagecontent.js';
7
- export * from './pagefooter.js';
8
- export * from './pageheader.js';
9
- export * from './viewer.js';
1
+ export * from "./contentinvoice.js";
2
+ export * from "./document.js";
3
+ export * from "./letterheader.js";
4
+ export * from "./page.js";
5
+ export * from "./pagecontainer.js";
6
+ export * from "./pagecontent.js";
7
+ export * from "./pagefooter.js";
8
+ export * from "./pageheader.js";
9
+ export * from "./viewer.js";
10
+ export * from "./paymentcode.js";
@@ -5,43 +5,51 @@ import {
5
5
  customElement,
6
6
  type TemplateResult,
7
7
  css,
8
- cssManager,
9
8
  unsafeCSS,
10
9
  domtools,
11
- } from '@design.estate/dees-element';
10
+ } from "@design.estate/dees-element";
12
11
 
13
- import * as plugins from '../plugins.js';
14
- import { dedocumentSharedStyle } from '../style.js';
12
+ import * as plugins from "../plugins.js";
13
+ import { dedocumentSharedStyle } from "../style.js";
15
14
 
16
15
  declare global {
17
16
  interface HTMLElementTagNameMap {
18
- 'dedocument-letterheader': DeLetterHeader;
17
+ "dedocument-letterheader": DeLetterHeader;
19
18
  }
20
19
  }
21
20
 
22
- @customElement('dedocument-letterheader')
21
+ @customElement("dedocument-letterheader")
23
22
  export class DeLetterHeader extends DeesElement {
24
23
  public static demo = () => html`
25
- <dedocument-letterheader .format="${'a4'}" .letterData=${plugins.shared.demoLetter}></dedocument-letterheader>
24
+ <dedocument-letterheader
25
+ .format="${"a4"}"
26
+ .letterData=${plugins.shared.demoLetter}
27
+ ></dedocument-letterheader>
26
28
  `;
27
29
 
28
30
  @property({
29
31
  type: Object,
30
- reflect: true
32
+ reflect: true,
31
33
  })
32
- public letterData: plugins.tsclass.business.ILetter;
34
+ accessor letterData: plugins.tsclass.finance.TInvoice;
33
35
 
34
36
  @property({
35
37
  type: Number,
36
38
  reflect: true,
37
39
  })
38
- public pageNumber: number = 1;
40
+ accessor pageNumber: number = 1;
39
41
 
40
42
  @property({
41
43
  type: Number,
42
44
  reflect: true,
43
45
  })
44
- public pageTotalNumber: number = 1;
46
+ accessor pageTotalNumber: number = 1;
47
+
48
+ @property({
49
+ type: Object,
50
+ reflect: true,
51
+ })
52
+ accessor documentSettings: plugins.shared.interfaces.IDocumentSettings;
45
53
 
46
54
  constructor() {
47
55
  super();
@@ -52,19 +60,29 @@ export class DeLetterHeader extends DeesElement {
52
60
  domtools.elementBasic.staticStyles,
53
61
  dedocumentSharedStyle,
54
62
  css`
55
- :host {
56
- color: #333;
63
+ .address {
64
+ position: absolute;
65
+ top: calc(var(--DPI-FACTOR) * 4.5);
66
+ left: var(--LEFT-MARGIN);
67
+ }
68
+
69
+ .date {
70
+ position: absolute;
71
+ top: calc(var(--DPI-FACTOR) * 4.5);
72
+ right: var(--RIGHT-MARGIN);
73
+ text-align: right;
57
74
  }
58
75
 
59
76
  .recepientInfo {
60
77
  position: absolute;
61
78
  display: block;
62
79
  overflow: hidden;
63
- top: 200px;
64
- right: ${unsafeCSS(plugins.shared.rightMargin + 'px')};
80
+ top: calc(var(--DPI-FACTOR) * 5.5);
81
+ right: var(--RIGHT-MARGIN);
65
82
  width: 200px;
66
83
  text-align: right;
67
84
  }
85
+
68
86
  .recepientInfo .label {
69
87
  margin-top: 10px;
70
88
  margin-bottom: 3px;
@@ -72,19 +90,6 @@ export class DeLetterHeader extends DeesElement {
72
90
  font-weight: bold;
73
91
  }
74
92
 
75
- .date {
76
- position: absolute;
77
- top: 180px;
78
- right: ${unsafeCSS(plugins.shared.rightMargin + 'px')};
79
- text-align: right;
80
- }
81
-
82
- .address {
83
- position: absolute;
84
- top: 180px;
85
- left: ${unsafeCSS(plugins.shared.leftMargin + 'px')};
86
- }
87
-
88
93
  .address .from {
89
94
  font-size: 10px;
90
95
  }
@@ -95,31 +100,93 @@ export class DeLetterHeader extends DeesElement {
95
100
  `,
96
101
  ];
97
102
 
103
+ private renderDeliveryDate(from: Date, to: Date): TemplateResult {
104
+ if (this.letterData.accountingDocType !== "invoice") return null;
105
+ const dateFormat = new Intl.DateTimeFormat(
106
+ this.documentSettings.languageCode,
107
+ { dateStyle: this.documentSettings.dateStyle }
108
+ );
109
+
110
+ let formattedFrom = from ? dateFormat.format(from) : null;
111
+ let formattedTo = to ? dateFormat.format(to) : null;
112
+
113
+ const isSameDay = formattedFrom === formattedTo;
114
+
115
+ if (isSameDay) {
116
+ return html`<div class="label">
117
+ ${plugins.shared.translation.translate(
118
+ this.documentSettings.languageCode,
119
+ "letterhead@@periodOfPerformance.day"
120
+ )}
121
+ </div>
122
+ <span> ${formattedFrom} </span>`;
123
+ } else {
124
+ return html`<div class="label">
125
+ ${plugins.shared.translation.translate(
126
+ this.documentSettings.languageCode,
127
+ "letterhead@@periodOfPerformance.range"
128
+ )}
129
+ </div>
130
+ <span> ${formattedFrom} - ${formattedTo}</span>`;
131
+ }
132
+ }
133
+
98
134
  public render(): TemplateResult {
99
135
  return html`
100
136
  <div class="date">
101
- ${new Date(this.letterData.date).getDate()}. ${new Date(this.letterData.date).toLocaleString('default', { month: 'long' })}
102
- ${new Date(this.letterData.date).getFullYear()}
137
+ ${new Intl.DateTimeFormat(this.documentSettings.languageCode, {
138
+ dateStyle: "long",
139
+ }).format(new Date(this.letterData.date))}
103
140
  </div>
104
141
  <div class="address">
105
142
  <div class="from">
106
- ${this.letterData.from.name}, ${this.letterData.from.address.streetName}
107
- ${this.letterData.from.address.houseNumber}, ${this.letterData.from.address.postalCode}
108
- ${this.letterData.from.address.city}, ${this.letterData.from.address.country}
143
+ ${this.letterData.from.name},
144
+ ${this.letterData.from.address.streetName}
145
+ ${this.letterData.from.address.houseNumber},
146
+ ${this.letterData.from.address.postalCode}
147
+ ${this.letterData.from.address.city},
148
+ ${this.letterData.from.address.country}
109
149
  </div>
110
150
  <div class="to">
111
151
  ${this.letterData.to.name}<br />
112
- ${this.letterData.to.address.streetName} ${this.letterData.to.address.houseNumber}<br />
113
- ${this.letterData.to.address.postalCode} ${this.letterData.to.address.city}<br />
152
+ ${this.letterData.to.address.streetName}
153
+ ${this.letterData.to.address.houseNumber}<br />
154
+ ${this.letterData.to.address.postalCode}
155
+ ${this.letterData.to.address.city}<br />
114
156
  ${this.letterData.from.address.country}
115
157
  </div>
116
158
  </div>
117
159
  <div class="recepientInfo">
118
- <div class="label">your customer id:</div>
119
- ${this.letterData.to.customerNumber || 'not registered'}
160
+ <div class="label">
161
+ ${plugins.shared.translation.translate(
162
+ this.documentSettings.languageCode,
163
+ "letterhead@@customer.number"
164
+ )}
165
+ </div>
166
+ ${this.letterData.to.customerNumber || "not registered"}
167
+
168
+ <div class="label">
169
+ ${plugins.shared.translation.translate(
170
+ this.documentSettings.languageCode,
171
+ "letterhead@@vat.yourId"
172
+ )}
173
+ </div>
174
+ ${this.letterData.to.registrationDetails.vatId || "not provided"}
120
175
 
121
- <div class="label">your vat id on file:</div>
122
- ${this.letterData.to.vatId || 'not provided'}
176
+ <!-- TODO: Make use of components -->
177
+ ${this.letterData.accountingDocType === "invoice"
178
+ ? html` <div class="label">
179
+ ${plugins.shared.translation.translate(
180
+ this.documentSettings.languageCode,
181
+ "letterhead@@invoice.number"
182
+ )}
183
+ </div>
184
+ ${this.letterData.id || "not registered"}`
185
+ : null}
186
+ ${this.renderDeliveryDate(
187
+ new Date(this.letterData.periodOfPerformance?.from),
188
+ new Date(this.letterData.periodOfPerformance?.to)
189
+ )}
123
190
  </div>
124
191
  `;
125
192
  }