Parameters
-
{Object.keys(parameters).map((parameterName) =>
parameterRow(parameters[parameterName], parameterName)
)}
diff --git a/src/registry/views/partials/component-versions.tsx b/src/registry/views/partials/component-versions.tsx
index 71c6d03c..e7cd19ec 100644
--- a/src/registry/views/partials/component-versions.tsx
+++ b/src/registry/views/partials/component-versions.tsx
@@ -8,7 +8,7 @@ const componentVersions = ({
return (
{versions.map((version) => (
-
+
{version}
))}
diff --git a/src/registry/views/partials/components-dependencies.tsx b/src/registry/views/partials/components-dependencies.tsx
index 826661d5..c40e09cb 100644
--- a/src/registry/views/partials/components-dependencies.tsx
+++ b/src/registry/views/partials/components-dependencies.tsx
@@ -16,7 +16,9 @@ const ComponentsDependencies = (props: {
return (
);
diff --git a/src/registry/views/partials/components-list.tsx b/src/registry/views/partials/components-list.tsx
index 9c699285..214803b6 100644
--- a/src/registry/views/partials/components-list.tsx
+++ b/src/registry/views/partials/components-list.tsx
@@ -30,7 +30,9 @@ const ComponentsList = (props: {
const remoteServerColumns = isRemote
? [
- {component.oc.stringifiedDate || ''}
,
+
+ {component.oc.stringifiedDate || ''}
+
,
{component.allVersions.length}
]
: null;
@@ -49,12 +51,18 @@ const ComponentsList = (props: {
class={`componentRow row table${isHidden ? ' hide' : ''}`}
>
-
{component.name}
-
{component.description}
+
+ {component.name}
+
+
+ {component.description}
+
{componentState}
- {component.author.name || ''}
- {component.version}
+
+ {component.author.name || ''}
+
+ {component.version}
{remoteServerColumns}
{sizeColumn}
diff --git a/src/registry/views/partials/components-templates.tsx b/src/registry/views/partials/components-templates.tsx
index 95b24e58..4df8c23a 100644
--- a/src/registry/views/partials/components-templates.tsx
+++ b/src/registry/views/partials/components-templates.tsx
@@ -11,7 +11,7 @@ const ComponentsTemplates = (props: { templates: Templates }) => {
global: string | string[];
url: string;
}) => (
-
+
{global}
);
@@ -29,6 +29,7 @@ const ComponentsTemplates = (props: { templates: Templates }) => {
href={`https://www.npmjs.com/package/${type}`}
target="_blank"
rel="noreferrer"
+ safe
>
{type}@{version}
diff --git a/src/registry/views/partials/layout.tsx b/src/registry/views/partials/layout.tsx
index 7c85a625..e855481d 100644
--- a/src/registry/views/partials/layout.tsx
+++ b/src/registry/views/partials/layout.tsx
@@ -20,7 +20,7 @@ const Layout = ({ title, href, children, scripts }: LayoutProps) => {
{''}
-
{title}
+
{title}
diff --git a/src/registry/views/partials/property.tsx b/src/registry/views/partials/property.tsx
index d62ebb21..3d7eb9e7 100644
--- a/src/registry/views/partials/property.tsx
+++ b/src/registry/views/partials/property.tsx
@@ -6,14 +6,16 @@ const Property = (props: {
if (!props.value) return null;
const label = props.linked ? (
-
{String(props.value)}
+
+ {String(props.value)}
+
) : (
-
{String(props.value)}
+
{String(props.value)}
);
return (
-
{props.display}:
{label}
+
{props.display}:
{label}
);
};
diff --git a/src/registry/views/static/info.ts b/src/registry/views/static/info.ts
index 397a41de..b31a55a7 100644
--- a/src/registry/views/static/info.ts
+++ b/src/registry/views/static/info.ts
@@ -29,6 +29,40 @@ oc.cmd.push(function() {
return false;
};
+
+ var updateHrefFromParameters = function() {
+ var baseUrl = $('#href').val().split('?')[0];
+ var params = {};
+
+ // Collect all parameter values
+ $('.parameter-input').each(function() {
+ var paramName = $(this).data('parameter');
+ var paramValue;
+
+ // Handle different input types
+ if ($(this).attr('type') === 'checkbox') {
+ paramValue = $(this).is(':checked') ? 'true' : 'false';
+ } else {
+ paramValue = $(this).val();
+ }
+
+ if (paramValue && paramValue.trim() !== '' && paramValue !== 'false') {
+ params[paramName] = paramValue.trim();
+ }
+ });
+
+ // Build query string
+ var queryString = Object.keys(params).map(function(key) {
+ return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
+ }).join('&');
+
+ // Update href
+ var newHref = baseUrl + (queryString ? '?' + queryString : '');
+ $('#href').val(newHref);
+
+ return newHref;
+ };
+
$('.refresh-preview').click(refreshPreview);
// Add Enter key handler for the href input field
@@ -39,6 +73,26 @@ oc.cmd.push(function() {
}
});
+ // Handle parameter input changes
+ $('.parameter-input').on('input blur change', function() {
+ updateHrefFromParameters();
+ });
+
+ // Handle Enter key on parameter inputs (for text and number inputs)
+ $('.parameter-input[type="text"], .parameter-input[type="number"]').keypress(function(e) {
+ if (e.which === 13) { // Enter key
+ updateHrefFromParameters();
+ refreshPreview();
+ return false;
+ }
+ });
+
+ // Handle checkbox changes - immediately refresh preview
+ $('.parameter-input[type="checkbox"]').on('change', function() {
+ updateHrefFromParameters();
+ refreshPreview();
+ });
+
$('.open-preview').click(function() {
refreshPreview();
var url = $('.preview').attr('src');
diff --git a/test/acceptance/registry-ui.js b/test/acceptance/registry-ui.js
index cd1f374c..ead95a16 100644
--- a/test/acceptance/registry-ui.js
+++ b/test/acceptance/registry-ui.js
@@ -80,4 +80,34 @@ describe('registry (ui interface)', () => {
expect(result).to.match(//);
});
});
+
+ describe('GET /welcome-with-optional-parameters/~info with Accept: text/html', () => {
+ before((done) => {
+ next(
+ request('http://localhost:3030/welcome-with-optional-parameters/~info', {
+ headers: { accept: 'text/html' }
+ }),
+ done
+ );
+ });
+
+ it('should not error', () => {
+ expect(error).to.be.undefined;
+ });
+
+ it('should respond with html result', () => {
+ expect(headers['content-type']).to.equal('text/html; charset=utf-8');
+ expect(result).to.match(//);
+ });
+
+ it('should include parameter input fields', () => {
+ expect(result).to.include('parameter-input');
+ expect(result).to.include('data-parameter');
+ });
+
+ it('should include parameter update JavaScript', () => {
+ expect(result).to.include('updateHrefFromParameters');
+ expect(result).to.include('.parameter-input');
+ });
+ });
});
diff --git a/test/fixtures/components/hello-world-custom-cookies/_package/package.json b/test/fixtures/components/hello-world-custom-cookies/_package/package.json
deleted file mode 100644
index e14b93f7..00000000
--- a/test/fixtures/components/hello-world-custom-cookies/_package/package.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "name": "hello-world-custom-cookies",
- "description": "",
- "version": "1.0.0",
- "repository": "",
- "oc": {
- "files": {
- "template": {
- "type": "handlebars",
- "hashKey": "dbf1f0cb2ae6a52f402b26dff36d5bd696519933",
- "src": "template.js",
- "version": "6.0.25",
- "size": 187
- },
- "dataProvider": {
- "type": "node.js",
- "hashKey": "ef8a15013fac7073b79cc9b21113f1d699ee83ae",
- "src": "server.js",
- "size": 334
- },
- "static": []
- },
- "version": "0.50.27",
- "packaged": true,
- "date": 1756543269656
- }
-}