Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/upstream/main' into loader
Browse files Browse the repository at this point in the history
  • Loading branch information
pablo-mayrgundter committed Jun 23, 2023
2 parents 5e39ab2 + ecedac3 commit 5d04504
Show file tree
Hide file tree
Showing 86 changed files with 3,046 additions and 591 deletions.
2 changes: 2 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ module.exports = {
'jsdoc/require-param-type': 'off',
'require-await': 'error',
'linebreak-style': ['error', 'unix'],
'no-console': 'error',
'no-debugger': 'error',
},
settings: {
react: {
Expand Down
1 change: 1 addition & 0 deletions __mocks__/web-ifc-viewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ const impl = {
}),
setSelection: jest.fn(),
pickIfcItemsByID: jest.fn(),
preselectElementsByIds: jest.fn(),
}
const constructorMock = ifcjsMock.IfcViewerAPI
constructorMock.mockImplementation(() => impl)
Expand Down
1 change: 1 addition & 0 deletions config/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export const build = {
'process.env.SENTRY_DSN': JSON.stringify(process.env.SENTRY_DSN || null),
'process.env.SENTRY_ENVIRONMENT': JSON.stringify(process.env.SENTRY_ENVIRONMENT || process.env.NODE_ENV),
'process.env.DISABLE_MOCK_SERVICE_WORKER': JSON.stringify(process.env.DISABLE_MOCK_SERVICE_WORKER),
'process.env.RAW_GIT_PROXY_URL': JSON.stringify(process.env.RAW_GIT_PROXY_URL || 'https://raw.githubusercontent.com'),
},
plugins: [
progress(),
Expand Down
17 changes: 17 additions & 0 deletions cypress/e2e/appStore/appStore.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
describe('appStore side drawer', () => {
context('enable/disable feature using url parameter', () => {
beforeEach(() => {
cy.setCookie('isFirstTime', 'false')
cy.visit('/')
})

it('should not show app-store icon when url parameter is not present', () => {
cy.findByRole('button', {name: /Open App Store/}).should('not.exist')
})

it('should show app-store icon when url parameter is present', () => {
cy.routerNavigate('/share/v/p?feature=apps', {replace: true})
cy.findByRole('button', {name: /Open App Store/}).should('exist')
})
})
})
6 changes: 3 additions & 3 deletions cypress/e2e/hide-feat/hide-feat.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ describe('Ifc Hide/Unhide E2E test suite', () => {
})

it('should toggle hide icon when clicked', () => {
cy.findByRole('tree', {label: 'IFC Navigator'}).click()
cy.findByLabelText('Navigation Panel').realHover()
cy.findByTestId('hide-icon').should('exist')
cy.findByTestId('hide-icon').should('have.attr', 'data-icon', 'eye')
cy.findByTestId('hide-icon').click()
cy.findByTestId('hide-icon').should('have.attr', 'data-icon', 'eye-slash')
cy.findByTestId('unhide-icon').should('exist')
cy.findByTestId('hide-icon').should('not.exist')
})
})
})
116 changes: 116 additions & 0 deletions cypress/e2e/integration/bldrs-inside-iframe.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,4 +157,120 @@ describe('bldrs inside iframe', () => {

cy.get('@iframe').findByRole('dialog', {timeout: 300000}).should('exist')
})

it('should hide element when HideElements-message emitted', () => {
cy.get('@iframe').trigger('keydown', {keyCode: KEYCODE_ESC})
cy.get('#lastMessageReceivedAction').contains(/ModelLoaded/i)
const globalId = '02uD5Qe8H3mek2PYnMWHk1'

// send a hide elements message
cy.get('#txtSendMessageType').clear().type('ai.bldrs-share.HideElements')
const msg = {
globalIds: [globalId],
}
cy.get('#txtSendMessagePayload').clear().type(JSON.stringify(msg), {parseSpecialCharSequences: false})
cy.get('#btnSendMessage').click()

// trying to select the hidden element
cy.get('#txtSendMessageType').clear().type('ai.bldrs-share.SelectElements')
cy.get('#btnSendMessage').click()

// hidden elements can't be selected
cy.get('#lastMessageReceivedAction').should('not.include.text', /SelectionChanged/i)
})

it('should unhide element when HideElements-message emitted', () => {
cy.get('@iframe').trigger('keydown', {keyCode: KEYCODE_ESC})
cy.get('#lastMessageReceivedAction').contains(/ModelLoaded/i)
const globalId = '02uD5Qe8H3mek2PYnMWHk1'

// send a hide elements message
cy.get('#txtSendMessageType').clear().type('ai.bldrs-share.HideElements')
const msg = {
globalIds: [globalId],
}
cy.get('#txtSendMessagePayload').clear().type(JSON.stringify(msg), {parseSpecialCharSequences: false})
cy.get('#btnSendMessage').click()

// Unhide the hidden element
cy.get('#txtSendMessageType').clear().type('ai.bldrs-share.UnhideElements')
cy.get('#btnSendMessage').click()

// Can be selected again
cy.get('#txtSendMessageType').clear().type('ai.bldrs-share.SelectElements')
cy.get('#btnSendMessage').click()
cy.get('#lastMessageReceivedAction').contains(/SelectionChanged/i)

cy.get('#txtLastMsg').should(($txtLastMsg) => {
const lastMsg = JSON.parse($txtLastMsg.val())
assert.equal(lastMsg.api, 'fromWidget')
assert.equal(lastMsg.widgetId, 'bldrs-share')
assert.exists(lastMsg.requestId)
assert.exists(lastMsg.data)
assert.equal(lastMsg.action, 'ai.bldrs-share.SelectionChanged')
assert.equal(lastMsg.data['current'].length, 1)
assert.equal(lastMsg.data['current'][0], globalId)
})
})

