Skip to content

Commit 29519c5

Browse files
authored
Merge pull request #189 from com-pas/add-label-during-save
Add labels when saving a SCL File
2 parents 5af0978 + 0824261 commit 29519c5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2269
-789
lines changed

src/compas-editors/CompasVersions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,14 +367,14 @@ export default class CompasVersionsPlugin extends LitElement {
367367

368368
private getCurrentVersion(): string {
369369
const header = this.doc.querySelector('Header');
370-
return header!.getAttribute('version') ?? 'unknown';
370+
return header?.getAttribute('version') ?? 'unknown';
371371
}
372372

373373
private getCurrentName(): string {
374374
const sclName = this.doc.querySelector(
375375
'SCL > Private[type="compas_scl"] > SclName'
376376
);
377-
return sclName!.textContent ?? 'unknown';
377+
return sclName?.textContent ?? 'unknown';
378378
}
379379

380380
private renderLineInfo(item: Element): TemplateResult {
Lines changed: 107 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,142 @@
1-
import {CompasSettings} from "../compas/CompasSettings.js";
2-
import {extractSclFromResponse, handleError, handleResponse, parseXml} from "./foundation.js";
1+
import { formatXml } from '../file.js';
32

4-
export const SDS_NAMESPACE = 'https://www.lfenergy.org/compas/SclDataService/v1';
3+
import { CompasSettings } from '../compas/CompasSettings.js';
4+
import {
5+
extractSclFromResponse,
6+
handleError,
7+
handleResponse,
8+
parseXml,
9+
} from './foundation.js';
10+
11+
export const SDS_NAMESPACE =
12+
'https://www.lfenergy.org/compas/SclDataService/v1';
513

614
export enum ChangeSet {
7-
MAJOR = "MAJOR",
8-
MINOR = "MINOR",
9-
PATCH = "PATCH",
15+
MAJOR = 'MAJOR',
16+
MINOR = 'MINOR',
17+
PATCH = 'PATCH',
1018
}
1119

1220
export interface CreateRequestBody {
13-
sclName: string,
14-
comment: string,
15-
doc: Document
21+
sclName: string;
22+
comment: string | null;
23+
doc: Document;
1624
}
1725

1826
export interface UpdateRequestBody {
19-
changeSet: ChangeSet,
20-
comment: string,
21-
doc: Document
27+
changeSet: ChangeSet;
28+
comment: string | null;
29+
doc: Document;
2230
}
2331

2432
export function CompasSclDataService() {
25-
2633
function getCompasSettings() {
2734
return CompasSettings().compasSettings;
2835
}
2936

3037
return {
3138
listSclTypes(): Promise<Document> {
32-
const sclUrl = getCompasSettings().sclDataServiceUrl + '/common/v1/type/list';
39+
const sclUrl =
40+
getCompasSettings().sclDataServiceUrl + '/common/v1/type/list';
3341
return fetch(sclUrl)
3442
.catch(handleError)
3543
.then(handleResponse)
3644
.then(parseXml);
3745
},
3846

3947
listSclTypesAndOrder(): Promise<Element[]> {
40-
return this.listSclTypes()
41-
.then(xmlResponse => {
42-
return Array.from(xmlResponse.querySelectorAll('*|Type') ?? [])
43-
.sort((type1, type2) => {
44-
const description1 = type1.getElementsByTagNameNS(SDS_NAMESPACE, "Description")!.item(0)!.textContent ?? "";
45-
const description2 = type2.getElementsByTagNameNS(SDS_NAMESPACE, "Description")!.item(0)!.textContent ?? "";
46-
return description1.localeCompare(description2)
47-
});
48-
})
48+
return this.listSclTypes().then(xmlResponse => {
49+
return Array.from(xmlResponse.querySelectorAll('*|Type') ?? []).sort(
50+
(type1, type2) => {
51+
const description1 =
52+
type1
53+
.getElementsByTagNameNS(SDS_NAMESPACE, 'Description')!
54+
.item(0)!.textContent ?? '';
55+
const description2 =
56+
type2
57+
.getElementsByTagNameNS(SDS_NAMESPACE, 'Description')!
58+
.item(0)!.textContent ?? '';
59+
return description1.localeCompare(description2);
60+
}
61+
);
62+
});
4963
},
5064

5165
listScls(type: string): Promise<Document> {
52-
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/list';
66+
const sclUrl =
67+
getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/list';
5368
return fetch(sclUrl)
5469
.catch(handleError)
5570
.then(handleResponse)
5671
.then(parseXml);
5772
},
5873

5974
listVersions(type: string, id: string): Promise<Document> {
60-
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/' + id + "/versions";
75+
const sclUrl =
76+
getCompasSettings().sclDataServiceUrl +
77+
'/scl/v1/' +
78+
type +
79+
'/' +
80+
id +
81+
'/versions';
6182
return fetch(sclUrl)
6283
.catch(handleError)
6384
.then(handleResponse)
6485
.then(parseXml);
6586
},
6687

6788
getSclDocument(type: string, id: string): Promise<Document> {
68-
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/' + id;
89+
const sclUrl =
90+
getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/' + id;
6991
return fetch(sclUrl)
7092
.catch(handleError)
7193
.then(handleResponse)
7294
.then(parseXml)
7395
.then(extractSclFromResponse);
7496
},
7597

76-
getSclDocumentVersion(type: string, id: string, version: string): Promise<Document> {
77-
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/' + id + '/' + version;
98+
getSclDocumentVersion(
99+
type: string,
100+
id: string,
101+
version: string
102+
): Promise<Document> {
103+
const sclUrl =
104+
getCompasSettings().sclDataServiceUrl +
105+
'/scl/v1/' +
106+
type +
107+
'/' +
108+
id +
109+
'/' +
110+
version;
78111
return fetch(sclUrl)
79112
.catch(handleError)
80113
.then(handleResponse)
81114
.then(parseXml)
82115
.then(extractSclFromResponse);
83116
},
84117

85-
deleteSclDocumentVersion(type: string, id: string, version: string): Promise<string> {
86-
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/' + id + '/' + version;
87-
return fetch(sclUrl, {method: 'DELETE'})
118+
deleteSclDocumentVersion(
119+
type: string,
120+
id: string,
121+
version: string
122+
): Promise<string> {
123+
const sclUrl =
124+
getCompasSettings().sclDataServiceUrl +
125+
'/scl/v1/' +
126+
type +
127+
'/' +
128+
id +
129+
'/' +
130+
version;
131+
return fetch(sclUrl, { method: 'DELETE' })
88132
.catch(handleError)
89133
.then(handleResponse);
90134
},
91135

92136
deleteSclDocument(type: string, id: string): Promise<string> {
93-
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/' + id;
94-
return fetch(sclUrl, {method: 'DELETE'})
137+
const sclUrl =
138+
getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/' + id;
139+
return fetch(sclUrl, { method: 'DELETE' })
95140
.catch(handleError)
96141
.then(handleResponse);
97142
},
@@ -101,37 +146,52 @@ export function CompasSclDataService() {
101146
return fetch(sclUrl, {
102147
method: 'POST',
103148
headers: {
104-
'Content-Type': 'application/xml'
149+
'Content-Type': 'application/xml',
105150
},
106151
body: `<?xml version="1.0" encoding="UTF-8"?>
107152
<sds:CreateRequest xmlns:sds="${SDS_NAMESPACE}">
108153
<sds:Name>${body.sclName}</sds:Name>
109-
<sds:Comment>${body.comment}</sds:Comment>
110-
<sds:SclData><![CDATA[${new XMLSerializer().serializeToString(body.doc.documentElement)}]]></sds:SclData>
111-
</sds:CreateRequest>`
112-
}).catch(handleError)
154+
<sds:Comment>${body.comment ?? ''}</sds:Comment>
155+
<sds:SclData><![CDATA[${formatXml(
156+
new XMLSerializer().serializeToString(
157+
body.doc.documentElement
158+
)
159+
)}]]></sds:SclData>
160+
</sds:CreateRequest>`,
161+
})
162+
.catch(handleError)
113163
.then(handleResponse)
114164
.then(parseXml)
115165
.then(extractSclFromResponse);
116166
},
117167

118-
updateSclDocument(type: string, id: string, body: UpdateRequestBody): Promise<Document> {
119-
const sclUrl = getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/' + id;
168+
updateSclDocument(
169+
type: string,
170+
id: string,
171+
body: UpdateRequestBody
172+
): Promise<Document> {
173+
const sclUrl =
174+
getCompasSettings().sclDataServiceUrl + '/scl/v1/' + type + '/' + id;
120175
return fetch(sclUrl, {
121176
method: 'PUT',
122177
headers: {
123-
'Content-Type': 'application/xml'
178+
'Content-Type': 'application/xml',
124179
},
125180
body: `<?xml version="1.0" encoding="UTF-8"?>
126181
<sds:UpdateRequest xmlns:sds="${SDS_NAMESPACE}">
127182
<sds:ChangeSet>${body.changeSet}</sds:ChangeSet>
128-
<sds:Comment>${body.comment}</sds:Comment>
129-
<sds:SclData><![CDATA[${new XMLSerializer().serializeToString(body.doc.documentElement)}]]></sds:SclData>
130-
</sds:UpdateRequest>`
131-
}).catch(handleError)
183+
<sds:Comment>${body.comment ?? ''}</sds:Comment>
184+
<sds:SclData><![CDATA[${formatXml(
185+
new XMLSerializer().serializeToString(
186+
body.doc.documentElement
187+
)
188+
)}]]></sds:SclData>
189+
</sds:UpdateRequest>`,
190+
})
191+
.catch(handleError)
132192
.then(handleResponse)
133193
.then(parseXml)
134194
.then(extractSclFromResponse);
135-
}
136-
}
195+
},
196+
};
137197
}

