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 - + + +