Skip to content

Commit 845a13b

Browse files
committed
some fixes and lint cleanups
1 parent 5308419 commit 845a13b

File tree

8 files changed

+58
-40
lines changed

8 files changed

+58
-40
lines changed

src/ifctester/webapp/serve.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@
2222
import sys
2323

2424
bonsai_lib_path = os.environ.get("BONSAI_LIB_PATH")
25-
print(os.environ)
26-
print(bonsai_lib_path)
27-
bonsai_version = os.environ.get("BONSAI_VERSION")
2825

2926
if bonsai_lib_path:
3027
sys.path.insert(0, bonsai_lib_path)

src/ifctester/webapp/src/config.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"wasm": {
33
"wheel_url": "/worker/bin/ifcopenshell-0.8.3+bb329af-cp313-cp313-emscripten_4_0_9_wasm32.whl",
44
"odfpy_url": "/worker/bin/odfpy-1.4.2-py2.py3-none-any.whl",
5-
"api_py_url": "/worker/api.py",
6-
"pyodide_url": "https://cdn.jsdelivr.net/pyodide/v0.28.0/full/pyodide.js"
5+
"api_py_url": "/worker/api.py"
76
}
8-
}
7+
}

src/ifctester/webapp/src/modules/api/ids.svelte.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -265,17 +265,17 @@ export async function deleteFacet(
265265
const spec = Module.documents[docId].specifications.specification[specId];
266266
const list = (spec[clause] as Record<string, unknown> | undefined)?.[facet] as Facet[] | undefined;
267267
if (!list) return;
268-
delete list[facetId];
268+
list.splice(facetId, 1);
269269
}
270270

271271
export function getSpecUsage(spec?: Specification | null): IdsCardinality {
272272
if (!spec?.applicability) return 'required';
273273
const minOccurs = spec.applicability["@minOccurs"] as number | undefined;
274274
const maxOccurs = spec.applicability["@maxOccurs"] as number | "unbounded" | undefined;
275-
276-
if (minOccurs === 1 && maxOccurs === "unbounded") return 'required';
277-
if (minOccurs === 0 && maxOccurs === "unbounded") return 'optional';
278-
if (minOccurs === 0 && maxOccurs === 0) return 'prohibited';
275+
276+
if (minOccurs !== 0) return 'required';
277+
if (minOccurs === 0 && maxOccurs !== 0) return 'optional';
278+
if (maxOccurs === 0) return 'prohibited';
279279
return 'required';
280280
};
281281

src/ifctester/webapp/src/pages/Home/FacetEditor.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
(facet as Record<string, unknown>)[prop] = value;
3535
};
3636
37-
const baseId = `facet-${facetType}-${index}`;
37+
let baseId = $derived(`facet-${facetType}-${index}`);
3838
</script>
3939

4040
<div class="restriction-item">