src/compas-wizards/scl.ts

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,84 @@ import { get, translate } from 'lit-translate';
33

44
import {
55
cloneElement,
6+
ComplexAction,
67
EditorAction,
78
getValue,
89
Wizard,
910
WizardActor,
1011
WizardInputElement,
1112
} from '../foundation.js';
12-
import { COMPAS_SCL_PRIVATE_TYPE } from "../compas/private.js";
13+
14+
import '../compas/CompasLabelsField.js';
15+
1316
import {
17+
COMPAS_SCL_PRIVATE_TYPE,
1418
createCompasSclName,
1519
createPrivate,
1620
getCompasSclName,
17-
getPrivate
18-
} from "../compas/private.js";
21+
getPrivate,
22+
} from '../compas/private.js';
23+
import { CompasLabelsFieldElement } from '../compas/CompasLabelsField.js';
1924

2025
export function updateSCL(sclElement: Element): WizardActor {
21-
return (inputs: WizardInputElement[]): EditorAction[] => {
26+
return (inputs: WizardInputElement[], wizard: Element): EditorAction[] => {
2227
const newValue = getValue(inputs.find(i => i.label === 'filename')!)!;
23-
const oldSclNameElement = getCompasSclName(sclElement);
28+
const labelsField = <CompasLabelsFieldElement>(
29+
wizard.shadowRoot!.querySelector('compas-labels-field')
30+
);
31+
32+
const privateElement = getPrivate(sclElement, COMPAS_SCL_PRIVATE_TYPE)!;
33+
const oldSclNameElement = getCompasSclName(privateElement);
34+
35+
const complexAction: ComplexAction = {
36+
actions: [],
37+
title: get('compas.scl.updateAction'),
38+
};
2439

2540
if (oldSclNameElement) {
2641
// Update the value in the existing SclName Element by cloning.
2742
const oldValue = oldSclNameElement.textContent;
28-
if (newValue === oldValue) {
29-
return [];
43+
if (newValue !== oldValue) {
44+
const newSclNameElement = cloneElement(oldSclNameElement, {});
45+
newSclNameElement.textContent = newValue;
46+
complexAction.actions.push({
47+
old: { element: oldSclNameElement },
48+
new: { element: newSclNameElement },
49+
});
3050
}
31-
32-
const newSclNameElement = cloneElement(oldSclNameElement, {});
33-
newSclNameElement.textContent = newValue;
34-
return [{ old: { element: oldSclNameElement }, new: { element: newSclNameElement } }];
3551
} else {
36-
let privateElement = getPrivate(sclElement, COMPAS_SCL_PRIVATE_TYPE);
37-
if (!privateElement) {
38-
// No Private Element under SCL, so create both Private and SclName Element to be added to the SCL Element.
39-
const newSclNameElement = createCompasSclName(sclElement, newValue);
40-
privateElement = createPrivate(sclElement, COMPAS_SCL_PRIVATE_TYPE);
41-
privateElement.prepend(newSclNameElement);
42-
return [{ new: { parent: sclElement, element: privateElement } }];
43-
}
44-
4552
// There is a Private Element, but no SclName Element, so only create a new SclName Element.
4653
const newSclNameElement = createCompasSclName(sclElement, newValue);
47-
return [{ new: { parent: privateElement, element: newSclNameElement } }];
54+
complexAction.actions.push({
55+
new: { parent: privateElement, element: newSclNameElement },
56+
});
57+
}
58+
59+
// We will replace the full Labels Element, so remove the original one and add the cloned/updated version.
60+
if (labelsField.originalLabelsElement) {
61+
complexAction.actions.push({
62+
old: {
63+
parent: privateElement,
64+
element: labelsField.originalLabelsElement,
65+
},
66+
});
4867
}
68+
complexAction.actions.push({
69+
new: { parent: privateElement, element: labelsField.newLabelsElement },
70+
});
71+
72+
return [complexAction];
4973
};
5074
}
5175

52-
export function renderCompasSCL(
53-
sclElement: Element
54-
): TemplateResult[] {
55-
const privateFilenameElement = getCompasSclName(sclElement);
56-
const filename = privateFilenameElement ? privateFilenameElement.textContent : '';
76+
export function renderCompasSCL(sclElement: Element): TemplateResult[] {
77+
let privateElement = getPrivate(sclElement, COMPAS_SCL_PRIVATE_TYPE);
78+
if (!privateElement) {
79+
privateElement = createPrivate(sclElement, COMPAS_SCL_PRIVATE_TYPE);
80+
sclElement.prepend(privateElement);
81+
}
82+
const privateFilenameElement = getCompasSclName(privateElement);
83+
const filename = privateFilenameElement?.textContent ?? '';
5784

5885
return [
5986
html`<wizard-textfield
@@ -62,12 +89,18 @@ export function renderCompasSCL(
6289
helper="${translate('compas.scl.filenameHelper')}"
6390
required
6491
validationMessage="${translate('textfield.required')}"
65-
dialogInitialFocus>
92+
dialogInitialFocus
93+
>
6694
</wizard-textfield>`,
95+
html`<h3 style="color: var(--mdc-theme-on-surface);">
96+
${translate('compas.scl.labelsTitle')}
97+
</h3>
98+
<compas-labels-field
99+
.privateElement="${privateElement}"
100+
></compas-labels-field>`,
67101
];
68102
}
69103

70-
71104
export function editCompasSCLWizard(sclElement: Element): Wizard {
72105
return [
73106
{

0 commit comments

Comments
 (0)