From c17c5cb6fecb504f6ff17fcc231f90e6464de6fe Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Thu, 21 Jan 2021 00:24:58 -0500
Subject: [PATCH 01/14] Initiated changing base to jsonld
Changin base to jsonld instead of json
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/assets/demo/jsonlddata.json | 409 ++++++++++++++++++++
src/components/LeftSidebar/tabs/Profile.js | 5 +-
src/components/RightSidebar/tabs/Actions.js | 5 +-
src/context/AppContext.js | 14 +-
src/templates/celebi/Celebi.js | 2 +-
5 files changed, 426 insertions(+), 9 deletions(-)
create mode 100644 src/assets/demo/jsonlddata.json
diff --git a/src/assets/demo/jsonlddata.json b/src/assets/demo/jsonlddata.json
new file mode 100644
index 0000000..eff0b0f
--- /dev/null
+++ b/src/assets/demo/jsonlddata.json
@@ -0,0 +1,409 @@
+{
+ "data": {
+ "jsonld": {
+ "@context": [
+ "https://jsonldresume.github.io/skill/context.json",
+ {
+ "gender": {
+ "@id": "schema:gender",
+ "@type": "@vocab"
+ },
+ "skill:classOfAward": {
+ "@id": "skill:classOfAward",
+ "@type": "@vocab"
+ },
+ "skill:securityClearance": {
+ "@id": "skill:securityClearance",
+ "@type": "@vocab"
+ },
+ "category": {
+ "@id": "schema:category",
+ "@type": "@vocab"
+ },
+ "dayOfWeek": {
+ "@id": "schema:dayOfWeek",
+ "@type": "@vocab"
+ }
+ }
+ ],
+ "@graph": [
+ {
+ "@type": "skill:Resume",
+ "@id": "_:9c9dc430-987a-4bf8-9b7e-326705d1723e?resume"
+ },
+ {
+ "@type": "Person",
+ "@id": "nancyontheweb.com",
+ "givenName": [
+ {
+ "@value": "Nancy",
+ "@language": "en"
+ }
+ ],
+ "additionalName": [],
+ "familyName": [
+ {
+ "@value": "Jackson",
+ "@language": "en"
+ }
+ ],
+ "honorificPrefix": [],
+ "birthDate": "",
+ "birthPlace": {},
+ "nationality": [],
+ "height": {},
+ "weight": {},
+ "hasCredential": [
+ {
+ "@type": "EducationalOccupationalCredential",
+ "educationalLevel": "",
+ "@id": "_:hasCredential__0",
+ "credentialCategory": "degree",
+ "dateCreated": "Aug 2002",
+ "abstract": "",
+ "aggregateRating": {
+ "@id": "_:hasCredential__0#gpa",
+ "@type": "aggregateRating",
+ "name": "GPA",
+ "ratingValue": "7.2 CGPA",
+ "itemReviewed": {
+ "@id": "_:hasCredential__0"
+ }
+ },
+ "about": {
+ "@id": "_:hasCredential__0#program",
+ "@type": "EducationalOccupationalProgram",
+ "startDate": "Sep 2001",
+ "endDate": "Aug 2002"
+ }
+ },
+ {
+ "@type": "EducationalOccupationalCredential",
+ "educationalLevel": "",
+ "@id": "_:hasCredential__1",
+ "credentialCategory": "degree",
+ "dateCreated": "Aug 2001",
+ "abstract": "",
+ "aggregateRating": {
+ "@id": "_:hasCredential__1#gpa",
+ "@type": "aggregateRating",
+ "name": "GPA",
+ "ratingValue": "8.4 CGPA",
+ "itemReviewed": {
+ "@id": "_:hasCredential__1"
+ }
+ },
+ "about": {
+ "@id": "_:hasCredential__1#program",
+ "@type": "EducationalOccupationalProgram",
+ "startDate": "Sep 1997",
+ "endDate": "Aug 2001"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "profile": {
+ "heading": "Profile",
+ "photo": "https://i.imgur.com/Icr472Z.jpg",
+ "firstName": "Nancy",
+ "lastName": "Jackson",
+ "subtitle": "Customer Sales Representative",
+ "address": {
+ "line1": "3879 Gateway Avenue",
+ "line2": "Bakersfield,",
+ "line3": "California, USA"
+ },
+ "phone": "+1 661-808-4188",
+ "website": "nancyontheweb.com",
+ "email": "nancyjack43@gmail.com"
+ },
+ "objective": {
+ "enable": true,
+ "heading": "Professional Objective",
+ "body": "To obtain a job within my chosen field that will challenge me and allow me to use my education, skills and past experiences in a way that is mutually beneficial to both myself and my employer and allow for future growth and advancement."
+ },
+ "work": {
+ "enable": true,
+ "heading": "Work Experience",
+ "items": [
+ {
+ "id": "a208ec03-76e3-4428-ac5b-e17c3de4ac18",
+ "title": "On Point Electronics, NYC, NY",
+ "role": "Customer Service Representative",
+ "start": "Jan 2013",
+ "end": "July 2018",
+ "description": "- Organized customer information and account data for business planning and customer service purposes.\n- Created excel spreadsheets to track customer data and perform intense reconciliation process.\n- Received 97% positive customer survey results.\n- Speed on calls was 10% above team average. \n**Key Achievement:** Designed and executed an automatized system for following up with customers, increasing customer retention by 22%.",
+ "enabled": true,
+ "enable": true
+ },
+ {
+ "id": "bd8649f2-42d1-4424-acaf-a02c08c3322c",
+ "title": "Excelsior Communications, NYC, NY",
+ "role": "Customer Service Representative",
+ "start": "Oct 2009",
+ "end": "Dec 2012",
+ "description": "- Worked as a full time customer service rep in a high volume call center.\n- Received \"Associate of the Month\" award six times.\n- Chosen as an example for other associates in trainings. \n**Key Achievement:** Received Customer Appreciation bonus in three of four years.",
+ "enabled": true,
+ "enable": true
+ },
+ {
+ "id": "dde47711-a7a6-424f-9751-73483a0ef4ed",
+ "title": "Pizza Hut, Newark, NJ",
+ "role": "Waitress",
+ "start": "Aug 2005",
+ "end": "Sep 2009",
+ "description": "- Worked passionately in customer service in a high volume restaurant.\n- Completed the FAST customer service training class.\n- Maintained a high tip average thanks to consistent customer satisfaction.",
+ "enabled": true,
+ "enable": true
+ }
+ ]
+ },
+ "education": {
+ "enable": true,
+ "heading": "Education",
+ "items": [
+ {
+ "id": "624f32ab-2d78-4052-86ad-1354fd41d754",
+ "name": "The City College of New York, NYC, NY",
+ "major": "MS in Computer Science",
+ "start": "Sep 2001",
+ "end": "Aug 2002",
+ "grade": "7.2 CGPA",
+ "description": "",
+ "enabled": true,
+ "enable": true
+ },
+ {
+ "id": "71a9852f-ed14-4281-bff2-4db9a2275978",
+ "name": "University of California, Berkeley, CA",
+ "major": "BS in Computer Science",
+ "start": "Sep 1997",
+ "end": "Aug 2001",
+ "grade": "8.4 CGPA",
+ "description": "",
+ "enabled": true,
+ "enable": true
+ }
+ ]
+ },
+ "awards": {
+ "enable": true,
+ "heading": "Honors & Awards",
+ "items": [
+ {
+ "id": "121f0976-18cb-4e46-921d-0e156b6bf7fb",
+ "title": "Cast Member of a Musical - Oklahoma",
+ "subtitle": "Winter, 2007",
+ "description": "",
+ "enable": true
+ },
+ {
+ "id": "e5f27346-72ad-4d4f-bab3-726a111e4932",
+ "title": "Class Representative to ASB",
+ "subtitle": "Fall, 2008",
+ "description": "",
+ "enable": true
+ },
+ {
+ "id": "f71ba9bc-8c14-46b5-99dd-e1333e9aceb9",
+ "title": "Most Improved - Varsity Soccer",
+ "subtitle": "Fall, 2007",
+ "description": "",
+ "enable": true
+ }
+ ]
+ },
+ "certifications": {
+ "enable": true,
+ "heading": "Certifications",
+ "items": [
+ {
+ "id": "e5170d99-b21d-4131-a7dc-26a4670037f5",
+ "title": "CCNP",
+ "subtitle": "Cisco Systems",
+ "description": "",
+ "enable": true
+ },
+ {
+ "id": "788e4042-9ecb-40c5-849d-7688b4e23888",
+ "title": "VCP6-DCV",
+ "subtitle": "VMWare",
+ "description": "",
+ "enable": true
+ },
+ {
+ "id": "97a1a8d9-3c03-47fb-93ab-e84f864ffe17",
+ "title": "DCUCI 642-999",
+ "subtitle": "Cisco Systems",
+ "description": "",
+ "enable": true
+ }
+ ]
+ },
+ "skills": {
+ "enable": true,
+ "heading": "Skills",
+ "items": [
+ {
+ "id": "2562d78a-3459-4370-8604-c81b00738db1",
+ "skill": "Customer Service Expertise"
+ },
+ {
+ "id": "58c31587-9770-4522-a34c-f5ad92fe33e5",
+ "skill": "High-Volume Call Center"
+ },
+ {
+ "id": "7aa9a4b1-a2bb-4bcd-8711-b66c0d246971",
+ "skill": "Team Leader/Problem Solver"
+ },
+ {
+ "id": "e7fd33e8-5d77-462d-8115-5be57f52832e",
+ "skill": "Call Center Management"
+ },
+ {
+ "id": "7bad2af1-c24d-4e01-b68b-be01cfa784ce",
+ "skill": "Teambuilding & Training"
+ },
+ {
+ "id": "64fe1710-c2d1-4f53-922e-a5d751eee967",
+ "skill": "Continuous Improvement"
+ }
+ ]
+ },
+ "hobbies": {
+ "enable": true,
+ "heading": "Hobbies",
+ "items": [
+ {
+ "id": "dd2efad7-e900-4384-bdc0-b2ab5f62bb71",
+ "hobby": "Poetry"
+ },
+ {
+ "id": "96023eb7-8c93-4b1d-b581-b8fc4107351a",
+ "hobby": "Travelling"
+ },
+ {
+ "id": "7e5a6168-9cbe-4fe6-b9b9-43a47d8bb15a",
+ "hobby": "Beatboxing"
+ },
+ {
+ "id": "dd7f4ffd-9c16-4dbf-8968-1165b9e30db8",
+ "hobby": "Sketching"
+ }
+ ]
+ },
+ "languages": {
+ "enable": true,
+ "heading": "Languages",
+ "items": [
+ {
+ "id": "9d34cfcb-c9f0-4d25-ab27-cf81652dd1d0",
+ "key": "English (US)",
+ "value": 5,
+ "enable": true,
+ "level": "",
+ "rating": 5
+ },
+ {
+ "id": "3511a86b-7ea9-44ac-8144-6acc7f3bd54f",
+ "key": "Spanish",
+ "value": 4,
+ "enable": true,
+ "rating": 4
+ },
+ {
+ "id": "d1e17542-f7cc-473a-aa0e-978765907454",
+ "key": "Japanese",
+ "value": 4,
+ "enable": true,
+ "level": "N4",
+ "rating": 2
+ },
+ {
+ "id": "b1e8442a-7059-4c6f-8a9c-415383133b0e",
+ "key": "German",
+ "value": 3,
+ "enable": true,
+ "level": "B1",
+ "rating": 0
+ }
+ ]
+ },
+ "references": {
+ "enable": true,
+ "heading": "References",
+ "items": [
+ {
+ "id": "ba3662e6-29cb-4a03-9766-b3618d1621f3",
+ "name": "Lorraine Beasley",
+ "position": "Head of HR, Carson Logistics",
+ "phone": "+1 661-808-4188",
+ "email": "l.beasley@carsonlogistics.com",
+ "description": "",
+ "enable": true
+ },
+ {
+ "id": "62fd3293-0e93-4242-882b-ae19b7865fef",
+ "name": "Mikhail Nabakov",
+ "position": "Assistant Manager, Bullseye",
+ "phone": "+1 661-808-4188",
+ "email": "mikhail@bullseyemart.nyc",
+ "description": "",
+ "enable": true
+ },
+ {
+ "id": "eaab2e32-8591-497c-8676-d122cf3a4798",
+ "name": "Katherine Rose",
+ "position": "CEO , DownToPlay",
+ "phone": "+1 661-808-4188",
+ "email": "k.rose@downtoplay.xyz",
+ "description": "",
+ "enable": true
+ }
+ ]
+ },
+ "extras": {
+ "enable": true,
+ "heading": "Additional Information",
+ "items": [
+ {
+ "id": "3834a270-2c01-4105-b670-80863c955347",
+ "key": "Skype",
+ "value": "@NancyJack5436",
+ "enable": true
+ },
+ {
+ "id": "b0c4fd85-cfda-421e-bd31-008b9aad1dfe",
+ "key": "Hometown",
+ "value": "New Jersey, NY",
+ "enable": true
+ },
+ {
+ "id": "7f0a4971-9770-4ca7-b135-2b0ccd867879",
+ "key": "Hobbies",
+ "value": "Playing Soccer & Guitar",
+ "enable": true
+ },
+ {
+ "id": "e17552a2-e7e9-4605-8145-795e2b62c30e",
+ "key": "Valid Work Visas",
+ "value": "US, UK, EU",
+ "enable": true
+ }
+ ]
+ }
+ },
+ "theme": {
+ "layout": "castform",
+ "font": {
+ "family": "Montserrat"
+ },
+ "colors": {
+ "background": "#ffffff",
+ "primary": "#212121",
+ "accent": "#f44336"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/components/LeftSidebar/tabs/Profile.js b/src/components/LeftSidebar/tabs/Profile.js
index e7cb48e..9531e6b 100644
--- a/src/components/LeftSidebar/tabs/Profile.js
+++ b/src/components/LeftSidebar/tabs/Profile.js
@@ -5,7 +5,6 @@ import TextField from '../../../shared/TextField';
const ProfileTab = ({ data, onChange }) => {
const { t } = useTranslation('leftSidebar');
-
return (
{
className="mb-6"
label={t('profile.firstName.label')}
placeholder="Jane"
- value={data.profile.firstName}
- onChange={v => onChange('data.profile.firstName', v)}
+ value={data.jsonld['@graph'][1].givenName[0]['@value']}
+ onChange={v => onChange('data.jsonld["@graph"][1].givenName[0]["@value"]', v)}
/>
{
};
const exportToJsonld = () => {
- const jsonldObj = JsontoJsonld(data);
- const dataStr = `data:text/json;charset=utf-8,${encodeURIComponent(JSON.stringify(jsonldObj))}`;
+ const dataStr = `data:text/json;charset=utf-8,${encodeURIComponent(JSON.stringify(data.jsonld))}`;
const dlAnchor = document.getElementById('downloadAnchor');
dlAnchor.setAttribute('href', dataStr);
- dlAnchor.setAttribute('download', `RxResumeBackup_${Date.now()}.json`);
+ dlAnchor.setAttribute('download', `jsonldResume_${Date.now()}.json`);
dlAnchor.click();
};
diff --git a/src/context/AppContext.js b/src/context/AppContext.js
index dee4d4f..6f24dab 100644
--- a/src/context/AppContext.js
+++ b/src/context/AppContext.js
@@ -3,11 +3,21 @@ import get from 'lodash/get';
import set from 'lodash/set';
import remove from 'lodash/remove';
-import demoData from '../assets/demo/data.json';
+import demoJsonldData from '../assets/demo/jsonlddata.json';
import { move } from '../utils';
const initialState = {
data: {
+ jsonld:{
+ '@graph': [
+ {
+
+ },
+ {
+ givenName:[{'@value':''}]
+ }
+ ]
+ },
profile: {
heading: 'Profile',
photo: '',
@@ -134,7 +144,7 @@ const reducer = (state, { type, payload }) => {
case 'load_demo_data':
return {
...newState,
- ...demoData,
+ ...demoJsonldData,
};
case 'reset':
return initialState;
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index 78f45c0..1f1960e 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -58,7 +58,7 @@ const Celebi = () => {
diff --git a/src/context/AppContext.js b/src/context/AppContext.js
index 6f24dab..50c2acd 100644
--- a/src/context/AppContext.js
+++ b/src/context/AppContext.js
@@ -14,7 +14,8 @@ const initialState = {
},
{
- givenName:[{'@value':''}]
+ givenName:[{'@language': 'en', '@value':''}],
+ familyName: [{'@language': 'en', '@value':''}]
}
]
},
diff --git a/src/shared/TextField.js b/src/shared/TextField.js
index 9ec3b63..feccafb 100644
--- a/src/shared/TextField.js
+++ b/src/shared/TextField.js
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import React from 'react';
const availableLanguages = ['en', 'fr', 'it', 'de', 'ar'];
@@ -12,12 +12,45 @@ const MakeSelectOptions = function() {
export default class TextField extends React.Component {
state = {
- editingLanguage: 'en'
+ editingLanguage: 'en'
}
+
+ initAllValues = (lang) => {
+ let allValues = this.props.value;
+ if(!this.props.value || !Array.isArray(this.props.value)){
+ allValues = [
+ {
+ "@language": lang,
+ "@value": ""
+ }
+ ];
+ }
+
+ let currrentValueIndex = allValues.findIndex(x => x["@language"] === lang);
+ if(currrentValueIndex < 0){
+ let newLang = {
+ "@language": lang,
+ "@value": ""
+ };
+ allValues.push(newLang);
+ this.props.onChange(allValues);
+ }
+ currrentValueIndex = allValues.findIndex(x => x["@language"] === lang);
+ return currrentValueIndex;
+ }
handleLanguageChange = (lang) => {
- this.setState({
- editingLanguage: lang
- });
+ this.initAllValues(lang);
+
+ this.setState({
+ editingLanguage: lang
+ });
+ }
+ handleTextChange = (lang, value) => {
+ let currrentValueIndex = this.initAllValues(lang);
+ let allValues = this.props.value;
+
+ allValues[currrentValueIndex]["@value"] = value;
+ this.props.onChange(allValues);
}
render() {
return (
@@ -36,8 +69,8 @@ export default class TextField extends React.Component {
className="appearance-none block w-full bg-gray-200 text-gray-800 border border-gray-200 rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-gray-500"
type={this.props.type}
disabled={this.props.disabled}
- value={this.props.value}
- onChange={e => this.props.onChange(e.target.value)}
+ value={this.props.value[((this.props.value.findIndex(x => x["@language"] === this.state.editingLanguage)>=0)?(this.props.value.findIndex(x => x["@language"] === this.state.editingLanguage)) : 0)]["@value"]}
+ onChange={e => this.handleTextChange(this.state.editingLanguage, e.target.value)}
placeholder={this.props.placeholder}
/>
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index 1f1960e..a32ee6c 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -53,13 +53,34 @@ const Celebi = () => {
/>
);
-
+
+ const Subnames = () => (
+ {((data.jsonld['@graph'][1].givenName[1] && data.jsonld['@graph'][1].givenName[1]['@value']) ? (" ("+data.jsonld['@graph'][1].givenName.map(function(elem,index){
+ if(index > 0 && elem['@value']){
+ let name = elem['@value'];
+ if(data.jsonld['@graph'][1].familyName[index] && data.jsonld['@graph'][1].familyName[index]['@value']){
+ name += " "+data.jsonld['@graph'][1].familyName[index]['@value'];
+ }
+ return name;
+ }else{
+ return null;
+ }
+}).filter(function (el) {
+ return el != null;
+}).join(", ")+")") : (""))}
+
+ );
+ const Names = () => (
+
+ {(Array.isArray(data.jsonld['@graph'][1].givenName)) ? (data.jsonld['@graph'][1].givenName[0]['@value']) : (data.jsonld['@graph'][1].givenName)} {(Array.isArray(data.jsonld['@graph'][1].familyName)) ? (data.jsonld['@graph'][1].familyName[0]['@value']) : (data.jsonld['@graph'][1].familyName)}
+
+ );
+
const Header = () => (
From 220c4832a407659bc8e130741d55bcc17dfff575 Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Sat, 23 Jan 2021 20:15:00 -0500
Subject: [PATCH 04/14] Added image
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/components/LeftSidebar/tabs/Profile.js | 23 ++++++++++++++++++++--
src/templates/celebi/Celebi.js | 15 ++++++++++----
2 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/src/components/LeftSidebar/tabs/Profile.js b/src/components/LeftSidebar/tabs/Profile.js
index c610dbb..62b0d8f 100644
--- a/src/components/LeftSidebar/tabs/Profile.js
+++ b/src/components/LeftSidebar/tabs/Profile.js
@@ -1,10 +1,29 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
+import * as _ from 'lodash';
import TextField from '../../../shared/TextField';
const ProfileTab = ({ data, onChange }) => {
const { t } = useTranslation('leftSidebar');
+ let personUrl = "_:";
+ const setValue = (path, field, v, type="", id="_:") => {
+ let val = _.get(data, path+"."+field, null);
+ if(val === null){
+ if(typeof(v) === "string" || typeof(v) === "number"){
+ _.set(data, path+"."+field, "");
+ }else if(typeof(v) === "object"){
+ if(Array.isArray(v)){
+ _.set(data, path+"."+field, []);
+ }else{
+ _.set(data, path+"."+field, {});
+ }
+ }
+ }
+ onChange("data."+path+'.'+field, v);
+ onChange("data."+path+'["@id"]', id);
+ onChange("data."+path+'["@type"]', type);
+ };
return (
{
className="mb-6"
label={t('profile.photoUrl.label')}
placeholder="https://i.imgur.com/..."
- value={data.profile.photo}
- onChange={v => onChange('data.profile.photo', v)}
+ value={_.get(data, 'jsonld["@graph"][1].image.contentUrl', "")}
+ onChange={v => {setValue('jsonld["@graph"][1].image', "contentUrl", v, "ImageObject", personUrl+"#image");}}
/>
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index a32ee6c..7f5f2b3 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -4,6 +4,8 @@ import ReactMarkdown from 'react-markdown';
import AppContext from '../../context/AppContext';
import { hexToRgb } from '../../utils';
+import * as _ from 'lodash';
+
const styles = {
header: {
position: 'absolute',
@@ -45,7 +47,7 @@ const Celebi = () => {
{
);
const Subnames = () => (
-
{((data.jsonld['@graph'][1].givenName[1] && data.jsonld['@graph'][1].givenName[1]['@value']) ? (" ("+data.jsonld['@graph'][1].givenName.map(function(elem,index){
+ {((data.jsonld['@graph'][1].givenName[1]) ? (" ("+data.jsonld['@graph'][1].givenName.map(function(elem,index){
if(index > 0 && elem['@value']){
let name = elem['@value'];
- if(data.jsonld['@graph'][1].familyName[index] && data.jsonld['@graph'][1].familyName[index]['@value']){
- name += " "+data.jsonld['@graph'][1].familyName[index]['@value'];
+ console.log(elem['@language']);
+ console.log(data.jsonld['@graph'][1].familyName);
+ let familynameIndex = data.jsonld['@graph'][1].familyName.findIndex(x=>x['@language']===elem['@language']);
+ if(familynameIndex >= 0){
+ if(data.jsonld['@graph'][1].familyName[familynameIndex] && data.jsonld['@graph'][1].familyName[familynameIndex]['@value']){
+ name += " "+data.jsonld['@graph'][1].familyName[familynameIndex]['@value'];
+ }
}
return name;
}else{
From e09ec07c552fa4c05e6867c7d5c353d4fa69e0ad Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Mon, 25 Jan 2021 09:31:47 -0500
Subject: [PATCH 05/14] Moved profile to jsonld base
Also added multitext and multilang to TextField
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/assets/demo/jsonlddata.json | 10 +
src/components/LeftSidebar/LeftSidebar.js | 31 ++-
src/components/LeftSidebar/tabs/Address.js | 211 ++++++++++++++++++++
src/components/LeftSidebar/tabs/Contacts.js | 178 +++++++++++++++++
src/components/LeftSidebar/tabs/Profile.js | 70 ++-----
src/components/RightSidebar/tabs/Actions.js | 11 -
src/context/AppContext.js | 27 ++-
src/jsonld/index.js | 167 ----------------
src/shared/ItemActions.js | 4 +-
src/shared/TextField.js | 80 +++++++-
src/templates/celebi/Celebi.js | 55 +++--
11 files changed, 568 insertions(+), 276 deletions(-)
create mode 100644 src/components/LeftSidebar/tabs/Address.js
create mode 100644 src/components/LeftSidebar/tabs/Contacts.js
delete mode 100644 src/jsonld/index.js
diff --git a/src/assets/demo/jsonlddata.json b/src/assets/demo/jsonlddata.json
index eff0b0f..0a34603 100644
--- a/src/assets/demo/jsonlddata.json
+++ b/src/assets/demo/jsonlddata.json
@@ -47,12 +47,14 @@
"@language": "en"
}
],
+ "description": "Full-stack Developer",
"honorificPrefix": [],
"birthDate": "",
"birthPlace": {},
"nationality": [],
"height": {},
"weight": {},
+ "address": [],
"hasCredential": [
{
"@type": "EducationalOccupationalCredential",
@@ -119,6 +121,14 @@
"website": "nancyontheweb.com",
"email": "nancyjack43@gmail.com"
},
+ "address": {
+ "heading": "Address",
+ "enable": true
+ },
+ "contacts": {
+ "heading": "Contacts",
+ "enable": true
+ },
"objective": {
"enable": true,
"heading": "Professional Objective",
diff --git a/src/components/LeftSidebar/LeftSidebar.js b/src/components/LeftSidebar/LeftSidebar.js
index 227648a..ef967ce 100644
--- a/src/components/LeftSidebar/LeftSidebar.js
+++ b/src/components/LeftSidebar/LeftSidebar.js
@@ -1,8 +1,11 @@
import React, { useState, useContext } from 'react';
+import * as _ from 'lodash';
import AppContext from '../../context/AppContext';
import TabBar from '../../shared/TabBar';
import ProfileTab from './tabs/Profile';
+import AddressTab from './tabs/Address';
+import ContactsTab from './tabs/Contacts';
import ObjectiveTab from './tabs/Objective';
import WorkTab from './tabs/Work';
import EducationTab from './tabs/Education';
@@ -20,17 +23,19 @@ const LeftSidebar = () => {
const { data } = state;
const tabs = [
- { key: 'profile', name: data.profile.heading },
- { key: 'objective', name: data.objective.heading },
- { key: 'work', name: data.work.heading },
- { key: 'education', name: data.education.heading },
- { key: 'awards', name: data.awards.heading },
- { key: 'certifications', name: data.certifications.heading },
- { key: 'skills', name: data.skills.heading },
- { key: 'hobbies', name: data.hobbies.heading },
- { key: 'languages', name: data.languages.heading },
- { key: 'references', name: data.references.heading },
- { key: 'extras', name: data.extras.heading },
+ { key: 'profile', name: _.get(data, "profile.heading", "Profile") },
+ { key: 'address', name: _.get(data, "address.headin", "Address") },
+ { key: 'contacts', name: _.get(data, "contacts.heading", "Contacts") },
+ { key: 'objective', name: _.get(data, "objective.heading", "Objective") },
+ { key: 'work', name: _.get(data, "work.heading", "Work") },
+ { key: 'education', name: _.get(data, "education.heading", "Education") },
+ { key: 'awards', name: _.get(data, "awards.heading", "Awards") },
+ { key: 'certifications', name: _.get(data, "certifications.heading", "Certifications") },
+ { key: 'skills', name: _.get(data, "skills.heading", "Skills") },
+ { key: 'hobbies', name: _.get(data, "hobbies.heading", "Hobbies") },
+ { key: 'languages', name: _.get(data, "languages.heading", "Languages") },
+ { key: 'references', name: _.get(data, "references.heading", "References") },
+ { key: 'extras', name: _.get(data, "extras.heading", "Extras") },
];
const [currentTab, setCurrentTab] = useState(tabs[0].key);
const onChange = (key, value) => {
@@ -49,6 +54,10 @@ const LeftSidebar = () => {
switch (currentTab) {
case 'profile':
return ;
+ case 'address':
+ return ;
+ case 'contacts':
+ return ;
case 'objective':
return ;
case 'work':
diff --git a/src/components/LeftSidebar/tabs/Address.js b/src/components/LeftSidebar/tabs/Address.js
new file mode 100644
index 0000000..41929e6
--- /dev/null
+++ b/src/components/LeftSidebar/tabs/Address.js
@@ -0,0 +1,211 @@
+import React, { useState, useContext } from 'react';
+import { useTranslation } from 'react-i18next';
+import { v4 as uuidv4 } from 'uuid';
+import set from 'lodash/set';
+
+import TextField from '../../../shared/TextField';
+import AppContext from '../../../context/AppContext';
+import Checkbox from '../../../shared/Checkbox';
+import { addItem } from '../../../utils';
+import ItemActions from '../../../shared/ItemActions';
+import AddItemButton from '../../../shared/AddItemButton';
+import ItemHeading from '../../../shared/ItemHeading';
+
+const AddressTab = ({ data, onChange }) => {
+ const context = useContext(AppContext);
+ const { dispatch } = context;
+
+ return (
+ <>
+
+
+ onChange('data.address.enable', v)} />
+
+
+ onChange('data.address.heading', v)}
+ />
+
+
+
+
+
+ {data.jsonld["@graph"][1].address && data.jsonld["@graph"][1].address.map((x, index) => (
+
+ ))}
+
+
+ >
+ );
+};
+
+const Form = ({ item, onChange, identifier = '' }) => {
+ const { t } = useTranslation(['leftSidebar', 'app']);
+
+ return (
+
+
onChange(`${identifier}streetAddress`, v)}
+ />
+
+ onChange(`${identifier}addressLocality`, v)}
+ />
+
+ onChange(`${identifier}addressRegion`, v)}
+ />
+
+
+ onChange(`${identifier}addressCountry`, v)}
+ />
+
+ onChange(`${identifier}postalCode`, v)}
+ />
+
+
+ onChange(`${identifier}sameAs`, v)}
+ />
+
+ );
+};
+
+const AddItem = ({ heading, dispatch }) => {
+ let id = "_:"+uuidv4();
+ const [isOpen, setOpen] = useState(false);
+ const [item, setItem] = useState({
+ "@id": id,
+ "@type": "PostalAddress",
+ hoursAvailable:{
+ "@id": id+"#hoursAvailable",
+ "@type": "OpeningHoursSpecification",
+ "validThrough": "2099-01-01"
+ },
+ addressCountry: '',
+ streetAddress: '',
+ addressRegion: '',
+ addressLocality: '',
+ postalCode: '',
+ contactType: '',
+ sameAs: ''
+ });
+
+ const onChange = (key, value) => setItem(set({ ...item }, key, value));
+ const onSubmit = () => {
+ let id = "_:"+uuidv4();
+ if ( item.addressCountry === '' ) return;
+
+ addItem(dispatch, 'data.jsonld["@graph"][1].address', item);
+
+ setItem({
+ "@id": id,
+ "@type": "PostalAddress",
+ hoursAvailable:{
+ "@id": id+"#hoursAvailable",
+ "@type": "OpeningHoursSpecification",
+ "validThrough": "2099-01-01"
+ },
+ addressCountry: '',
+ streetAddress: '',
+ addressRegion: '',
+ addressLocality: '',
+ postalCode: '',
+ contactType: '',
+ sameAs: ''
+ });
+
+ setOpen(false);
+ };
+
+ return (
+
+ );
+};
+
+const ItemActionEnable = (identifier, item, onChange) => {
+
+ return (
+ 0) }
+ onChange={v => {
+ let validThrough = "1900-01-01";
+ if(v){validThrough = "2099-01-01";}
+ onChange(`${identifier}hoursAvailable.validThrough`, validThrough);
+ }}
+ />
+ )
+}
+
+const Item = ({ item, index, onChange, dispatch, first, last }) => {
+ const [isOpen, setOpen] = useState(false);
+ const identifier = `data.jsonld["@graph"][1].address[${index}].`;
+
+ return (
+
+ );
+};
+
+export default AddressTab;
diff --git a/src/components/LeftSidebar/tabs/Contacts.js b/src/components/LeftSidebar/tabs/Contacts.js
new file mode 100644
index 0000000..3e0165f
--- /dev/null
+++ b/src/components/LeftSidebar/tabs/Contacts.js
@@ -0,0 +1,178 @@
+import React, { useState, useContext } from 'react';
+import { useTranslation } from 'react-i18next';
+import { v4 as uuidv4 } from 'uuid';
+import set from 'lodash/set';
+
+import TextField from '../../../shared/TextField';
+import Dropdown from '../../../shared/Dropdown';
+import AppContext from '../../../context/AppContext';
+import Checkbox from '../../../shared/Checkbox';
+import { addItem } from '../../../utils';
+import ItemActions from '../../../shared/ItemActions';
+import AddItemButton from '../../../shared/AddItemButton';
+import ItemHeading from '../../../shared/ItemHeading';
+
+const ContactsTab = ({ data, onChange }) => {
+ const context = useContext(AppContext);
+ const { dispatch } = context;
+
+ return (
+ <>
+
+
+ onChange('data.contacts.enable', v)} />
+
+
+ onChange('data.contacts.heading', v)}
+ />
+
+
+
+
+
+ {data.jsonld["@graph"][1].contactPoint && data.jsonld["@graph"][1].contactPoint.filter(x=>(x.contactType==="Preferred")).map((x, index) => (
+
+ ))}
+
+
+ >
+ );
+};
+
+const Form = ({ item, onChange, identifier = '' }) => {
+ const { t } = useTranslation(['leftSidebar', 'app']);
+ const ContactTypeOption = (x, index) => {
+ return (
+
+ {x}
+
+ );
+ };
+ return (
+
+ onChange(`${identifier}telephone`, v)}
+ />
+
+ onChange(`${identifier}email`, v)}
+ />
+
+ onChange(`${identifier}contactType`, v)}
+ options = {["Preferred", "Emergency", "Other"]}
+ optionItem = {ContactTypeOption}
+ />
+
+ onChange(`${identifier}description`, v)}
+ />
+
+ );
+};
+
+const AddItem = ({ heading, dispatch }) => {
+ let id = "_:"+uuidv4();
+ const [isOpen, setOpen] = useState(false);
+ const [item, setItem] = useState({
+ "@id": id,
+ "@type": "ContactPoint",
+ description: '',
+ contactType: 'Preferred',
+ email: '',
+ telephone: ''
+ });
+
+ const onChange = (key, value) => setItem(set({ ...item }, key, value));
+ const onSubmit = () => {
+ let id = "_:"+uuidv4();
+ if ( item.contactType === '' ) return;
+
+ addItem(dispatch, 'data.jsonld["@graph"][1].contactPoint', item);
+
+ setItem({
+ "@id": id,
+ "@type": "ContactPoint",
+ description: '',
+ contactType: 'Preferred',
+ email: '',
+ telephone: ''
+ });
+
+ setOpen(false);
+ };
+
+ return (
+
+ );
+};
+
+const ItemActionEnable = (identifier, item, onChange) => {
+
+ return (
+ <>>
+ )
+}
+
+const Item = ({ item, index, onChange, dispatch, first, last }) => {
+ const [isOpen, setOpen] = useState(false);
+ const identifier = `data.jsonld["@graph"][1].contactPoint[${index}].`;
+
+ return (
+
+ );
+};
+
+export default ContactsTab;
diff --git a/src/components/LeftSidebar/tabs/Profile.js b/src/components/LeftSidebar/tabs/Profile.js
index 62b0d8f..bf048ac 100644
--- a/src/components/LeftSidebar/tabs/Profile.js
+++ b/src/components/LeftSidebar/tabs/Profile.js
@@ -7,7 +7,7 @@ import TextField from '../../../shared/TextField';
const ProfileTab = ({ data, onChange }) => {
const { t } = useTranslation('leftSidebar');
let personUrl = "_:";
- const setValue = (path, field, v, type="", id="_:") => {
+ const setValue = (path, field, v, type=null, id=null) => {
let val = _.get(data, path+"."+field, null);
if(val === null){
if(typeof(v) === "string" || typeof(v) === "number"){
@@ -20,9 +20,14 @@ const ProfileTab = ({ data, onChange }) => {
}
}
}
+
onChange("data."+path+'.'+field, v);
- onChange("data."+path+'["@id"]', id);
- onChange("data."+path+'["@type"]', type);
+ if(id){
+ onChange("data."+path+'["@id"]', id);
+ }
+ if(type){
+ onChange("data."+path+'["@type"]', type);
+ }
};
return (
@@ -48,8 +53,8 @@ const ProfileTab = ({ data, onChange }) => {
className="mb-6"
label={t('profile.firstName.label')}
placeholder="Jane"
- value={data.jsonld['@graph'][1].givenName}
- onChange={v => onChange('data.jsonld["@graph"][1].givenName', v)}
+ value={_.get(data,"jsonld['@graph'][1].givenName", "")}
+ onChange={v => setValue('jsonld["@graph"][1]', "givenName", v)}
type="multilang"
/>
@@ -57,8 +62,8 @@ const ProfileTab = ({ data, onChange }) => {
className="mb-6"
label={t('profile.lastName.label')}
placeholder="Doe"
- value={data.jsonld['@graph'][1].familyName}
- onChange={v => onChange('data.jsonld["@graph"][1].familyName', v)}
+ value={_.get(data,"jsonld['@graph'][1].familyName", "")}
+ onChange={v => setValue('jsonld["@graph"][1]', "familyName", v)}
type="multilang"
/>
@@ -67,61 +72,22 @@ const ProfileTab = ({ data, onChange }) => {
className="mb-6"
label={t('profile.subtitle.label')}
placeholder="Full-Stack Web Developer"
- value={data.profile.subtitle}
- onChange={v => onChange('data.profile.subtitle', v)}
+ value={_.get(data, 'jsonld["@graph"][1].description', "")}
+ onChange={v => {setValue('jsonld["@graph"][1]', "description", v);}}
/>
- onChange('data.profile.address.line1', v)}
- />
-
- onChange('data.profile.address.line2', v)}
- />
-
- onChange('data.profile.address.line3', v)}
- />
-
-
-
- onChange('data.profile.phone', v)}
- />
-
onChange('data.profile.website', v)}
+ value={_.get(data,'jsonld["@graph"][1].sameAs', [])}
+ onChange={v => setValue('jsonld["@graph"][1]', "sameAs", v)}
+ AddItem={()=>{}}
+ type="multitext"
/>
- onChange('data.profile.email', v)}
- />
);
};
diff --git a/src/components/RightSidebar/tabs/Actions.js b/src/components/RightSidebar/tabs/Actions.js
index d26bdc3..a478c00 100644
--- a/src/components/RightSidebar/tabs/Actions.js
+++ b/src/components/RightSidebar/tabs/Actions.js
@@ -8,22 +8,11 @@ import { useTranslation } from 'react-i18next';
import PageContext from '../../../context/PageContext';
import { importJson } from '../../../utils';
-import { JsontoJsonld } from '../../../jsonld';
-
const ActionsTab = ({ data, theme, dispatch }) => {
const pageContext = useContext(PageContext);
const { setPrintDialogOpen } = pageContext;
const { t } = useTranslation('rightSidebar');
const fileInputRef = useRef(null);
-
- const exportToJson = () => {
- const backupObj = { data, theme };
- const dataStr = `data:text/json;charset=utf-8,${encodeURIComponent(JSON.stringify(backupObj))}`;
- const dlAnchor = document.getElementById('downloadAnchor');
- dlAnchor.setAttribute('href', dataStr);
- dlAnchor.setAttribute('download', `RxResumeBackup_${Date.now()}.json`);
- dlAnchor.click();
- };
const exportToJsonld = () => {
const dataStr = `data:text/json;charset=utf-8,${encodeURIComponent(JSON.stringify(data.jsonld))}`;
diff --git a/src/context/AppContext.js b/src/context/AppContext.js
index 50c2acd..78df377 100644
--- a/src/context/AppContext.js
+++ b/src/context/AppContext.js
@@ -15,7 +15,8 @@ const initialState = {
},
{
givenName:[{'@language': 'en', '@value':''}],
- familyName: [{'@language': 'en', '@value':''}]
+ familyName: [{'@language': 'en', '@value':''}],
+ address: []
}
]
},
@@ -34,6 +35,14 @@ const initialState = {
website: '',
email: '',
},
+ contacts: {
+ "enable": true,
+ heading: "Contacts"
+ },
+ address: {
+ "enable": true,
+ heading: 'Address'
+ },
objective: {
enable: true,
heading: 'Objective',
@@ -109,21 +118,21 @@ const reducer = (state, { type, payload }) => {
case 'migrate_section':
return set({ ...newState }, `data.${payload.key}`, payload.value);
case 'add_item':
- items = get({ ...newState }, `data.${payload.key}.items`, []);
+ items = get({ ...newState }, `${payload.key}`, []);
items.push(payload.value);
- return set({ ...newState }, `data.${payload.key}.items`, items);
+ return set({ ...newState }, `${payload.key}`, items);
case 'delete_item':
- items = get({ ...newState }, `data.${payload.key}.items`, []);
+ items = get({ ...newState }, `${payload.key}`, []);
remove(items, x => x.id === payload.value.id);
- return set({ ...newState }, `data.${payload.key}.items`, items);
+ return set({ ...newState }, `${payload.key}`, items);
case 'move_item_up':
- items = get({ ...newState }, `data.${payload.key}.items`, []);
+ items = get({ ...newState }, `${payload.key}`, []);
move(items, payload.value, -1);
- return set({ ...newState }, `data.${payload.key}.items`, items);
+ return set({ ...newState }, `${payload.key}`, items);
case 'move_item_down':
- items = get({ ...newState }, `data.${payload.key}.items`, []);
+ items = get({ ...newState }, `${payload.key}`, []);
move(items, payload.value, 1);
- return set({ ...newState }, `data.${payload.key}.items`, items);
+ return set({ ...newState }, `${payload.key}`, items);
case 'on_input':
return set({ ...newState }, payload.key, payload.value);
case 'save_data':
diff --git a/src/jsonld/index.js b/src/jsonld/index.js
deleted file mode 100644
index 791779c..0000000
--- a/src/jsonld/index.js
+++ /dev/null
@@ -1,167 +0,0 @@
-import * as _ from 'lodash';
-import { v4 as uuidv4 } from 'uuid';
-
-const Jsonize = ( variable ) => {
- let jsonizedVar = variable;
- if(typeof variable === 'object' && variable !== null){
-
- }else{
- jsonizedVar = JSON.parse(variable);
- }
- return jsonizedVar;
-};
-
-const convertDate = (date) =>{
- return date;
-}
-
-const makeCap = (input) => {
- return input;
-}
-
-const mapPerson = (jsonRxResume, person) => {
-
- let firstname = _.get(jsonRxResume, 'profile["firstName"]', '');
- _.set(person, 'givenName[0]["@value"]',firstname);
- _.set(person, 'givenName[0]["@language"]','en');
-
- let additionalName = _.get(jsonRxResume, 'profile["additionalName"]', []);
- _.set(person, 'additionalName',additionalName);
-
- let lastname = _.get(jsonRxResume, 'profile["lastName"]', '');
- _.set(person, 'familyName[0]["@value"]',lastname);
- _.set(person, 'familyName[0]["@language"]','en');
-
- let honorificPrefix = _.get(jsonRxResume, 'profile["honorificPrefix"]', []);
- _.set(person, 'honorificPrefix',honorificPrefix);
-
- let birthDate = _.get(jsonRxResume, 'profile["birthDate"]', '');
- _.set(person, 'birthDate',convertDate(birthDate));
-
- let birthPlace = _.get(jsonRxResume, 'profile["birthPlace"]', {});
- _.set(person, 'birthPlace', birthPlace);
-
- let nationality = _.get(jsonRxResume, 'profile["nationality"]', []);
- _.set(person, 'nationality',nationality);
-
- let height = _.get(jsonRxResume, 'profile["height"]', {});
- _.set(person, 'height',height);
-
-
- let weight = _.get(jsonRxResume, 'profile["weight"]', {});
- _.set(person, 'weight',weight);
-
- //person.hasCredential
- let credentials = _.get(jsonRxResume, 'education', '');
- for(let i=0; i
{
- return resume;
-};
-
-export const JsontoJsonld = ( rxResume ) => {
- let personId = uuidv4();
- let jsonRxResume = Jsonize(rxResume);
- let jsonldresume = {
- "@context": [
- "https://jsonldresume.github.io/skill/context.json",
- {
- "gender": {
- "@id": "schema:gender",
- "@type": "@vocab"
- },
- "skill:classOfAward": {
- "@id": "skill:classOfAward",
- "@type": "@vocab"
- },
- "skill:securityClearance": {
- "@id": "skill:securityClearance",
- "@type": "@vocab"
- },
- "category": {
- "@id": "schema:category",
- "@type": "@vocab"
- },
- "dayOfWeek": {
- "@id": "schema:dayOfWeek",
- "@type": "@vocab"
- }
- }
- ],
- "@graph": [
- ]
- };
- let resume = {
- "@type": "skill:Resume"
- };
- let person = {
- "@type": "Person"
- };
-
- resume = mapResume(jsonRxResume, resume);
- resume["@id"] = _.get(jsonRxResume+'?resume', 'profile.website', '_:'+personId+'?resume');
-
- person["@id"] = _.get(jsonRxResume, 'profile.website', '_:'+personId);
- person = mapPerson(jsonRxResume, person);
-
- jsonldresume["@graph"].push(resume);
- jsonldresume["@graph"].push(person);
-
- return jsonldresume;
-};
\ No newline at end of file
diff --git a/src/shared/ItemActions.js b/src/shared/ItemActions.js
index 526bf35..3c2ac7f 100644
--- a/src/shared/ItemActions.js
+++ b/src/shared/ItemActions.js
@@ -4,12 +4,13 @@ import { useTranslation } from 'react-i18next';
import Checkbox from './Checkbox';
import { deleteItem, moveItemUp, moveItemDown } from '../utils';
-const ItemActions = ({ dispatch, first, identifier, item, last, onChange, type }) => {
+const ItemActions = ({ dispatch, first, identifier, item, last, onChange, type, enableAction }) => {
const { t } = useTranslation();
return (
+ {enableAction ? enableAction(identifier, item, onChange) : (
+ )}
{
+ let allValues = this.props.value;
+ if(!this.props.value || !Array.isArray(this.props.value)){
+ allValues = [];
+ }
+
+ while(_.size(allValues)<=index){
+ allValues.push("");
+ }
+ allValues[index] = value;
+
+ this.props.onChange(allValues);
+ }
+
initAllValues = (lang) => {
let allValues = this.props.value;
if(!this.props.value || !Array.isArray(this.props.value)){
@@ -52,6 +67,32 @@ export default class TextField extends React.Component {
allValues[currrentValueIndex]["@value"] = value;
this.props.onChange(allValues);
}
+
+ MultiItem = (x, index) => (
+
+
this.handleMultiTextChange(e.target.value, index)}
+ placeholder={this.props.placeholder}
+ key={"input_"+index}
+ />
+ {(_.size(this.props.value)<=1) ? ("") : (
+
{_.pullAt(this.props.value, index);this.props.onChange(this.props.value);}}
+ className="bg-gray-600 hover:bg-gray-700 text-white text-sm font-medium py-2 px-4 rounded"
+ key={"button_"+index}
+ >
+
+ remove
+
+ )
+ }
+
+ );
render() {
return (
@@ -60,7 +101,7 @@ export default class TextField extends React.Component {
{this.props.label}
)}
- {(this.props.type==="multilang")?
+ { (this.props.type==="multilang") ? (
this.handleLanguageChange(event.target.value)}>
{MakeSelectOptions()}
@@ -74,15 +115,34 @@ export default class TextField extends React.Component {
placeholder={this.props.placeholder}
/>
- :
-
this.props.onChange(e.target.value)}
- placeholder={this.props.placeholder}
- />
+ ) : (
+ (this.props.type==="multitext") ? (
+
+ {this.props.value.map(this.MultiItem)}
+
+
{this.props.value.push("");this.props.onChange(this.props.value);}}
+ className="bg-gray-600 hover:bg-gray-700 text-white text-sm font-medium py-2 px-4 rounded"
+ key="button_main"
+ >
+
+ add
+
+
+
+
+ ) : (
+
this.props.onChange(e.target.value)}
+ placeholder={this.props.placeholder}
+ />
+ )
+ )
}
);
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index 7f5f2b3..30f3ca9 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -43,17 +43,24 @@ const Celebi = () => {
);
const Photo = () =>
- data.profile.photo !== '' && (
+ (_.get(data, 'jsonld["@graph"][1].image.contentUrl', "") !== '' && (
+ )) || (
+
);
const Subnames = () => (
@@ -88,7 +95,7 @@ const Celebi = () => {
-
{data.profile.subtitle}
+ {_.get(data, 'jsonld["@graph"][1].description', "")}
);
@@ -109,20 +116,38 @@ const Celebi = () => {
{value}
);
-
+
+ const Address = () => (
+ (
+ data.jsonld["@graph"][1].address && data.jsonld["@graph"][1].address.length>0 &&
+ data.address.enable && (
+
+ {data.jsonld["@graph"][1].address.filter(x => (Date.parse(x.hoursAvailable.validThrough) - Date.parse(new Date()))>0).map(AddressItem)}
+
+ )
+ ) || ("")
+ );
+
+ const AddressItem = (x, index) => (
+ (
+
+ {index===0?
{data.profile.address.heading || "Address"} :""}
+
{x.streetAddress}
+
{x.addressLocality} {x.addressRegion}
+
{x.addressCountry} {x.postalCode}
+
+ )
+ );
const Contact = () => (
-
-
-
-
Address
-
{data.profile.address.line1}
-
{data.profile.address.line2}
-
{data.profile.address.line3}
+ data.contacts.enable && (
+
-
-
-
-
+ )
);
const WorkItem = x => (
From bf1a23d1c9f16c1f7a9b68d266bc50a3382ff65e Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Tue, 26 Jan 2021 00:40:07 -0500
Subject: [PATCH 06/14] Added Objective tab
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/components/LeftSidebar/tabs/Objective.js | 215 ++++++++++++++++++-
src/templates/celebi/Celebi.js | 17 +-
2 files changed, 219 insertions(+), 13 deletions(-)
diff --git a/src/components/LeftSidebar/tabs/Objective.js b/src/components/LeftSidebar/tabs/Objective.js
index 58f76ae..2b0e3e4 100644
--- a/src/components/LeftSidebar/tabs/Objective.js
+++ b/src/components/LeftSidebar/tabs/Objective.js
@@ -1,21 +1,28 @@
-import React from 'react';
+import React, { useState, useContext } from 'react';
import { useTranslation } from 'react-i18next';
+import { v4 as uuidv4 } from 'uuid';
+import set from 'lodash/set';
-import TextArea from '../../../shared/TextArea';
import TextField from '../../../shared/TextField';
+import TextArea from '../../../shared/TextArea';
+import AppContext from '../../../context/AppContext';
import Checkbox from '../../../shared/Checkbox';
+import { addItem } from '../../../utils';
+import ItemActions from '../../../shared/ItemActions';
+import AddItemButton from '../../../shared/AddItemButton';
+import ItemHeading from '../../../shared/ItemHeading';
+
+import * as _ from 'lodash';
const ObjectiveTab = ({ data, onChange }) => {
- const { t } = useTranslation('leftSidebar');
+ const context = useContext(AppContext);
+ const { dispatch } = context;
return (
-
+ <>
- onChange('data.objective.enable', v)}
- />
+ onChange('data.objective.enable', v)} />
);
-
+
const Objective = () =>
data.objective &&
data.objective.enable && (
-
+ {_.get(data, 'jsonld["@graph"][1].seeks',[]).map((x, index) => (
+
+ ))}
+ {_.get(data, 'jsonld["@graph"][1].seeks',[]).map((x, index) => (
+
+
+ {(_.get(x,'availableAtOrFrom.address.addressCountry', null) || _.get(x,'availableAtOrFrom.address.addressRegion', null) || _.get(x,'availableAtOrFrom.address.addressLocality', null)) ? "" : ""}
+ {(_.get(x,'availableAtOrFrom.address.addressLocality', null) ? (_.get(x,'availableAtOrFrom.address.addressLocality', '')+' ') : '')
+ +(_.get(x,'availableAtOrFrom.address.addressRegion', null) ? (_.get(x,'availableAtOrFrom.address.addressRegion', '')+' ') : '')
+ +(_.get(x,'availableAtOrFrom.address.addressCountry', null) ? (_.get(x,'availableAtOrFrom.address.addressCountry', '')) : '')} | {(_.get(x, 'availabilityStarts', null)) ? (_.get(x, 'availabilityStarts', '')) : ""} {_.get(x, 'availabilityEnds', null) ? ("-" + " "+_.get(x,'availabilityEnds','')): ""}
+
+
+ ))}
);
From 768affb0105bfe10b5b3207b31c6200740daf673 Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Tue, 26 Jan 2021 19:53:42 -0500
Subject: [PATCH 07/14] Smal modifications to Celebi template
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/templates/celebi/Celebi.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index 9bd35a8..c0c58a1 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -115,7 +115,7 @@ const Celebi = () => {
{(_.get(x,'availableAtOrFrom.address.addressCountry', null) || _.get(x,'availableAtOrFrom.address.addressRegion', null) || _.get(x,'availableAtOrFrom.address.addressLocality', null)) ? "" : ""}
{(_.get(x,'availableAtOrFrom.address.addressLocality', null) ? (_.get(x,'availableAtOrFrom.address.addressLocality', '')+' ') : '')
+(_.get(x,'availableAtOrFrom.address.addressRegion', null) ? (_.get(x,'availableAtOrFrom.address.addressRegion', '')+' ') : '')
- +(_.get(x,'availableAtOrFrom.address.addressCountry', null) ? (_.get(x,'availableAtOrFrom.address.addressCountry', '')) : '')} | {(_.get(x, 'availabilityStarts', null)) ? (_.get(x, 'availabilityStarts', '')) : ""} {_.get(x, 'availabilityEnds', null) ? ("-" + " "+_.get(x,'availabilityEnds','')): ""}
+ +(_.get(x,'availableAtOrFrom.address.addressCountry', null) ? (_.get(x,'availableAtOrFrom.address.addressCountry', '')) : '')} | {(_.get(x, 'availabilityStarts', null)) ? (_.get(x, 'availabilityStarts', '')) : ""} {_.get(x, 'availabilityEnds', null) ? ("- " +_.get(x,'availabilityEnds','')): ""}
))}
From 62442e5490607fe826bed70714029666d2814aaa Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Thu, 28 Jan 2021 22:18:52 -0500
Subject: [PATCH 08/14] Converted Work experience to jsonld
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/components/LeftSidebar/tabs/Work.js | 129 +++++++++++++++++-------
src/templates/celebi/Celebi.js | 30 ++++--
2 files changed, 114 insertions(+), 45 deletions(-)
diff --git a/src/components/LeftSidebar/tabs/Work.js b/src/components/LeftSidebar/tabs/Work.js
index 5a1f3a2..ccc92fb 100644
--- a/src/components/LeftSidebar/tabs/Work.js
+++ b/src/components/LeftSidebar/tabs/Work.js
@@ -12,6 +12,8 @@ import ItemActions from '../../../shared/ItemActions';
import AddItemButton from '../../../shared/AddItemButton';
import ItemHeading from '../../../shared/ItemHeading';
+import * as _ from 'lodash';
+
const WorkTab = ({ data, onChange }) => {
const context = useContext(AppContext);
const { dispatch } = context;
@@ -33,14 +35,14 @@ const WorkTab = ({ data, onChange }) => {
- {data.work.items.map((x, index) => (
+ {_.get(data.jsonld["@graph"][1], 'hasOccupation', []).map((x, index) => (
))}
@@ -52,82 +54,124 @@ const WorkTab = ({ data, onChange }) => {
const Form = ({ item, onChange, identifier = '' }) => {
const { t } = useTranslation(['leftSidebar', 'app']);
-
+ const setValue = (path, field, v, type=null, id=null) => {
+ let val = _.get(item, path+"."+field, null);
+ if(val === null){
+ if(typeof(v) === "string" || typeof(v) === "number"){
+ _.set(item, path+"."+field, "");
+ }else if(typeof(v) === "object"){
+ if(Array.isArray(v)){
+ _.set(item, path+"."+field, []);
+ }else{
+ _.set(item, path+"."+field, {});
+ }
+ }
+ }
+
+ onChange(identifier+"."+path+'.'+field, v);
+ if(id){
+ onChange(`${identifier}`+path+'["@id"]', id);
+ }
+ if(type){
+ onChange(`${identifier}`+path+'["@type"]', type);
+ }
+ };
+
return (
onChange(`${identifier}title`, v)}
+ value={_.get(item, 'subjectOf.organizer.name', '')}
+ onChange={v => onChange(`${identifier}subjectOf.organizer.name`, v)}
/>
onChange(`${identifier}role`, v)}
+ value={_.get(item, 'roleName', '')}
+ onChange={v => onChange(`${identifier}roleName`, v)}
/>
onChange(`${identifier}start`, v)}
+ placeholder="2019-01-01"
+ value={_.get(item, 'startDate', '')}
+ onChange={v => onChange(`${identifier}startDate`, v)}
/>
onChange(`${identifier}end`, v)}
+ placeholder="2020-01-01"
+ value={_.get(item, 'endDate', '')}
+ onChange={v => onChange(`${identifier}endDate`, v)}
/>
+
+ setValue('hasOccupation', "responsibilities", v)}
+ AddItem={()=>{}}
+ type="multitext"
+ />
onChange(`${identifier}description`, v)}
/>
);
};
+const emptyItem = () => {
+ let id = uuidv4();
+ return ({
+ "@type": "EmployeeRole",
+ "@id": "_:"+id+"#enable",
+ hasOccupation: {
+ "@id": "_:"+id+"#hasOccupation",
+ "@type": "Occupation",
+ name: "",
+ skills: [],
+ responsibilities: []
+ },
+ subjectOf: {
+ "@type": "BusinessEvent",
+ id: "_:"+id+"#subjectOf",
+ organizer: {
+ "@type": "Organization",
+ id: "_:"+id+"#subjectOf#organizer",
+ name: ''
+ }
+ },
+ roleName: '',
+ startDate: '',
+ endDate: '',
+ description: ''
+ });
+};
const AddItem = ({ heading, dispatch }) => {
const [isOpen, setOpen] = useState(false);
- const [item, setItem] = useState({
- id: uuidv4(),
- enable: true,
- title: '',
- role: '',
- start: '',
- end: '',
- description: '',
- });
+ const [item, setItem] = useState(emptyItem());
const onChange = (key, value) => setItem(set({ ...item }, key, value));
const onSubmit = () => {
- if (item.title === '' || item.role === '') return;
+ if (item.roleName === '') return;
+ addItem(dispatch, "data.jsonld['@graph'][1].hasOccupation", item);
- addItem(dispatch, 'work', item);
-
- setItem({
- id: uuidv4(),
- enable: true,
- title: '',
- role: '',
- start: '',
- end: '',
- description: '',
- });
+ setItem(emptyItem());
setOpen(false);
};
@@ -144,14 +188,20 @@ const AddItem = ({ heading, dispatch }) => {
);
};
+const ItemActionEnable = (identifier, item, onChange) => {
+
+ return (
+ <>>
+ )
+}
const Item = ({ item, index, onChange, dispatch, first, last }) => {
const [isOpen, setOpen] = useState(false);
- const identifier = `data.work.items[${index}].`;
+ const identifier = `data.jsonld["@graph"][1].hasOccupation[${index}].`;
return (
-
+
@@ -163,7 +213,8 @@ const Item = ({ item, index, onChange, dispatch, first, last }) => {
item={item}
last={last}
onChange={onChange}
- type="work"
+ type="data.jsonld['@graph'][1].hasOccupation"
+ enableAction={ItemActionEnable}
/>
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index c0c58a1..b90e388 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -5,6 +5,7 @@ import ReactMarkdown from 'react-markdown';
import AppContext from '../../context/AppContext';
import { hexToRgb } from '../../utils';
+import { v4 as uuidv4 } from 'uuid';
import * as _ from 'lodash';
const styles = {
@@ -162,16 +163,33 @@ const Celebi = () => {
)
);
-
+
+ const WorkResponsibilityItem = x => (
+ x && (
+
{x}
+ )
+ )
+
+ const WorkResponsibility = ({responsibilities}) => (
+ responsibilities && responsibilities.length && (
+
+ {
+ responsibilities.filter(x => (x !== '')).map(WorkResponsibilityItem)
+ }
+
+ )
+ )
+
const WorkItem = x => (
-
+
-
{x.title}
+
{_.get(x,'subjectOf.organizer.name','')}
- {x.role} | {x.start} - {x.end}
+ {_.get(x,'roleName', '')} | {_.get(x,'startDate','')} - {_.get(x,'endDate','')}
-
+
+
);
@@ -180,7 +198,7 @@ const Celebi = () => {
data.work.enable && (
- {data.work.items.filter(x => x.enable).map(WorkItem)}
+ {_.get(data, "jsonld['@graph'][1].hasOccupation", []).filter(x => !_.get(x, '@id', '').endsWith("disable")).map(WorkItem)}
);
From 889cf09f64e339921c0805687cab48aae3e13817 Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Fri, 29 Jan 2021 20:56:15 -0500
Subject: [PATCH 09/14] Completed Work section
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/components/LeftSidebar/tabs/Education.js | 204 ++++++++++++++-----
src/components/LeftSidebar/tabs/Work.js | 26 ++-
src/templates/celebi/Celebi.js | 35 +++-
3 files changed, 198 insertions(+), 67 deletions(-)
diff --git a/src/components/LeftSidebar/tabs/Education.js b/src/components/LeftSidebar/tabs/Education.js
index 8bf9c25..5b06ac6 100644
--- a/src/components/LeftSidebar/tabs/Education.js
+++ b/src/components/LeftSidebar/tabs/Education.js
@@ -5,6 +5,7 @@ import set from 'lodash/set';
import TextField from '../../../shared/TextField';
import TextArea from '../../../shared/TextArea';
+import Dropdown from '../../../shared/Dropdown';
import AppContext from '../../../context/AppContext';
import Checkbox from '../../../shared/Checkbox';
import { addItem } from '../../../utils';
@@ -12,10 +13,12 @@ import ItemActions from '../../../shared/ItemActions';
import AddItemButton from '../../../shared/AddItemButton';
import ItemHeading from '../../../shared/ItemHeading';
+import * as _ from 'lodash';
+
const EducationTab = ({ data, onChange }) => {
const context = useContext(AppContext);
const { dispatch } = context;
-
+
return (
<>
@@ -36,7 +39,7 @@ const EducationTab = ({ data, onChange }) => {
- {data.education.items.map((x, index) => (
+ {_.get(data.jsonld["@graph"][1], 'hasCredential', []).map((x, index) => (
- {
onChange={onChange}
dispatch={dispatch}
first={index === 0}
- last={index === data.education.items.length - 1}
+ last={index === _.size(_.get(data.jsonld["@graph"][1], 'hasCredential', [])) - 1}
/>
))}
@@ -55,92 +58,181 @@ const EducationTab = ({ data, onChange }) => {
const Form = ({ item, onChange, identifier = '' }) => {
const { t } = useTranslation(['leftSidebar', 'app']);
-
+ const EducationTypeOption = (x, index) => {
+ return (
+
+ {x}
+
+ );
+ };
+
+ const setValue = (path, field, v, type=null, id=null) => {
+ let fullPath = path;
+ if(field){
+ fullPath = fullPath+"."+field;
+ }
+ let val = _.get(item, fullPath, null);
+ if(val === null){
+ if(typeof(v) === "string" || typeof(v) === "number"){
+ _.set(item, fullPath, "");
+ }else if(typeof(v) === "object"){
+ if(Array.isArray(v)){
+ _.set(item, fullPath, []);
+ }else{
+ _.set(item, fullPath, {});
+ }
+ }
+ }
+
+ onChange(identifier+fullPath, v);
+ if(id){
+ onChange(`${identifier}`+path+'["@id"]', id);
+ }
+ if(type){
+ onChange(`${identifier}`+path+'["@type"]', type);
+ }
+ };
+
return (
onChange(`${identifier}name`, v)}
+ value={_.get(item, "about.provider.name", "")}
+ onChange={v => onChange(`${identifier}about.provider.name`, v)}
/>
+
+ onChange(`${identifier}credentialCategory`, v)}
+ options = {["Degree", "Certificate", "Badge"]}
+ optionItem = {EducationTypeOption}
+ />
+
+ onChange(`${identifier}educationalLevel`, v)}
+ />
+
onChange(`${identifier}major`, v)}
+ placeholder="Computer Science"
+ value={_.get(item, "about.educationalCredentialAwarded", "")}
+ onChange={v => onChange(`${identifier}about.educationalCredentialAwarded`, v)}
/>
-
- onChange(`${identifier}grade`, v)}
- />
-
+
+
+ onChange(`${identifier}aggregateRating.ratingValue`, v)}
+ />
+
+ onChange(`${identifier}aggregateRating.bestRating`, v)}
+ />
+
+
onChange(`${identifier}start`, v)}
+ placeholder="2018-01-01"
+ value={_.get(item, "about.startDate", "")}
+ onChange={v => onChange(`${identifier}about.startDate`, v)}
/>
-
+
onChange(`${identifier}end`, v)}
+ placeholder="2020-01-01"
+ value={_.get(item, "about.endDate", "")}
+ onChange={v => onChange(`${identifier}about.endDate`, v)}
/>
+
+ setValue('teaches', '', v)}
+ AddItem={()=>{}}
+ type="multitext"
+ />
onChange(`${identifier}description`, v)}
+ value={_.get(item, 'abstract', '')}
+ onChange={v => onChange(`${identifier}abstract`, v)}
/>
);
};
+const emptyItem = () => {
+ let id = uuidv4();
+ return ({
+ "@type": "EducationalOccupationalCredential",
+ "@id": "_:"+id+"#enable",
+ "aggregateRating": {
+ "@id": "_:"+id+"#aggregateRating",
+ "@type": "aggregateRating",
+ "bestRating": "",
+ "ratingValue": "",
+ "name": "GPA",
+ "itemReviewed": {
+ "@id": "_:"+id+"#enable"
+ }
+ },
+ "credentialCategory": "degree",
+ "educationalLevel": "",
+ "abstract": "",
+ "teaches": [],
+ "about": {
+ "@id": "_:"+id+"#about",
+ "@type": "EducationalOccupationalProgram",
+ "educationalCredentialAwarded": "",
+ "startDate": "",
+ "endDate": "",
+ "provider": {
+ "@id": "_:"+id+"#about#provider",
+ "@type": "CollegeOrUniversity",
+ "name": ""
+ }
+ }
+ });
+};
+
const AddItem = ({ heading, dispatch }) => {
const [isOpen, setOpen] = useState(false);
- const [item, setItem] = useState({
- id: uuidv4(),
- enable: true,
- name: '',
- major: '',
- start: '',
- end: '',
- grade: '',
- description: '',
- });
+ const [item, setItem] = useState(emptyItem());
const onChange = (key, value) => setItem(set({ ...item }, key, value));
const onSubmit = () => {
- if (item.name === '' || item.major === '') return;
+ if (item.educationalLevel === '') return;
- addItem(dispatch, 'education', item);
+ addItem(dispatch, 'data.jsonld["@graph"][1].hasCredential', item);
- setItem({
- id: uuidv4(),
- enable: true,
- name: '',
- role: '',
- start: '',
- end: '',
- grade: '',
- description: '',
- });
+ setItem(emptyItem());
setOpen(false);
};
@@ -157,13 +249,20 @@ const AddItem = ({ heading, dispatch }) => {
);
};
+const ItemActionEnable = (identifier, item, onChange) => {
+
+ return (
+ <>>
+ )
+}
+
const Item = ({ item, index, onChange, dispatch, first, last }) => {
const [isOpen, setOpen] = useState(false);
- const identifier = `data.education.items[${index}].`;
+ const identifier = `data.jsonld['@graph'][1].hasCredential[${index}].`;
return (
-
+
@@ -175,7 +274,8 @@ const Item = ({ item, index, onChange, dispatch, first, last }) => {
item={item}
last={last}
onChange={onChange}
- type="education"
+ type="data.jsonld['@graph'][1].hasCredential"
+ enableAction={ItemActionEnable}
/>
diff --git a/src/components/LeftSidebar/tabs/Work.js b/src/components/LeftSidebar/tabs/Work.js
index ccc92fb..1f1493b 100644
--- a/src/components/LeftSidebar/tabs/Work.js
+++ b/src/components/LeftSidebar/tabs/Work.js
@@ -42,7 +42,7 @@ const WorkTab = ({ data, onChange }) => {
index={index}
item={x}
key={_.get(x, '@id', 'item')}
- last={index === data.jsonld["@graph"][1].hasOccupation.length - 1}
+ last={index === _.size(data.jsonld["@graph"][1].hasOccupation) - 1}
onChange={onChange}
/>
))}
@@ -55,20 +55,24 @@ const WorkTab = ({ data, onChange }) => {
const Form = ({ item, onChange, identifier = '' }) => {
const { t } = useTranslation(['leftSidebar', 'app']);
const setValue = (path, field, v, type=null, id=null) => {
- let val = _.get(item, path+"."+field, null);
+ let fullPath = path;
+ if(field){
+ fullPath = fullPath+"."+field;
+ }
+ let val = _.get(item, fullPath, null);
if(val === null){
if(typeof(v) === "string" || typeof(v) === "number"){
- _.set(item, path+"."+field, "");
+ _.set(item, fullPath, "");
}else if(typeof(v) === "object"){
if(Array.isArray(v)){
- _.set(item, path+"."+field, []);
+ _.set(item, fullPath, []);
}else{
- _.set(item, path+"."+field, {});
+ _.set(item, fullPath, {});
}
}
}
- onChange(identifier+"."+path+'.'+field, v);
+ onChange(identifier+fullPath, v);
if(id){
onChange(`${identifier}`+path+'["@id"]', id);
}
@@ -122,6 +126,16 @@ const Form = ({ item, onChange, identifier = '' }) => {
AddItem={()=>{}}
type="multitext"
/>
+
+ setValue('hasOccupation', "skills", v)}
+ AddItem={()=>{}}
+ type="multitext"
+ />
{
)
);
+ const SectionSkillsItem = x => (
+ x && (
+ | {x}
+ )
+ )
+
+ const SectionSkills = ({skills}) => (
+ skills && skills.length && (
+
+ {
+ skills.filter(x => (x !== '')).map(SectionSkillsItem)
+ }
+
+ )
+ )
+
const WorkResponsibilityItem = x => (
x && (
{x}
@@ -179,7 +195,7 @@ const Celebi = () => {
)
)
-
+
const WorkItem = x => (
@@ -190,12 +206,12 @@ const Celebi = () => {
+
);
const Work = () =>
- data.work &&
- data.work.enable && (
+ _.get(data, "jsonld['@graph'][1].hasOccupation", []).length && data.work.enable && (
{_.get(data, "jsonld['@graph'][1].hasOccupation", []).filter(x => !_.get(x, '@id', '').endsWith("disable")).map(WorkItem)}
@@ -204,21 +220,22 @@ const Celebi = () => {
const EducationItem = x => (
-
{x.name}
-
{x.major}
+
{_.get(x, "about.provider.name", "")}
+
{_.get(x, "educationalLevel", "")} {_.get(x, "about.educationalCredentialAwarded", "")}
- {x.start} - {x.end}
+ {_.get(x, "about.startDate", "")} - {_.get(x, "about.endDate", "")}
-
+
+
);
const Education = () =>
- data.education &&
+ _.get(data, "jsonld['@graph'][1].hasCredential", []).length &&
data.education.enable && (
- {data.education.items.filter(x => x.enable).map(EducationItem)}
+ {_.get(data, "jsonld['@graph'][1].hasCredential", []).filter(x => !_.get(x, '@id', '').endsWith("disable")).map(EducationItem)}
);
From 7639e58cd317d7ecf5fd17fecec4e547137c47ad Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Fri, 29 Jan 2021 23:03:30 -0500
Subject: [PATCH 10/14] Updated Celebi
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/templates/celebi/Celebi.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index e4e98ad..4f37e32 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -171,7 +171,7 @@ const Celebi = () => {
)
const SectionSkills = ({skills}) => (
- skills && skills.length && (
+ skills && (skills.length>0) && (
{
skills.filter(x => (x !== '')).map(SectionSkillsItem)
@@ -187,7 +187,7 @@ const Celebi = () => {
)
const WorkResponsibility = ({responsibilities}) => (
- responsibilities && responsibilities.length && (
+ responsibilities && (responsibilities.length>0) && (
{
responsibilities.filter(x => (x !== '')).map(WorkResponsibilityItem)
@@ -231,7 +231,7 @@ const Celebi = () => {
);
const Education = () =>
- _.get(data, "jsonld['@graph'][1].hasCredential", []).length &&
+ (_.get(data, "jsonld['@graph'][1].hasCredential", []).length>0) &&
data.education.enable && (
From 72f06dcc8fb7207527bac9519a5ef86f05c3ee49 Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Fri, 29 Jan 2021 23:56:21 -0500
Subject: [PATCH 11/14] Added award, removed certification and skills
Certifiction is a sub-part of education, and skills is a sub-part of education and work
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
README.md | 30 ++++++++++--
src/components/LeftSidebar/LeftSidebar.js | 6 ---
src/components/LeftSidebar/tabs/Awards.js | 59 +++++++++++++----------
src/templates/celebi/Celebi.js | 24 ++++-----
4 files changed, 72 insertions(+), 47 deletions(-)
diff --git a/README.md b/README.md
index 117a5ff..a5cb9fe 100644
--- a/README.md
+++ b/README.md
@@ -65,12 +65,34 @@ To translate the app, just fork the repository, go to `src/i18n/locales` and dup
Thank you to all the amazing people who have contributed by translating it into their native language.
-### Building from Source
-
-Want to run your own instance of Json-ld lab-web? You are very much free to do so. The requirements to build from source are:
+### Installing Pre-requisites
- NodeJS/NPM
+This application needs NodeJs to run. You can download and install NodeJs from the below link on any platform if you do not have it already.
+[NodeJS](https://nodejs.org/en/)
+
+you can also check if you already have NodeJs installed by running the following two commands in terminal window
+
+```
+node -v
+npm -v
+```
+
+- Git
+You also need git to be able to easily download the files from github into our computer (unless in step 1, you prefer to download files manually from this github repository)
+[Git-Scm](https://git-scm.com/downloads)
+
+you can also check if you already have NodeJs installed by running the following command in terminal window
+
+```
+git --version
+```
+
+### Building from Source
+
+Want to run your own instance of Json-ld lab-web? You are very much free to do so. Follow 3 easy steps:
+
1. First, clone this project repository
```
@@ -104,7 +126,7 @@ Thank you to everyone who made this project possible, including the many users w
[Dr. Nematollah Shiri](https://www.concordia.ca/ginacody/computer-science-software-eng/faculty.html?fpid=nematollaah-shiri) for contributing to the research of the project
-
[Amruth Pillai](https://github.com/AmruthPillai) for [Reactive-Resume Project](https://github.com/AmruthPillai/Reactive-Resume), which lab-web is heavily based on
+
[Amruth Pillai](https://github.com/AmruthPillai) for [Reactive-Resume Project](https://github.com/AmruthPillai/Reactive-Resume), which lab-web is heavily based on. We modified the base code to accomodate for json-ld instead of original json format, and also added cool fatures that are only attainable with json-ld.
---
diff --git a/src/components/LeftSidebar/LeftSidebar.js b/src/components/LeftSidebar/LeftSidebar.js
index ef967ce..aac21ae 100644
--- a/src/components/LeftSidebar/LeftSidebar.js
+++ b/src/components/LeftSidebar/LeftSidebar.js
@@ -30,8 +30,6 @@ const LeftSidebar = () => {
{ key: 'work', name: _.get(data, "work.heading", "Work") },
{ key: 'education', name: _.get(data, "education.heading", "Education") },
{ key: 'awards', name: _.get(data, "awards.heading", "Awards") },
- { key: 'certifications', name: _.get(data, "certifications.heading", "Certifications") },
- { key: 'skills', name: _.get(data, "skills.heading", "Skills") },
{ key: 'hobbies', name: _.get(data, "hobbies.heading", "Hobbies") },
{ key: 'languages', name: _.get(data, "languages.heading", "Languages") },
{ key: 'references', name: _.get(data, "references.heading", "References") },
@@ -66,10 +64,6 @@ const LeftSidebar = () => {
return
;
case 'awards':
return
;
- case 'certifications':
- return
;
- case 'skills':
- return
;
case 'hobbies':
return
;
case 'languages':
diff --git a/src/components/LeftSidebar/tabs/Awards.js b/src/components/LeftSidebar/tabs/Awards.js
index 1e584f7..aeb5a6e 100644
--- a/src/components/LeftSidebar/tabs/Awards.js
+++ b/src/components/LeftSidebar/tabs/Awards.js
@@ -12,6 +12,8 @@ import ItemActions from '../../../shared/ItemActions';
import AddItemButton from '../../../shared/AddItemButton';
import ItemHeading from '../../../shared/ItemHeading';
+import * as _ from 'lodash';
+
const AwardsTab = ({ data, onChange }) => {
const context = useContext(AppContext);
const { dispatch } = context;
@@ -36,7 +38,7 @@ const AwardsTab = ({ data, onChange }) => {
- {data.awards.items.map((x, index) => (
+ {_.get(data.jsonld["@graph"][0], 'award', []).map((x, index) => (
- {
onChange={onChange}
dispatch={dispatch}
first={index === 0}
- last={index === data.awards.items.length - 1}
+ last={index === _.size(_.get(data.jsonld["@graph"][0], 'award', [])) - 1}
/>
))}
@@ -62,16 +64,16 @@ const Form = ({ item, onChange, identifier = '' }) => {
className="mb-6"
label={t('awards.title.label')}
placeholder="Code For Good Hackathon"
- value={item.title}
- onChange={v => onChange(`${identifier}title`, v)}
+ value={_.get(item,'skill:title', "")}
+ onChange={v => onChange(`${identifier}['skill:title']`, v)}
/>
onChange(`${identifier}subtitle`, v)}
+ value={_.get(item, 'skill:nativeLabel', '')}
+ onChange={v => onChange(`${identifier}['skill:nativeLabel']`, v)}
/>
{
);
};
+const emptyItem = () => {
+ let id = uuidv4();
+ return ({
+ "@type": "skill:Award",
+ "@id": "_:"+id+"#enable",
+ "skill:title": "",
+ "skill:nativeLabel": "",
+ description: ''
+ });
+};
+
const AddItem = ({ heading, dispatch }) => {
const [isOpen, setOpen] = useState(false);
- const [item, setItem] = useState({
- id: uuidv4(),
- enable: true,
- title: '',
- subtitle: '',
- description: '',
- });
+ const [item, setItem] = useState(emptyItem());
const onChange = (key, value) => setItem(set({ ...item }, key, value));
const onSubmit = () => {
- if (item.title === '') return;
+ if (item["skill:title"] === '') return;
- addItem(dispatch, 'awards', item);
+ addItem(dispatch, 'data.jsonld["@graph"][0]["award"]', item);
- setItem({
- id: uuidv4(),
- enable: true,
- title: '',
- subtitle: '',
- description: '',
- });
+ setItem(emptyItem());
setOpen(false);
};
@@ -125,13 +126,20 @@ const AddItem = ({ heading, dispatch }) => {
);
};
+const ItemActionEnable = (identifier, item, onChange) => {
+
+ return (
+ <>>
+ )
+}
+
const Item = ({ item, index, onChange, dispatch, first, last }) => {
const [isOpen, setOpen] = useState(false);
- const identifier = `data.awards.items[${index}].`;
+ const identifier = `data.jsonld["@graph"][0].award[${index}].`;
return (
-
+
@@ -143,7 +151,8 @@ const Item = ({ item, index, onChange, dispatch, first, last }) => {
item={item}
last={last}
onChange={onChange}
- type="awards"
+ type="data.jsonld['@graph'][0].award"
+ enableAction={ItemActionEnable}
/>
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index 4f37e32..b82181b 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -144,7 +144,7 @@ const Celebi = () => {
const AddressItem = (x, index) => (
(
-
+
{index===0?
{data.profile.address.heading || "Address"} :""}
{x.streetAddress}
{x.addressLocality} {x.addressRegion}
@@ -219,7 +219,7 @@ const Celebi = () => {
);
const EducationItem = x => (
-
+
{_.get(x, "about.provider.name", "")}
{_.get(x, "educationalLevel", "")} {_.get(x, "about.educationalCredentialAwarded", "")}
@@ -235,7 +235,7 @@ const Celebi = () => {
data.education.enable && (
- {_.get(data, "jsonld['@graph'][1].hasCredential", []).filter(x => !_.get(x, '@id', '').endsWith("disable")).map(EducationItem)}
+ {_.get(data, "jsonld['@graph'][1].hasCredential", []).filter(x => (!_.get(x, '@id', '').endsWith("disable") && _.get(x, 'credentialCategory', '')==="Degree")).map(EducationItem)}
);
@@ -316,10 +316,10 @@ const Celebi = () => {
);
const AwardItem = x => (
-
-
{x.title}
-
{x.subtitle}
-
+
+
{_.get(x, "skill:title", "")}
+
{_.get(x, "skill:nativeLabel", "")}
+
);
@@ -328,15 +328,15 @@ const Celebi = () => {
data.awards.enable && (
- {data.awards.items.filter(x => x.enable).map(AwardItem)}
+ {_.get(data.jsonld["@graph"][0], 'award', []).filter(x => x["skill:title"]!=="").map(AwardItem)}
);
const CertificationItem = x => (
-
{x.title}
-
{x.subtitle}
-
+
{_.get(x, 'educationalLevel', '')}
+
{_.get(x, 'about.educationalCredentialAwarded', '')}
+
);
@@ -345,7 +345,7 @@ const Celebi = () => {
data.certifications.enable && (
- {data.certifications.items.filter(x => x.enable).map(CertificationItem)}
+ {_.get(data, "jsonld['@graph'][1].hasCredential", []).filter(x => (!_.get(x, '@id', '').endsWith("disable") && _.get(x, 'credentialCategory', '')!=="Degree")).map(CertificationItem)}
);
From bf3a2fc3f3ed04905b0062affb6082ce49a7aab4 Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Sat, 30 Jan 2021 23:57:18 -0500
Subject: [PATCH 12/14] Changed Hobbies to Memberships
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/assets/demo/data.json | 6 +-
src/assets/demo/jsonlddata.json | 6 +-
src/components/LeftSidebar/LeftSidebar.js | 10 +-
src/components/LeftSidebar/tabs/Education.js | 2 +-
src/components/LeftSidebar/tabs/Hobbies.js | 140 --------------
.../LeftSidebar/tabs/Memberships.js | 178 ++++++++++++++++++
src/context/AppContext.js | 4 +-
src/templates/castform/Castform.js | 12 +-
src/templates/celebi/Celebi.js | 16 +-
src/templates/gengar/Gengar.js | 4 +-
src/templates/glalie/Glalie.js | 4 +-
src/templates/onyx/Onyx.js | 12 +-
src/templates/pikachu/Pikachu.js | 4 +-
13 files changed, 217 insertions(+), 181 deletions(-)
delete mode 100644 src/components/LeftSidebar/tabs/Hobbies.js
create mode 100644 src/components/LeftSidebar/tabs/Memberships.js
diff --git a/src/assets/demo/data.json b/src/assets/demo/data.json
index a54ad06..d5dc6df 100644
--- a/src/assets/demo/data.json
+++ b/src/assets/demo/data.json
@@ -168,9 +168,9 @@
}
]
},
- "hobbies": {
+ "Memberships": {
"enable": true,
- "heading": "Hobbies",
+ "heading": "Memberships",
"items": [
{
"id": "dd2efad7-e900-4384-bdc0-b2ab5f62bb71",
@@ -279,7 +279,7 @@
},
{
"id": "7f0a4971-9770-4ca7-b135-2b0ccd867879",
- "key": "Hobbies",
+ "key": "Memberships",
"value": "Playing Soccer & Guitar",
"enable": true
},
diff --git a/src/assets/demo/jsonlddata.json b/src/assets/demo/jsonlddata.json
index 0a34603..ab1eccc 100644
--- a/src/assets/demo/jsonlddata.json
+++ b/src/assets/demo/jsonlddata.json
@@ -282,9 +282,9 @@
}
]
},
- "hobbies": {
+ "memberships": {
"enable": true,
- "heading": "Hobbies",
+ "heading": "Memberships",
"items": [
{
"id": "dd2efad7-e900-4384-bdc0-b2ab5f62bb71",
@@ -392,7 +392,7 @@
},
{
"id": "7f0a4971-9770-4ca7-b135-2b0ccd867879",
- "key": "Hobbies",
+ "key": "Membership",
"value": "Playing Soccer & Guitar",
"enable": true
},
diff --git a/src/components/LeftSidebar/LeftSidebar.js b/src/components/LeftSidebar/LeftSidebar.js
index aac21ae..f13b424 100644
--- a/src/components/LeftSidebar/LeftSidebar.js
+++ b/src/components/LeftSidebar/LeftSidebar.js
@@ -10,12 +10,10 @@ import ObjectiveTab from './tabs/Objective';
import WorkTab from './tabs/Work';
import EducationTab from './tabs/Education';
import AwardsTab from './tabs/Awards';
-import CertificationsTab from './tabs/Certifications';
-import SkillsTab from './tabs/Skills';
import ExtrasTab from './tabs/Extras';
import LanguagesTab from './tabs/Languages';
import ReferencesTab from './tabs/References';
-import HobbiesTab from './tabs/Hobbies';
+import MembershipsTab from './tabs/Memberships';
const LeftSidebar = () => {
const context = useContext(AppContext);
@@ -30,7 +28,7 @@ const LeftSidebar = () => {
{ key: 'work', name: _.get(data, "work.heading", "Work") },
{ key: 'education', name: _.get(data, "education.heading", "Education") },
{ key: 'awards', name: _.get(data, "awards.heading", "Awards") },
- { key: 'hobbies', name: _.get(data, "hobbies.heading", "Hobbies") },
+ { key: 'memberships', name: _.get(data, "memberships.heading", "Memberships") },
{ key: 'languages', name: _.get(data, "languages.heading", "Languages") },
{ key: 'references', name: _.get(data, "references.heading", "References") },
{ key: 'extras', name: _.get(data, "extras.heading", "Extras") },
@@ -64,8 +62,8 @@ const LeftSidebar = () => {
return
;
case 'awards':
return
;
- case 'hobbies':
- return
;
+ case 'memberships':
+ return
;
case 'languages':
return
;
case 'references':
diff --git a/src/components/LeftSidebar/tabs/Education.js b/src/components/LeftSidebar/tabs/Education.js
index 5b06ac6..7783517 100644
--- a/src/components/LeftSidebar/tabs/Education.js
+++ b/src/components/LeftSidebar/tabs/Education.js
@@ -42,7 +42,7 @@ const EducationTab = ({ data, onChange }) => {
{_.get(data.jsonld["@graph"][1], 'hasCredential', []).map((x, index) => (
- {
- const context = useContext(AppContext);
- const { dispatch } = context;
-
- return (
- <>
-
-
- onChange('data.hobbies.enable', v)}
- />
-
-
- onChange('data.hobbies.heading', v)}
- />
-
-
-
-
-
- {data.hobbies.items.map((x, index) => (
-
- ))}
-
-
- >
- );
-};
-
-const Form = ({ item, onChange }) => {
- return (
- onChange(e.target.value)}
- type="text"
- />
- );
-};
-
-const AddItem = ({ heading, dispatch }) => {
- const [isOpen, setOpen] = useState(false);
- const [item, setItem] = useState({
- id: uuidv4(),
- hobby: ''
- });
-
- const add = () => {
- if (item.hobby === '') return;
-
- addItem(dispatch, 'hobbies', item);
-
- setItem({
- id: uuidv4(),
- hobby: ''
- });
- };
-
- return (
-
-
-
-
-
-
-
setItem({...item, hobby: v})} />
-
-
-
-
- add
-
-
-
-
-
- );
-};
-
-const Item = ({ item, index, onChange, dispatch }) => {
- const identifier = `data.hobbies.items[${index}]`;
-
- return (
-
-
-
onChange(identifier, v)} />
-
-
-
moveItemUp(dispatch, 'hobbies', item)}
- className="col-span-1 text-gray-600 hover:text-red-600 text-sm font-medium"
- >
-
- arrow_upward
-
-
-
-
moveItemDown(dispatch, 'hobbies', item)}
- className="col-span-1 text-gray-600 hover:text-red-600 text-sm font-medium"
- >
-
- arrow_downward
-
-
-
-
deleteItem(dispatch, 'hobbies', item)}
- className="col-span-1 text-gray-600 hover:text-red-600 text-sm font-medium"
- >
-
- close
-
-
-
- );
-};
-
-export default HobbiesTab;
diff --git a/src/components/LeftSidebar/tabs/Memberships.js b/src/components/LeftSidebar/tabs/Memberships.js
new file mode 100644
index 0000000..2436879
--- /dev/null
+++ b/src/components/LeftSidebar/tabs/Memberships.js
@@ -0,0 +1,178 @@
+import React, { useState, useContext } from 'react';
+import { useTranslation } from 'react-i18next';
+import { v4 as uuidv4 } from 'uuid';
+import set from 'lodash/set';
+
+import TextField from '../../../shared/TextField';
+import AppContext from '../../../context/AppContext';
+import Checkbox from '../../../shared/Checkbox';
+import { addItem } from '../../../utils';
+import ItemActions from '../../../shared/ItemActions';
+import AddItemButton from '../../../shared/AddItemButton';
+import ItemHeading from '../../../shared/ItemHeading';
+
+import * as _ from 'lodash';
+
+const MembershipsTab = ({ data, onChange }) => {
+ const context = useContext(AppContext);
+ const { dispatch } = context;
+
+ return (
+ <>
+
+
+ onChange('data.Memberships.enable', v)}
+ />
+
+
+ onChange('data.Memberships.heading', v)}
+ />
+
+
+
+
+
+ {_.get(data.jsonld["@graph"][1], 'memberOf', []).map((x, index) => (
+
+ ))}
+
+
+ >
+ );
+};
+
+const Form = ({ item, onChange, identifier = '' }) => {
+ const { t } = useTranslation(['leftSidebar', 'app']);
+
+ return (
+
+
onChange(`${identifier}memberOf.programName`, v)}
+ />
+
+
+ onChange(`${identifier}startDate`, v)}
+ />
+
+ onChange(`${identifier}endDate`, v)}
+ />
+
+ onChange(`${identifier}roleName`, v)}
+ />
+
+ );
+};
+
+const emptyItem = () => {
+ let id = uuidv4();
+ return (
+ {
+ "@id": "_:"+id+"#enable",
+ "@type": "Role",
+ "startDate": "",
+ "endDate": "",
+ "roleName": "member",
+ "memberOf": {
+ "@id": "_:"+id+"#memberOf",
+ "@type": "ProgramMembership",
+ "url": "",
+ "programName": "",
+ "description": ""
+ }
+ }
+ );
+};
+
+const AddItem = ({ heading, dispatch }) => {
+ const [isOpen, setOpen] = useState(false);
+ const [item, setItem] = useState(emptyItem());
+
+ const onChange = (key, value) => setItem(set({ ...item }, key, value));
+ const onSubmit = () => {
+ if (_.get(item, 'roleName', '') === '') return;
+
+ addItem(dispatch, 'data.jsonld["@graph"][1].memberOf', item);
+
+ setItem(emptyItem());
+
+ setOpen(false);
+ };
+
+ return (
+
+ );
+};
+
+const ItemActionEnable = (identifier, item, onChange) => {
+
+ return (
+ <>>
+ )
+}
+
+const Item = ({ item, index, onChange, dispatch, first, last }) => {
+ const [isOpen, setOpen] = useState(false);
+ const identifier = `data.jsonld['@graph'][1].memberOf[${index}].`;
+
+ return (
+
+ );
+};
+
+export default MembershipsTab;
diff --git a/src/context/AppContext.js b/src/context/AppContext.js
index 78df377..cdbbe20 100644
--- a/src/context/AppContext.js
+++ b/src/context/AppContext.js
@@ -73,9 +73,9 @@ const initialState = {
heading: 'Skills',
items: [],
},
- hobbies: {
+ memberships: {
enable: true,
- heading: 'Hobbies',
+ heading: 'Memberships',
items: [],
},
languages: {
diff --git a/src/templates/castform/Castform.js b/src/templates/castform/Castform.js
index a810140..0e25ef7 100644
--- a/src/templates/castform/Castform.js
+++ b/src/templates/castform/Castform.js
@@ -99,12 +99,12 @@ const Castform = () => {
);
- const Hobbies = () =>
- data.hobbies &&
- data.hobbies.enable && (
+ const Memberships = () =>
+ data.memberships &&
+ data.memberships.enable && (
-
-
{data.hobbies.items.map(HobbyItem)}
+
+
{data.memberships.items.map(HobbyItem)}
);
@@ -291,7 +291,7 @@ const Castform = () => {
-
+
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index b82181b..42a1b0b 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -253,14 +253,14 @@ const Celebi = () => {
);
- const Hobbies = () =>
- data.hobbies.enable && (
+ const Memberships = () =>
+ data.memberships.enable && (
-
+
- {data.hobbies.items.map(x => (
-
- {x.hobby}
+ {_.get(data.jsonld["@graph"][1], 'memberOf', []).map(x => (
+
+ {_.get(x, "memberOf.programName", "")}
))}
@@ -333,7 +333,7 @@ const Celebi = () => {
);
const CertificationItem = x => (
-
+
{_.get(x, 'educationalLevel', '')}
{_.get(x, 'about.educationalCredentialAwarded', '')}
@@ -381,7 +381,7 @@ const Celebi = () => {
-
+
diff --git a/src/templates/gengar/Gengar.js b/src/templates/gengar/Gengar.js
index 5c4e654..b0c1db1 100644
--- a/src/templates/gengar/Gengar.js
+++ b/src/templates/gengar/Gengar.js
@@ -85,7 +85,7 @@ const Gengar = () => {
);
- const Hobbies = () =>
+ const Memberships = () =>
data.hobbies &&
data.hobbies.enable && (
@@ -300,7 +300,7 @@ const Gengar = () => {
style={{ backgroundColor: `rgba(${r}, ${g}, ${b}, 0.1)` }}
>
-
+
diff --git a/src/templates/glalie/Glalie.js b/src/templates/glalie/Glalie.js
index 1484ca5..3731765 100644
--- a/src/templates/glalie/Glalie.js
+++ b/src/templates/glalie/Glalie.js
@@ -193,7 +193,7 @@ const Glalie = () => {
);
- const Hobbies = () =>
+ const Memberships = () =>
data.hobbies &&
data.hobbies.enable && (
@@ -290,7 +290,7 @@ const Glalie = () => {
-
+
diff --git a/src/templates/onyx/Onyx.js b/src/templates/onyx/Onyx.js
index be356c7..689e823 100644
--- a/src/templates/onyx/Onyx.js
+++ b/src/templates/onyx/Onyx.js
@@ -158,12 +158,12 @@ const Onyx = () => {
);
- const Hobbies = () =>
- data.hobbies &&
- data.hobbies.enable && (
+ const Memberships = () =>
+ data.memberships &&
+ data.memberships.enable && (
-
-
{data.hobbies.items.map(HobbyItem)}
+
+
{data.memberships.items.map(HobbyItem)}
);
@@ -299,7 +299,7 @@ const Onyx = () => {
-
+
diff --git a/src/templates/pikachu/Pikachu.js b/src/templates/pikachu/Pikachu.js
index 3d7cad6..257f7c7 100644
--- a/src/templates/pikachu/Pikachu.js
+++ b/src/templates/pikachu/Pikachu.js
@@ -85,7 +85,7 @@ const Pikachu = () => {
);
- const Hobbies = () =>
+ const Memberships = () =>
data.hobbies &&
data.hobbies.enable && (
@@ -292,7 +292,7 @@ const Pikachu = () => {
-
+
From b953e9278d3b985aa3083435336abd5ac44279b5 Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Sun, 31 Jan 2021 01:23:08 -0500
Subject: [PATCH 13/14] Converted language
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/components/LeftSidebar/tabs/Languages.js | 72 +++++++-------------
src/templates/celebi/Celebi.js | 8 +--
2 files changed, 27 insertions(+), 53 deletions(-)
diff --git a/src/components/LeftSidebar/tabs/Languages.js b/src/components/LeftSidebar/tabs/Languages.js
index 30a79bc..239c853 100644
--- a/src/components/LeftSidebar/tabs/Languages.js
+++ b/src/components/LeftSidebar/tabs/Languages.js
@@ -6,12 +6,13 @@ import { v4 as uuidv4 } from 'uuid';
import AppContext from '../../../context/AppContext';
import AddItemButton from '../../../shared/AddItemButton';
import Checkbox from '../../../shared/Checkbox';
-import Counter from '../../../shared/Counter';
import ItemActions from '../../../shared/ItemActions';
import ItemHeading from '../../../shared/ItemHeading';
import TextField from '../../../shared/TextField';
import { addItem } from '../../../utils';
+import * as _ from 'lodash';
+
const LanguagesTab = ({ data, onChange }) => {
const context = useContext(AppContext);
const { dispatch } = context;
@@ -55,15 +56,15 @@ const LanguagesTab = ({ data, onChange }) => {
- {data.languages.items.map((x, index) => (
+ {_.get(data.jsonld["@graph"][1], 'knowsLanguage', []).map((x, index) => (
))}
@@ -82,61 +83,34 @@ const Form = ({ item, onChange, identifier = '' }) => {
className="mb-6"
label={t('languages.key.label')}
placeholder="English"
- value={item.key}
- onChange={v => onChange(`${identifier}key`, v)}
- />
-
-
onChange(`${identifier}level`, v)}
- />
-
-
- item.rating > 1
- ? onChange(`${identifier}rating`, item.rating - 1)
- : onChange(`${identifier}rating`, 0)
- }
- onIncrement={() =>
- item.rating < 5
- ? onChange(`${identifier}rating`, item.rating + 1)
- : onChange(`${identifier}rating`, 0)
- }
+ value={_.get(item,'name', '')}
+ onChange={v => onChange(`${identifier}name`, v)}
/>
);
};
+const emptyItem = () => {
+ let id = uuidv4();
+ return ({
+ "@type": "Language",
+ "@id": "_:"+id,
+ "name": ""
+ });
+}
const AddItem = ({ heading, dispatch }) => {
const [isOpen, setOpen] = useState(false);
- const [item, setItem] = useState({
- id: uuidv4(),
- enable: true,
- key: '',
- value: '',
- rating: 1,
- });
+
+ const [item, setItem] = useState(emptyItem());
const onChange = (key, value) => setItem(items => set({ ...items }, key, value));
const onSubmit = () => {
- if (item.key === '') return;
+ if (_.get(item, 'name', '') === '') return;
- addItem(dispatch, 'languages', item);
+ addItem(dispatch, 'data.jsonld["@graph"][1].knowsLanguage', item);
- setItem({
- id: uuidv4(),
- enable: true,
- key: '',
- value: '',
- rating: 1,
- });
+ setItem(emptyItem());
setOpen(false);
};
@@ -156,11 +130,11 @@ const AddItem = ({ heading, dispatch }) => {
const Item = ({ item, index, onChange, dispatch, first, last }) => {
const [isOpen, setOpen] = useState(false);
- const identifier = `data.languages.items[${index}].`;
+ const identifier = `data.jsonld["@graph"][1].knowsLanguage[${index}].`;
return (
-
+
@@ -172,7 +146,7 @@ const Item = ({ item, index, onChange, dispatch, first, last }) => {
item={item}
last={last}
onChange={onChange}
- type="languages"
+ type="data.jsonld['@graph'][1].knowsLanguage"
/>
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index 42a1b0b..aa703d0 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -289,8 +289,8 @@ const Celebi = () => {
);
const LanguageItem = x => (
-
-
{x.key}
+
+
{_.get(x, 'name', '')}
{x.level &&
{x.level}
}
{x.rating !== 0 && (
@@ -308,10 +308,10 @@ const Celebi = () => {
const Languages = () =>
data.languages &&
- data.languages.enable && (
+ data.languages.enable && (_.get(data, 'jsonld["@graph"][1].knowsLanguage',[]).length > 0) && (
-
{data.languages.items.filter(x => x.enable).map(LanguageItem)}
+
{_.get(data, 'jsonld["@graph"][1].knowsLanguage', []).filter(x => _.get(x, 'name', '') !== '').map(LanguageItem)}
);
From 4f047f0516c95bde9cece71968b9001fcedd1cfc Mon Sep 17 00:00:00 2001
From: Ehsan <68260235+directionXcorporation@users.noreply.github.com>
Date: Sun, 31 Jan 2021 11:28:36 -0500
Subject: [PATCH 14/14] Modifications for Extras and other tabs
Co-Authored-By: Pegah <2495769+pegah-m-sadeghi@users.noreply.github.com>
---
src/components/LeftSidebar/tabs/Awards.js | 2 +-
src/components/LeftSidebar/tabs/Extras.js | 48 +++----
src/components/LeftSidebar/tabs/Languages.js | 3 +-
src/components/LeftSidebar/tabs/References.js | 121 +++++++++++-------
src/templates/celebi/Celebi.js | 26 ++--
5 files changed, 115 insertions(+), 85 deletions(-)
diff --git a/src/components/LeftSidebar/tabs/Awards.js b/src/components/LeftSidebar/tabs/Awards.js
index aeb5a6e..4b16dae 100644
--- a/src/components/LeftSidebar/tabs/Awards.js
+++ b/src/components/LeftSidebar/tabs/Awards.js
@@ -41,7 +41,7 @@ const AwardsTab = ({ data, onChange }) => {
{_.get(data.jsonld["@graph"][0], 'award', []).map((x, index) => (
- {
const context = useContext(AppContext);
const { dispatch } = context;
@@ -35,15 +37,15 @@ const ExtrasTab = ({ data, onChange }) => {
- {data.extras.items.map((x, index) => (
+ {_.get(data.jsonld["@graph"][1], 'identifier', []).map((x, index) => (
))}
@@ -61,43 +63,43 @@ const Form = ({ item, onChange, identifier = '' }) => {
className="mb-6"
label={t('extras.key.label')}
placeholder="Date of Birth"
- value={item.key}
- onChange={v => onChange(`${identifier}key`, v)}
+ value={_.get(item, 'propertyID', '')}
+ onChange={v => onChange(`${identifier}propertyID`, v)}
/>
onChange(`${identifier}value`, v)}
/>
);
};
+const emptyItem = () => {
+ let id = uuidv4();
+ return ({
+ "@type": "PropertyValue",
+ "@id": "_:Extras_"+id,
+ "propertyID": "",
+ "value": ""
+ });
+}
+
const AddItem = ({ heading, dispatch }) => {
const [isOpen, setOpen] = useState(false);
- const [item, setItem] = useState({
- id: uuidv4(),
- enable: true,
- key: '',
- value: '',
- });
+ const [item, setItem] = useState(emptyItem());
const onChange = (key, value) => setItem(items => set({ ...items }, key, value));
const onSubmit = () => {
- if (item.key === '' || item.value === '') return;
+ if (_.get(item, 'propertyID', '') === '' || _.get(item, 'value', '') === '') return;
- addItem(dispatch, 'extras', item);
+ addItem(dispatch, 'data.jsonld["@graph"][1].identifier', item);
- setItem({
- id: uuidv4(),
- enable: true,
- key: '',
- value: '',
- });
+ setItem(emptyItem());
setOpen(false);
};
@@ -117,11 +119,11 @@ const AddItem = ({ heading, dispatch }) => {
const Item = ({ item, index, onChange, dispatch, first, last }) => {
const [isOpen, setOpen] = useState(false);
- const identifier = `data.extras.items[${index}].`;
+ const identifier = `data.jsonld["@graph"][1].identifier[${index}].`;
return (
-
+
@@ -133,7 +135,7 @@ const Item = ({ item, index, onChange, dispatch, first, last }) => {
item={item}
last={last}
onChange={onChange}
- type="extras"
+ type="data.jsonld['@graph'][1].identifier"
/>
diff --git a/src/components/LeftSidebar/tabs/Languages.js b/src/components/LeftSidebar/tabs/Languages.js
index 239c853..9588aa7 100644
--- a/src/components/LeftSidebar/tabs/Languages.js
+++ b/src/components/LeftSidebar/tabs/Languages.js
@@ -25,8 +25,7 @@ const LanguagesTab = ({ data, onChange }) => {
key: 'languages',
value: {
enable: false,
- heading: 'Languages',
- items: [],
+ heading: 'Languages'
},
},
});
diff --git a/src/components/LeftSidebar/tabs/References.js b/src/components/LeftSidebar/tabs/References.js
index f369eeb..569d0cf 100644
--- a/src/components/LeftSidebar/tabs/References.js
+++ b/src/components/LeftSidebar/tabs/References.js
@@ -12,6 +12,8 @@ import ItemActions from '../../../shared/ItemActions';
import ItemHeading from '../../../shared/ItemHeading';
import AddItemButton from '../../../shared/AddItemButton';
+import * as _ from 'lodash';
+
const ReferencesTab = ({ data, onChange }) => {
const context = useContext(AppContext);
const { dispatch } = context;
@@ -24,8 +26,7 @@ const ReferencesTab = ({ data, onChange }) => {
key: 'references',
value: {
enable: false,
- heading: 'References',
- items: [],
+ heading: 'References'
},
},
});
@@ -33,7 +34,7 @@ const ReferencesTab = ({ data, onChange }) => {
dispatch({ type: 'save_data' });
}
}, [data, dispatch]);
-
+
return (
'references' in data && (
<>
@@ -55,15 +56,15 @@ const ReferencesTab = ({ data, onChange }) => {
- {data.references.items.map((x, index) => (
+ {_.get(data.jsonld["@graph"][1], 'interactionStatistic', []).filter(x => _.get(x, 'disambiguatingDescription', '')=== 'Reference').map((x, index) => (
- _.get(x, 'disambiguatingDescription', '')=== 'Reference').length - 1}
/>
))}
@@ -78,77 +79,107 @@ const Form = ({ item, onChange, identifier = '' }) => {
return (
-
onChange(`${identifier}name`, v)}
- />
+
+ onChange(`${identifier}interactionType.participant.givenName`, v)}
+ />
+
+ onChange(`${identifier}interactionType.participant.familyName`, v)}
+ />
+
onChange(`${identifier}position`, v)}
+ value={_.get(item, 'interactionType.participant.jobTitle', '')}
+ onChange={v => onChange(`${identifier}interactionType.participant.jobTitle`, v)}
/>
onChange(`${identifier}phone`, v)}
+ value={_.get(item, 'interactionType.participant.telephone', '')}
+ onChange={v => onChange(`${identifier}interactionType.participant.telephone`, v)}
/>
onChange(`${identifier}email`, v)}
+ value={_.get(item, 'interactionType.participant.email', '')}
+ onChange={v => onChange(`${identifier}interactionType.participant.email`, v)}
/>
onChange(`${identifier}description`, v)}
+ value={_.get(item, 'result[0].reviewRating.ratingExplanation', '')}
+ onChange={v => onChange(`${identifier}result[0].reviewRating.ratingExplanation`, v)}
/>
);
};
-
+const emptyItem = () => {
+ let id = uuidv4();
+ return (
+ {
+ "@id": "_:Reference#"+id,
+ "@type": "InteractionCounter",
+ "disambiguatingDescription": "Reference",
+ "interactionType": {
+ "@id": "_:Reference#"+id+"#interactionType",
+ "@type": "AssessAction",
+ "participant": {
+ "@id": "_:Reference#"+id+"#interactionType#participant",
+ "@type": "Person"
+ },
+ "result": [
+ {
+ "@id": "_:Reference#"+id+"#result",
+ "@type": "Review",
+ "itemReviewed": {
+
+ },
+ "reviewAspect": [
+
+ ],
+ "reviewRating": {
+ "@id": "_:Reference#"+id+"#result#reviewRating",
+ "@type": "Rating",
+ "ratingValue": "5",
+ "bestRating": "5",
+ "ratingExplanation": ""
+ }
+ }
+ ]
+ }
+ }
+ );
+}
const AddItem = ({ heading, dispatch }) => {
const [isOpen, setOpen] = useState(false);
- const [item, setItem] = useState({
- id: uuidv4(),
- enable: true,
- name: '',
- position: '',
- phone: '',
- email: '',
- description: '',
- });
+ const [item, setItem] = useState(emptyItem());
const onChange = (key, value) => setItem(set({ ...item }, key, value));
const onSubmit = () => {
- if (item.name === '' || item.position === '') return;
+ if (_.get(item, 'interactionType.participant.givenName', '') === '') return;
- addItem(dispatch, 'references', item);
+ addItem(dispatch, 'data.jsonld["@graph"][1].interactionStatistic', item);
- setItem({
- id: uuidv4(),
- enable: true,
- name: '',
- position: '',
- phone: '',
- email: '',
- description: '',
- });
+ setItem(emptyItem());
setOpen(false);
};
@@ -168,11 +199,11 @@ const AddItem = ({ heading, dispatch }) => {
const Item = ({ item, index, onChange, dispatch, first, last }) => {
const [isOpen, setOpen] = useState(false);
- const identifier = `data.references.items[${index}].`;
+ const identifier = `data.jsonld["@graph"][1].interactionStatistic[${index}].`;
return (
-
+
@@ -184,7 +215,7 @@ const Item = ({ item, index, onChange, dispatch, first, last }) => {
item={item}
last={last}
onChange={onChange}
- type="references"
+ type="data.jsonld['@graph'][1].interactionStatistic"
/>
diff --git a/src/templates/celebi/Celebi.js b/src/templates/celebi/Celebi.js
index aa703d0..93960ff 100644
--- a/src/templates/celebi/Celebi.js
+++ b/src/templates/celebi/Celebi.js
@@ -69,8 +69,6 @@ const Celebi = () => {
{((data.jsonld['@graph'][1].givenName[1]) ? (" ("+data.jsonld['@graph'][1].givenName.map(function(elem,index){
if(index > 0 && elem['@value']){
let name = elem['@value'];
- console.log(elem['@language']);
- console.log(data.jsonld['@graph'][1].familyName);
let familynameIndex = data.jsonld['@graph'][1].familyName.findIndex(x=>x['@language']===elem['@language']);
if(familynameIndex >= 0){
if(data.jsonld['@graph'][1].familyName[familynameIndex] && data.jsonld['@graph'][1].familyName[familynameIndex]['@value']){
@@ -235,7 +233,7 @@ const Celebi = () => {
data.education.enable && (
- {_.get(data, "jsonld['@graph'][1].hasCredential", []).filter(x => (!_.get(x, '@id', '').endsWith("disable") && _.get(x, 'credentialCategory', '')==="Degree")).map(EducationItem)}
+ {_.get(data, "jsonld['@graph'][1].hasCredential", []).filter(x => (!_.get(x, '@id', '').endsWith("disable") && _.get(x, 'credentialCategory', '')==="degree")).map(EducationItem)}
);
@@ -268,12 +266,12 @@ const Celebi = () => {
);
const ReferenceItem = x => (
-
-
{x.name}
-
{x.position}
-
{x.phone}
-
{x.email}
-
+
+
{_.get(x, 'interactionType.participant.givenName', '')} {_.get(x, 'interactionType.participant.familyName', '')}
+ {_.get(x, 'interactionType.participant.jobTitle', '')}
+ {_.get(x, 'interactionType.participant.telephone', '')}
+ {_.get(x, 'interactionType.participant.email', '')}
+
);
@@ -283,7 +281,7 @@ const Celebi = () => {
- {data.references.items.filter(x => x.enable).map(ReferenceItem)}
+ {_.get(data.jsonld["@graph"][1], 'interactionStatistic', []).filter(x => _.get(x, 'disambiguatingDescription', '')=== 'Reference').map(ReferenceItem)}
);
@@ -350,9 +348,9 @@ const Celebi = () => {
);
const ExtraItem = x => (
-
-
{x.key}
-
{x.value}
+
+
{_.get(x, 'propertyID', '')}
+
{_.get(x, 'value', '')}
);
@@ -361,7 +359,7 @@ const Celebi = () => {
data.extras.enable && (
- {data.extras.items.filter(x => x.enable).map(ExtraItem)}
+ {_.get(data.jsonld["@graph"][1], 'identifier', []).filter(x => x['value'] !== '').map(ExtraItem)}
);