src/ifctester/webapp/src/pages/Home/IdsViewer.svelte

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import { error, success } from "$src/modules/utils/toast.svelte";
55
import * as Tooltip from "$src/lib/components/ui/tooltip";
66
import type { AuditReport, AuditReportData } from "$src/types/report";
7-
import type { DocumentState, IdsDocument } from "$src/types/ids";
7+
import type { DocumentState, IdsDocument, Specification } from "$src/types/ids";
88
99
let activeDocument = $derived(
1010
IDS.Module.activeDocument ? (IDS.Module.documents[IDS.Module.activeDocument] as IdsDocument) : null
@@ -19,6 +19,8 @@
1919
let expandedRequirements = $state(new Set<string>());
2020
let allExpanded = $state(false);
2121
22+
type SpecificationStatus = boolean | 'skipped' | null;
23+
2224
// Open Editor mode and jump to a specific specification
2325
function editSpecification(index: number) {
2426
if (IDS.Module.activeDocument) {
@@ -55,7 +57,7 @@
5557
}
5658
}
5759
58-
function getSpecificationStatus(specIndex: number, auditData: AuditReportData) {
60+
function getSpecificationStatus(specIndex: number, auditData: AuditReportData): SpecificationStatus {
5961
const spec = auditData.specifications[specIndex];
6062
if (!spec) return null;
6163
return spec.is_skipped ? 'skipped' : spec.status;
@@ -98,6 +100,10 @@
98100
return null; // No reason needed for passed specifications
99101
}
100102
103+
function getDocumentSpecificationUsage(spec: Specification) {
104+
return IDS.getSpecUsage(spec);
105+
}
106+
101107
async function handleDownloadReport() {
102108
if (!auditReport) return;
103109
@@ -223,6 +229,7 @@
223229
</button>
224230
</div>
225231
{#each activeDocument.specifications.specification as spec, index}
232+
{@const usage = getDocumentSpecificationUsage(spec)}
226233
<div class="specification-card {auditReport ? 'with-audit' : ''} {auditReport && getSpecificationStatus(index, auditReport.data) !== null ? (getSpecificationStatus(index, auditReport.data) === 'skipped' ? 'spec-skipped' : (getSpecificationStatus(index, auditReport.data) ? 'spec-pass' : 'spec-fail')) : ''}">
227234
<div
228235
class="spec-card-header"
@@ -260,19 +267,19 @@
260267
<p class="spec-description">{spec["@description"]}</p>
261268
{/if}
262269
<div class="spec-stats">
263-
{#if spec.applicability["@minOccurs"] === 1 && spec.applicability["@maxOccurs"] === 'unbounded'}
270+
{#if usage === 'required'}
264271
<span class="stat-item">Required</span>
265272
{/if}
266-
{#if spec.applicability["@minOccurs"] === 0 && spec.applicability["@maxOccurs"] === 'unbounded'}
273+
{#if usage === 'optional'}
267274
<span class="stat-item">Optional</span>
268275
{/if}
269-
{#if spec.applicability["@minOccurs"] === 0 && spec.applicability["@maxOccurs"] === 0}
276+
{#if usage === 'prohibited'}
270277
<span class="stat-item">Prohibited</span>
271278
{/if}
272279
{#if auditReport}
273280
{@const stats = getSpecificationStats(index, auditReport.data)}
274281
{@const status = getSpecificationStatus(index, auditReport.data)}
275-
{#if stats && spec.applicability["@maxOccurs"] !== 0 && status !== 'skipped'}
282+
{#if stats && usage !== 'prohibited' && status !== 'skipped'}
276283
<span class="stat-item">Checks: {stats.checksPassed}/{stats.checksTotal}</span>
277284
<span class="stat-item">Requirements: {stats.requirementsPassed}/{stats.requirements}</span>
278285
{/if}
@@ -325,12 +332,13 @@
325332

326333
{#if auditReport}
327334
{@const status = getSpecificationStatus(index, auditReport.data)}
328-
{#if ! status && spec.applicability["@maxOccurs"] == 0}
335+
{#if status === false && usage === 'prohibited'}
329336
{@const specReport = auditReport.data.specifications[index]}
337+
{@const applicableEntities = specReport.applicable_entities ?? []}
330338
<div class="entity-tables">
331-
{#if specReport.applicable_entities && specReport.applicable_entities.length > 0}
339+
{#if applicableEntities.length > 0}
332340
<div class="entity-table-section fail">
333-
<h4>Failed Elements ({specReport.applicable_entities.length})</h4>
341+
<h4>Failed Elements ({applicableEntities.length})</h4>
334342
<div class="entity-table-container">
335343
<Tooltip.Provider>
336344
<table class="entity-table">
@@ -346,7 +354,7 @@
346354
</tr>
347355
</thead>
348356
<tbody>
349-
{#each specReport.applicable_entities.slice(0, 10) as entity}
357+
{#each applicableEntities.slice(0, 10) as entity}
350358
<tr>
351359
<td>{entity.class}</td>
352360
<td>{entity.predefined_type || '-'}</td>
@@ -402,9 +410,9 @@
402410
</td>
403411
</tr>
404412
{/each}
405-
{#if specReport.applicable_entities.length > 10}
413+
{#if applicableEntities.length > 10}
406414
<tr class="more-row">
407-
<td colspan="7">... {specReport.applicable_entities.length - 10} more failing elements not shown ...</td>
415+
<td colspan="7">... {applicableEntities.length - 10} more failing elements not shown ...</td>
408416
</tr>
409417
{/if}
410418
</tbody>

src/ifctester/webapp/src/pages/Home/RestrictionEditor.svelte

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
<script lang="ts">
22
import Svelecte from 'svelecte';
3-
import { getEntityClasses, getMaterialCategories, getClassificationSystems, getDataTypes, getPredefinedTypes, getEntityAttributes, getApplicablePsets } from '$src/modules/api/api.svelte';
3+
import {
4+
getApplicablePsets,
5+
getClassificationSystems,
6+
getDataTypes,
7+
getEntityAttributes,
8+
getEntityClasses,
9+
getMaterialCategories,
10+
getPredefinedTypes
11+
} from '$src/modules/api/api.svelte';
412
import * as IDS from '$src/modules/api/ids.svelte';
513
import type { DocumentState, Facet, FacetValue, IdsDocument, Restriction, RestrictionValue, Specification } from '$src/types/ids';
614
@@ -29,16 +37,17 @@
2937
autocomplete?: AutocompleteType;
3038
isSpecialProp?: boolean;
3139
} = $props();
32-
33-
const isEntityNameField = autocomplete === 'entityName';
34-
const isMaterialField = autocomplete === 'material';
35-
const isClassificationSystemField = autocomplete === 'classificationSystem';
36-
const isPredefinedTypeField = autocomplete === 'predefinedType';
37-
const isAttributeNameField = autocomplete === 'attributeName';
38-
const isPropertySetField = autocomplete === 'propertySet';
39-
const isDataTypeField = autocomplete === 'dataType';
40-
41-
const baseId = `restriction-${fieldName}-${Math.random().toString(36).slice(2, 8)}`;
40+
41+
let isEntityNameField = $derived(autocomplete === 'entityName');
42+
let isMaterialField = $derived(autocomplete === 'material');
43+
let isClassificationSystemField = $derived(autocomplete === 'classificationSystem');
44+
let isPredefinedTypeField = $derived(autocomplete === 'predefinedType');
45+
let isAttributeNameField = $derived(autocomplete === 'attributeName');
46+
let isPropertySetField = $derived(autocomplete === 'propertySet');
47+
let isDataTypeField = $derived(autocomplete === 'dataType');
48+
49+
const uniqueId = Math.random().toString(36).slice(2, 8);
50+
let baseId = $derived(`restriction-${fieldName}-${uniqueId}`);
4251
4352
// Predefined Types autocompletions
4453
let predefinedTypeOptions: string[] = $state([]);

src/ifctester/webapp/src/pages/Home/index.svelte

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
? (activeDocument.specifications.specification[documentState.activeSpecification] as Specification)
2727
: null
2828
);
29+
let importableDocuments = $derived(
30+
Object.entries(IDS.Module.documents).filter(
31+
([docId, doc]) => docId !== IDS.Module.activeDocument && doc.specifications?.specification?.length > 0
32+
) as [string, IdsDocument][]
33+
);
2934
3035
async function addNewSpecification() {
3136
if (!IDS.Module.activeDocument) return;
@@ -153,8 +158,7 @@
153158
Import from IDS
154159
</DropdownMenu.SubTrigger>
155160
<DropdownMenu.SubContent class="w-64 max-h-64 overflow-y-auto">
156-
{#each Object.entries(IDS.Module.documents) as [docId, doc]}
157-
{#if docId !== IDS.Module.activeDocument && doc.specifications?.specification?.length > 0}
161+
{#each importableDocuments as [docId, doc], docIndex}
158162
<DropdownMenu.Label class="font-medium text-xs text-muted-foreground px-2 py-1 truncate">
159163
{doc.info?.title || 'Untitled Document'}
160164
</DropdownMenu.Label>
@@ -169,12 +173,11 @@
169173
</span>
170174
</DropdownMenu.Item>
171175
{/each}
172-
{#if Object.entries(IDS.Module.documents).filter(([id, d]) => id !== IDS.Module.activeDocument && d.specifications?.specification?.length > 0).indexOf([docId, doc]) < Object.entries(IDS.Module.documents).filter(([id, d]) => id !== IDS.Module.activeDocument && d.specifications?.specification?.length > 0).length - 1}
176+
{#if docIndex < importableDocuments.length - 1}
173177
<DropdownMenu.Separator />
174178
{/if}
175-
{/if}
176179
{/each}
177-
{#if Object.entries(IDS.Module.documents).filter(([docId, doc]) => docId !== IDS.Module.activeDocument && doc.specifications?.specification?.length > 0).length === 0}
180+
{#if importableDocuments.length === 0}
178181
<DropdownMenu.Item disabled>
179182
<span class="text-sm">No specifications available to import</span>
180183
</DropdownMenu.Item>

src/ifctester/webapp/src/types/report.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export type AuditSpecification = {
4444
description: string;
4545
instructions: string;
4646
status: boolean;
47+
is_skipped?: boolean;
4748
is_ifc_version: boolean;
4849
total_applicable: number;
4950
total_applicable_pass: number;
@@ -55,6 +56,7 @@ export type AuditSpecification = {
5556
percent_checks_pass: ResultsPercent;
5657
cardinality: string;
5758
applicability: string[];
59+
applicable_entities?: AuditReportEntity[];
5860
requirements: AuditRequirement[];
5961
total_requirements?: number;
6062
total_requirements_pass?: number;

0 commit comments

Comments
 (0)