diff --git a/client/package.json b/client/package.json
index 7909a433a..9b143be0b 100644
--- a/client/package.json
+++ b/client/package.json
@@ -13,7 +13,10 @@
"generate-icon-ts": "svg-to-ts-constants",
"generate-icons": "yarn run optimize-icon-svg && yarn run generate-icon-ts",
"generate-apollo": "graphql-codegen",
- "generate-apollo:start": "graphql-codegen --watch"
+ "generate-apollo:start": "graphql-codegen --watch",
+ "generate-icon-data": "scripts/generate-icon-data.js",
+ "generate-icon-rst": "scripts/generate-icon-rst.js",
+ "generate-docs-rst": "yarn run generate-icon-data && yarn run generate-icon-rst"
},
"private": true,
"resolutions": {
@@ -57,7 +60,9 @@
"@graphql-codegen/typescript-apollo-client-helpers": "^2.2.6",
"@graphql-codegen/typescript-operations": "^2.5.12",
"@types/node": "^12.11.1",
+ "directory-tree": "^3.5.1",
"graphql": "^16.7.1",
+ "mustache": "^4.2.0",
"ngx-json-viewer": "^3.0.2",
"prettier": "^2.5.1",
"svg-to-ts": "^9.0.0",
diff --git a/client/scripts/generate-icon-data.js b/client/scripts/generate-icon-data.js
new file mode 100755
index 000000000..a8380adf6
--- /dev/null
+++ b/client/scripts/generate-icon-data.js
@@ -0,0 +1,64 @@
+#!/usr/bin/env node
+const directoryTree = require('directory-tree')
+const path = require('path')
+const fs = require('fs')
+
+const iconsDirectory = path.join(__dirname, '..', 'src', 'assets', 'icons')
+const validSubdirectories = ['attribute', 'outline', 'twotone', 'fullcolor']
+
+// Utility to remove redundant parent directory name from the filename
+function removeRedundantName(type, filename) {
+ const pattern =
+ type === 'attribute' ? /-outline$/ : new RegExp(`-${type}$`, 'i')
+ return filename.replace(pattern, '')
+}
+
+function generateIconObject(tree) {
+ if (!tree || !tree.children) return []
+
+ return tree.children
+ .filter((child) => validSubdirectories.includes(child.name))
+ .flatMap((subdir) => {
+ return subdir.children.map((file) => {
+ const cleanName = removeRedundantName(
+ subdir.name,
+ path.basename(file.name, '.svg')
+ )
+ return {
+ type: subdir.name,
+ filepath: `${subdir.name}/${file.name}`,
+ name: cleanName,
+ alias: `${subdir.name}-${cleanName}`,
+ }
+ })
+ })
+}
+
+const tree = directoryTree(iconsDirectory, { extensions: /\.svg$/ })
+
+if (!tree) {
+ console.error(
+ `Error: The icon assets folder ${iconsDirectory} does not exist or could not be accessed.`
+ )
+ process.exit(1)
+}
+
+const icons = generateIconObject(tree)
+const output = {
+ icons: icons,
+}
+
+// Define the path to the output file
+const outputPath = path.join(
+ __dirname,
+ '..',
+ 'src',
+ 'app',
+ 'generated',
+ 'civic.icons.data.json'
+)
+
+// Write the JSON data to the file
+fs.writeFileSync(outputPath, JSON.stringify(output, null, 2))
+
+console.log(`Icon data written to ${outputPath}`)
diff --git a/client/scripts/generate-icon-rst.js b/client/scripts/generate-icon-rst.js
new file mode 100755
index 000000000..91af6a284
--- /dev/null
+++ b/client/scripts/generate-icon-rst.js
@@ -0,0 +1,46 @@
+#!/usr/bin/env node
+const fs = require('fs')
+const path = require('path')
+const mustache = require('mustache')
+
+// Load the generated icon data JSON
+const jsonDataPath = path.join(
+ __dirname,
+ '..',
+ 'src',
+ 'app',
+ 'generated',
+ 'civic.icons.data.json'
+)
+const iconData = JSON.parse(fs.readFileSync(jsonDataPath, 'utf-8'))
+
+// Define the mustache template
+const template = `
+.. |{{alias}}| image:: /images/icons/{{{filepath}}}
+ :class: 'cvc-icon'
+`
+
+// Render the RST using mustache
+const renderedRst =
+ '..\n ' +
+ 'GENERATED BY CiVIC CLIENT DEV SCRIPT, DO NOT EDIT\n ' +
+ '(unless you know what you are doing)\n ' +
+ 'Produced by `generate-icon-rst` script in civic-v2/client/scripts\n' +
+ iconData.icons.map((icon) => mustache.render(template, icon)).join('\n')
+
+// Define the path to the output RST file
+const outputPath = path.join(
+ __dirname,
+ '..',
+ 'src',
+ 'app',
+ 'generated',
+ 'civic.docs-aliases.rst'
+)
+
+// Write the rendered RST to the file
+fs.writeFileSync(outputPath, renderedRst)
+
+console.log(
+ `RST written to ${outputPath}, copy to civic-docs/docs/generated to update docs aliases.`
+)
diff --git a/client/src/app/forms/molecular-profile-revise/molecular-profile-revise.queries.gql b/client/src/app/forms/molecular-profile-revise/molecular-profile-revise.queries.gql
index 480868ea5..fc8e55f30 100644
--- a/client/src/app/forms/molecular-profile-revise/molecular-profile-revise.queries.gql
+++ b/client/src/app/forms/molecular-profile-revise/molecular-profile-revise.queries.gql
@@ -14,6 +14,7 @@ fragment RevisableMolecularProfileFields on MolecularProfile {
citationId
}
molecularProfileAliases
+ isComplex
}
mutation SuggestMolecularProfileRevision(
diff --git a/client/src/app/forms/user-profile/user-profile.form.html b/client/src/app/forms/user-profile/user-profile.form.html
index febc1026b..0d1419291 100644
--- a/client/src/app/forms/user-profile/user-profile.form.html
+++ b/client/src/app/forms/user-profile/user-profile.form.html
@@ -71,10 +71,13 @@
ORCID Identifier
-
+
+
+
Personal Website
@@ -84,25 +87,34 @@
style="width: 100%" />
- Twitter Handle
-
+ X/Twitter Handle
+
+
+
Facebook Profile
-
+
+
+
LinkedIn Profile
-
+
+
+