it('should unhide all elements when HideElements-message emitted with wildcard', () => {
cy.get('@iframe').trigger('keydown', {keyCode: KEYCODE_ESC})
cy.get('#lastMessageReceivedAction').contains(/ModelLoaded/i)
const globalId = '02uD5Qe8H3mek2PYnMWHk1'

// send a hide elements message
cy.get('#txtSendMessageType').clear().type('ai.bldrs-share.HideElements')
const msg = {
globalIds: [globalId],
}
cy.get('#txtSendMessagePayload').clear().type(JSON.stringify(msg), {parseSpecialCharSequences: false})
cy.get('#btnSendMessage').click()

// Unhide the hidden element
cy.get('#txtSendMessageType').clear().type('ai.bldrs-share.UnhideElements')
const hidemsg = {
globalIds: '*',
}
cy.get('#txtSendMessagePayload').clear().type(JSON.stringify(hidemsg), {parseSpecialCharSequences: false})
cy.get('#btnSendMessage').click()

// Can be selected again
cy.get('#txtSendMessageType').clear().type('ai.bldrs-share.SelectElements')
cy.get('#txtSendMessagePayload').clear().type(JSON.stringify(msg), {parseSpecialCharSequences: false})
cy.get('#btnSendMessage').click()
cy.get('#lastMessageReceivedAction').contains(/SelectionChanged/i)
})

it('should emit HiddenElments message when element is hidden', () => {
const hiddenElementsCount = 10
cy.get('@iframe').trigger('keydown', {keyCode: KEYCODE_ESC})
cy.get('#lastMessageReceivedAction').contains(/ModelLoaded/i)

// send a hide elements message
cy.get('@iframe').findByRole('tree', {label: 'IFC Navigator'}).click()
cy.get('@iframe').findByTestId('hide-icon').should('exist')
cy.get('@iframe').findByTestId('hide-icon').click()

cy.get('#txtLastMsg').should(($txtLastMsg) => {
const response = JSON.parse($txtLastMsg.val())
assert.equal(response.api, 'fromWidget')
assert.equal(response.widgetId, 'bldrs-share')
assert.exists(response.requestId)
assert.exists(response.data)
assert.equal(response.action, 'ai.bldrs-share.HiddenElements')
assert.equal(response.data['current'].length, hiddenElementsCount)
})

cy.get('@iframe').findByTestId('unhide-icon').click()

cy.get('#txtLastMsg').should(($txtLastMsg) => {
const msg = JSON.parse($txtLastMsg.val())
assert.equal(msg.api, 'fromWidget')
assert.equal(msg.widgetId, 'bldrs-share')
assert.exists(msg.requestId)
assert.exists(msg.data)
assert.equal(msg.action, 'ai.bldrs-share.HiddenElements')
assert.equal(msg.data['current'].length, 0)
})
})
})
25 changes: 25 additions & 0 deletions cypress/e2e/navigation/navigation.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
describe('Navigation E2E test suite', () => {
context('can toggle navigation mode', () => {
beforeEach(() => {
cy.setCookie('isFirstTime', 'false')
cy.visit('/', {
qs: {
feature: 'navTypes',
},
})
})

it.skip('can toggle navigation tree', () => {
cy.findByLabelText('spatial-tree').should('not.be.visible')
cy.findByLabelText('element-types').should('not.be.visible')
cy.findByLabelText('Navigation Panel').realHover()
cy.findByLabelText('spatial-tree').should('be.visible')
cy.findByLabelText('element-types').should('be.visible')
cy.findByLabelText('IFC Navigator').should('exist')
cy.findByLabelText('IFC Types Navigator').should('not.exist')
cy.findByLabelText('element-types').realClick()
cy.findByLabelText('IFC Navigator').should('not.exist')
cy.findByLabelText('IFC Types Navigator').should('exist')
})
})
})
9 changes: 9 additions & 0 deletions cypress/fixtures/bldrs-inside-iframe.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ class BldrsWidgetDriver {
*/
const EVENT_CLIENT_SELECTIONCHANGED_ELEMENTS = 'ai.bldrs-share.SelectionChanged'
const EVENT_CLIENT_MODEL_LOADED = 'ai.bldrs-share.ModelLoaded'
const EVENT_CLIENT_HIDDEN_ELEMENTS = 'ai.bldrs-share.HiddenElements'

document.addEventListener("DOMContentLoaded", function(event) {
const container = document.getElementById('bldrs-widget-iframe')
Expand Down Expand Up @@ -123,6 +124,14 @@ ListenToApiAction(EVENT_CLIENT_MODEL_LOADED,
}
)

ListenToApiAction(EVENT_CLIENT_HIDDEN_ELEMENTS,
event=>
{
txtLastMsg.value = JSON.stringify(event.detail??"")
}
)


btnSendMessage.addEventListener('click', () => {
const messageType = txtSendMessageType.value
const messagePayload = JSON.parse(txtSendMessagePayload.value)
Expand Down
1 change: 1 addition & 0 deletions cypress/support/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
import '@testing-library/cypress/add-commands'
import 'cypress-react-router/add-commands'

/**
* Allow access to elements inside iframe and chain commands from there.
Expand Down
8 changes: 3 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bldrs",
"version": "1.0.0-r658",
"version": "1.0.0-r670",
"main": "src/index.jsx",
"license": "MIT",
"homepage": "https://github.com/bldrs-ai/Share",
Expand Down Expand Up @@ -34,9 +34,6 @@
"@emotion/react": "^11.10.0",
"@emotion/styled": "^11.10.0",
"@iconscout/react-unicons": "^2.0.0",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-solid-svg-icons": "^6.3.0",
"@fortawesome/react-fontawesome": "^0.2.0",
"@mui/icons-material": "^5.11.9",
"@mui/lab": "^5.0.0-alpha.95",
"@mui/material": "^5.9.2",
Expand All @@ -45,8 +42,8 @@
"@octokit/rest": "^19.0.3",
"@sentry/react": "^7.31.1",
"@sentry/tracing": "^7.31.1",
"canvas": "^2.11.0",
"clsx": "^1.2.1",
"cypress-react-router": "^2.0.1",
"material-ui-popup-state": "^5.0.4",
"matrix-widget-api": "^1.1.1",
"normalize.css": "^8.0.1",
Expand Down Expand Up @@ -87,6 +84,7 @@
"@types/three": "^0.146.0",
"babel-jest": "^28.1.3",
"babel-loader": "^8.2.5",
"canvas": "^2.11.0",
"cypress": "^12.3.0",
"cypress-real-events": "^1.7.6",
"esbuild": "^0.15.5",
Expand Down
112 changes: 112 additions & 0 deletions public/widgets/example.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
<!-- was based on example: https://javascriptbit.com/transfer-data-between-parent-window-iframe-channel-messaging-api/ -->

<html lang="en">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hosted App Sample</title>
</head>

<body style="background-color: whitesmoke">
<form id="iframe-form">
<label for="iframe-message">Send message to the parent
<input id="iframe-message" type="text" />
</label>
<button type="submit">Send</button>
</form>
<button id="loadfile" type="">loadfile</button>
<h2>Message received is shown here:</h2>
<div id="message-from-parent"></div>


<script>
// child.js
(async function () {
var port2;
// Listen for the intial port transfer message
var msgHandlers = {}
var $messageContainer = document.querySelector("#message-from-parent");
window.addEventListener("message", initPort);
// Setup the transfered port
function initPort(e) {
if (e.data === "init") {
port2 = e.ports[0];
port2.onmessage = onMessage;
} else {
var msgObj = e.data;
onMessage({
data: msgObj
});
}
}

// Handle messages received on port2
function onMessage(e) {
console.log(e)
$messageContainer.textContent = `Processing response of type ${e.data.action}`;

if (e?.data?.action && msgHandlers[e.data.action]
&& typeof msgHandlers[e.data.action] === 'function') {
msgHandlers[e.data.action](e.data.response)
}
}

// Sending message to the parent
var $form = document.querySelector("#iframe-form");
$form.addEventListener("submit", function (e) {
e.preventDefault();
var message = document.querySelector("#iframe-message").value;
port2.postMessage(message);
});

// Sending message to the parent
var loadfileBtn = document.querySelector("#loadfile");
loadfileBtn.addEventListener("click", function (e) {
e.preventDefault();
port2.postMessage('getLoadedFile');
});

msgHandlers['getLoadedFile'] = async (response) => {
if (!response) $messageContainer.textContent = "Received empty data"
if (response.source === 'local') {
readLocalFile(response.info[0], (r) => {
$messageContainer.textContent = r
})
} else if (response.source === 'github') {
$messageContainer.textContent = await (await fetch(response.info.url)).text()
}
else if (response.source === 'share') {
$messageContainer.textContent = await (await fetch(response.info.url)).text()
}
}
msgHandlers['getSelectedElements'] = (response) => {
if (!response) $messageContainer.textContent = "Received empty data"
$messageContainer.textContent = response
}
})();

function readLocalFile(file, callback) {
if (!file) {
return;
}
let reader = new FileReader();
reader.onload = function (e) {
let contents = e.target.result;
callback(contents)
};
reader.readAsText(file);
}


/*
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', 'blob:link', true);
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xmlhttp.responseType = 'arraybuffer/blob';
xmlhttp.send();*/
</script>
</body>

</html>
Loading

0 comments on commit 5d04504

Please sign in to comment.