From 3471227d55aebde657bfc947415eb8a77f68972d Mon Sep 17 00:00:00 2001 From: Peter Edmond Date: Thu, 29 May 2025 23:50:52 +0100 Subject: [PATCH] Removed folder duplicate --- eoq_code/Questions.json | 2072 ------------------------------ eoq_code/config.php | Bin 153600 -> 0 bytes eoq_code/db.php | 139 -- eoq_code/debug.html | 82 -- eoq_code/draw3axis.js | 111 -- eoq_code/drawbar.js | 285 ---- eoq_code/drawtriangle.js | 178 --- eoq_code/drawtriangleinverted.js | 161 --- eoq_code/getData.php | 152 --- eoq_code/getQuestions.php | 66 - eoq_code/getSurveys.php | 68 - eoq_code/get_qid_counts.html | 67 - eoq_code/get_qid_counts.php | 67 - eoq_code/populateGraphics.js | 337 ----- eoq_code/reportTemplate.html | 347 ----- eoq_code/savesvg.js | 177 --- 16 files changed, 4309 deletions(-) delete mode 100644 eoq_code/Questions.json delete mode 100644 eoq_code/config.php delete mode 100644 eoq_code/db.php delete mode 100644 eoq_code/debug.html delete mode 100644 eoq_code/draw3axis.js delete mode 100644 eoq_code/drawbar.js delete mode 100644 eoq_code/drawtriangle.js delete mode 100644 eoq_code/drawtriangleinverted.js delete mode 100644 eoq_code/getData.php delete mode 100644 eoq_code/getQuestions.php delete mode 100644 eoq_code/getSurveys.php delete mode 100644 eoq_code/get_qid_counts.html delete mode 100644 eoq_code/get_qid_counts.php delete mode 100644 eoq_code/populateGraphics.js delete mode 100644 eoq_code/reportTemplate.html delete mode 100644 eoq_code/savesvg.js diff --git a/eoq_code/Questions.json b/eoq_code/Questions.json deleted file mode 100644 index d12def6..0000000 --- a/eoq_code/Questions.json +++ /dev/null @@ -1,2072 +0,0 @@ -{ - "meta": { - "httpStatus": "200 - OK", - "requestId": "25a050da-69d9-49b6-9895-00cbf12d2953" - }, - "result": { - "elements": [ - { - "QuestionText": "2. EO Approach
\nDevelop shared values and practices that empower employee owners to contribute to success. 
\n
\nA true sense of ownership drives behaviour change and unlocks the potential of individuals.
\nInvolving employee owners in developing shared values and practices that supports them to have a voice, unlocks enhanced levels of personal, team and organisational performance – including attracting and retaining the right talent to excel in your marketplace.

\n
\n
\nTo what extent are you leveraging the full potential of your ownership mindset and behaviours?
\n ", - "DefaultChoices": false, - "DataExportTag": "Q20", - "QuestionType": "DB", - "Selector": "TB", - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "2. EO Approach Develop shared values and practices that empower employee owners to contribute to...", - "ChoiceOrder": [], - "Validation": { - "Settings": { - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "QuestionID": "QID1", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "NextChoiceId": 1, - "NextAnswerId": 1, - "QuestionText_Unsafe": "2. EO Approach
\nDevelop shared values and practices that empower employee owners to contribute to success. 
\n
\nA true sense of ownership drives behaviour change and unlocks the potential of individuals.
\nInvolving employee owners in developing shared values and practices that supports them to have a voice, unlocks enhanced levels of personal, team and organisational performance – including attracting and retaining the right talent to excel in your marketplace.

\n
\n
\nTo what extent are you leveraging the full potential of your ownership mindset and behaviours?
\n " - }, - { - "QuestionText": "Name", - "DefaultChoices": false, - "DataExportTag": "Q2", - "QuestionType": "TE", - "Selector": "SL", - "Configuration": { - "QuestionDescriptionOption": "UseText", - "AllowFreeResponse": "false" - }, - "QuestionDescription": "Name", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "QuestionID": "QID19", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionText_Unsafe": "Name" - }, - { - "QuestionText": "Great EO Culture", - "DefaultChoices": false, - "DataExportTag": "Q21", - "QuestionID": "QID2", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "Configuration": { - "QuestionDescriptionOption": "SpecifyLabel", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true, - "ChoiceColumnWidthPixels": 353 - }, - "QuestionDescription": "To what extent are you realising the full potential of your EO approach?Great EO Culture", - "Choices": { - "2": { - "Display": "Our people processes (recruitment, development, appraisal and reward) encourage and reward our desired owner behaviours" - }, - "4": { - "Display": "Our culture and people proposition retains the right talent in the business" - }, - "7": { - "Display": "Our people role model our desired owner behaviours" - }, - "8": { - "Display": "Our culture enables a safe environment for people to give feedback, voice concerns and share ideas" - }, - "9": { - "Display": "Our culture enables learning and growth" - }, - "10": { - "Display": "Our culture enables health and well-being" - }, - "11": { - "Display": "Our culture enables inclusion and diversity" - } - }, - "ChoiceOrder": [ - "7", - 2, - "8", - "9", - "10", - "11", - 4 - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "NextChoiceId": 20, - "NextAnswerId": 49, - "QuestionText_Unsafe": "Great EO Culture" - }, - { - "QuestionText": "Title", - "DefaultChoices": false, - "DataExportTag": "Q3", - "QuestionType": "TE", - "Selector": "SL", - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Title", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "QuestionID": "QID20", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionText_Unsafe": "Title" - }, - { - "QuestionText": "Email address", - "DefaultChoices": false, - "DataExportTag": "Q4", - "QuestionType": "TE", - "Selector": "SL", - "Configuration": { - "QuestionDescriptionOption": "UseText", - "AllowFreeResponse": "false" - }, - "QuestionDescription": "Email address", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "QuestionID": "QID21", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionText_Unsafe": "Email address" - }, - { - "QuestionText": "

The EO Framework for Great EO Business

\n\n

The EO Framework is rooted in research gathered from interviews with senior decision makers and employee owners on how they implement Great EO.
\nThis simple, structured model - developed with the support of sustainable success expert, Telos Partners - outlines the fundamentals vital for successful employee ownership across four key areas:
\n 

\n\n
1. EO Roles - Clearly defined EO roles with leaders, owners, and governance all understanding the part they play in making your EO a success.
\n​​​​2. EO Approach - A strong EO approach built on shared values and practices that empower employees to contribute to success.
\n3. EO Actions - that harness the full potential of employee owners to inform your strategy, innovation, and sustainability.
\n4. EO Results - a structured and consistent way of measuring and evolving the impact of your approach, roles, and actions. 
\n 
\n\n

This diagnostic, the Employee Ownership Quotient (eoQ), assesses the extent to which you are adopting best practice in these areas. 
\nIt should take 15-20 minutes to complete the questionnaire. 

", - "DefaultChoices": false, - "DataExportTag": "Q1", - "QuestionID": "QID32", - "QuestionType": "DB", - "Selector": "TB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "The EO Framework for Great EO Business The EO Framework is rooted in research gathered from inter...", - "ChoiceOrder": [], - "Validation": { - "Settings": { - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "QuestionText_Unsafe": "

The EO Framework for Great EO Business

\n\n

The EO Framework is rooted in research gathered from interviews with senior decision makers and employee owners on how they implement Great EO.
\nThis simple, structured model - developed with the support of sustainable success expert, Telos Partners - outlines the fundamentals vital for successful employee ownership across four key areas:
\n 

\n\n
1. EO Roles - Clearly defined EO roles with leaders, owners, and governance all understanding the part they play in making your EO a success.
\n​​​​2. EO Approach - A strong EO approach built on shared values and practices that empower employees to contribute to success.
\n3. EO Actions - that harness the full potential of employee owners to inform your strategy, innovation, and sustainability.
\n4. EO Results - a structured and consistent way of measuring and evolving the impact of your approach, roles, and actions. 
\n 
\n\n

This diagnostic, the Employee Ownership Quotient (eoQ), assesses the extent to which you are adopting best practice in these areas. 
\nIt should take 15-20 minutes to complete the questionnaire. 

" - }, - { - "QuestionText": "Great EO Engagement", - "DefaultChoices": false, - "DataExportTag": "Q23", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "ChoiceColumnWidthPixels": 353, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great EO Engagement", - "Choices": { - "2": { - "Display": "Our managers help to ensure our planning process, goal setting and employee feedback channels enable people to influence decision making" - }, - "7": { - "Display": "Our managers help to ensure our people understand how and where decisions are made in the business" - }, - "8": { - "Display": "Our managers help to ensure our people understand clearly the connection between their behaviours and strategy, business performance and reward" - }, - "9": { - "Display": "Our managers help to ensure our people are encouraged and empowered to take responsbility for their own performance and contribution" - } - }, - "ChoiceOrder": [ - "7", - 2, - "8", - "9" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 21, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID33", - "QuestionText_Unsafe": "Great EO Engagement" - }, - { - "QuestionText": "Great EO Advantage", - "DefaultChoices": false, - "DataExportTag": "Q25", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "ChoiceColumnWidthPixels": 353, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great EO Advantage", - "Choices": { - "2": { - "Display": "We are leveraging our EO status to help establish brand differentiation across key relationships, including leveraging our customer brand to provide a competitive advantage in our market presence and client relationships" - }, - "7": { - "Display": "We are leveraging our EO status to help establish brand differentiation across key relationships, including leveraging our employer brand to strengthen our people proposition and help attract talent" - }, - "8": { - "Display": "We are leveraging our EO status to help establish brand differentiation across key relationships, including leveraging our company brand to attract and retain high quality supplier relationships" - } - }, - "ChoiceOrder": [ - "7", - 2, - "8" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 17, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID34", - "QuestionText_Unsafe": "Great EO Advantage" - }, - { - "QuestionText": "Great Employee Owners", - "DefaultChoices": false, - "DataExportTag": "Q14", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "ChoiceColumnWidthPixels": 353, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great Employee Owners", - "Choices": { - "2": { - "Display": "Our employee owners are committed to ensuring we become a stronger business" - }, - "7": { - "Display": "

Our colleagues clearly understand what is meant by an active owner mindset, including the rights and responsibilities of being employee owners

\n" - }, - "8": { - "Display": "Our employee owners understand how their actions help deliver the performance of the business" - }, - "9": { - "Display": "Our employee owners understand how their actions help deliver the successful execution of the strategy" - }, - "10": { - "Display": "Our employee owners understand how their actions help deliver the health of the organisational culture" - } - }, - "ChoiceOrder": [ - "7", - 2, - "8", - "9", - "10" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 21, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID35", - "QuestionText_Unsafe": "Great Employee Owners" - }, - { - "QuestionText": "Great Leaders", - "DefaultChoices": false, - "DataExportTag": "Q16", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "ChoiceColumnWidthPixels": 353, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great Leaders", - "Choices": { - "2": { - "Display": "Our executive leaders have engaged our people in a cultural framework that sets out the organisational purpose, values, owner mindset and behaviours that will underpin our commercial success" - }, - "7": { - "Display": "Our executive leaders are committed to realising the potential of employee ownership" - }, - "8": { - "Display": "Our executive leaders have engaged our people in a vision and strategy that explicitly activates our EO model to help realise the true potential of the business" - }, - "9": { - "Display": "Our executive leaders are role models for our desired culture" - } - }, - "ChoiceOrder": [ - "7", - 2, - "8", - "9" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 19, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID36", - "QuestionText_Unsafe": "Great Leaders" - }, - { - "QuestionText": "Great Governance", - "DefaultChoices": false, - "DataExportTag": "Q18", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "ChoiceColumnWidthPixels": 353, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great Governance", - "Choices": { - "2": { - "Display": "Our governance bodies work collaboratively and effectively with one another to protect and promote business success supported by a thriving ownership culture" - }, - "7": { - "Display": "

Our governance bodies clearly understand their respective roles in ensuring our EO model drives positive long-term outcomes for the business and all its stakeholders

\n" - }, - "8": { - "Display": "Our governance bodies include independent members who bring relevant experience (including of EO)" - }, - "20": { - "Display": "Our Chairs of governance bodies are effective in leveraging the diverse skills, experiences, views and opinions of members" - }, - "21": { - "Display": "Our governance helps ensure that benefits of ownership are fairly distributed and support owner mindset and behaviours" - } - }, - "ChoiceOrder": [ - "7", - 2, - "8", - "20", - "21" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 22, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID37", - "QuestionText_Unsafe": "Great Governance" - }, - { - "QuestionText": "1. EO Roles
\nDefine the responsibilities of leaders, owners, and governance and their role in your EO success.
\n
\nHaving the long-term best interests of the business at heart and the collective desire to leave it in the best place for future generations is the key to stewardship and is a shared role and responsibility across employee owners.
\n
\nTo what extent do your employee owners and those in governance roles understand their responsibility?
\nHow effectively do your leaders engage people in the cultural framework, vision and strategy?
\nIs decision-making focused on the long-term best interests of the organisation and its stakeholders?
", - "DefaultChoices": false, - "DataExportTag": "Q13", - "QuestionType": "DB", - "Selector": "TB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "1. EO Roles Define the responsibilities of leaders, owners, and governance and their role in your...", - "ChoiceOrder": [], - "Validation": { - "Settings": { - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "QuestionID": "QID38", - "QuestionText_Unsafe": "1. EO Roles
\nDefine the responsibilities of leaders, owners, and governance and their role in your EO success.
\n
\nHaving the long-term best interests of the business at heart and the collective desire to leave it in the best place for future generations is the key to stewardship and is a shared role and responsibility across employee owners.
\n
\nTo what extent do your employee owners and those in governance roles understand their responsibility?
\nHow effectively do your leaders engage people in the cultural framework, vision and strategy?
\nIs decision-making focused on the long-term best interests of the organisation and its stakeholders?
" - }, - { - "QuestionText": "3. EO Actions
\nHarness the full potential of employee voice to inform your strategy, innovation, and sustainability. 
\n
\nLeveraging the full potential of empowered and engaged employees in your organisation’s response to its evolving capabilities and external challenges can create agility and a drive from within to do what is needed.
\n
\nTo what extent are your employee owners able to see, understand and act on business need and how well are your leaders harnessing this EO advantage?
\n
\n ", - "DefaultChoices": false, - "DataExportTag": "Q27", - "QuestionType": "DB", - "Selector": "TB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "3. EO Actions Harness the full potential of employee voice to inform your strategy, innovation, a...", - "ChoiceOrder": [], - "Validation": { - "Settings": { - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "QuestionID": "QID39", - "QuestionText_Unsafe": "3. EO Actions
\nHarness the full potential of employee voice to inform your strategy, innovation, and sustainability. 
\n
\nLeveraging the full potential of empowered and engaged employees in your organisation’s response to its evolving capabilities and external challenges can create agility and a drive from within to do what is needed.
\n
\nTo what extent are your employee owners able to see, understand and act on business need and how well are your leaders harnessing this EO advantage?
\n
\n " - }, - { - "QuestionText": "Great Strategy", - "DefaultChoices": false, - "DataExportTag": "Q28", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "ChoiceColumnWidthPixels": 353, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great Strategy", - "Choices": { - "2": { - "Display": "Our key markets provide sufficient scope for the ongoing success of the organisation and we are clear how EO will help us achieve that" - }, - "7": { - "Display": "Our vision clearly defines success for our employee owners alongside other key stakeholders" - }, - "8": { - "Display": "Our strategy builds upon our purpose, values and our unique strengths including our EO model" - }, - "9": { - "Display": "Our strategy clearly sets out the key initiatives that will ensure our employee owners can deliver success, mitigate weaknesses and optimise the use of our scarcest resources" - } - }, - "ChoiceOrder": [ - "7", - 2, - "8", - "9" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 19, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID40", - "QuestionText_Unsafe": "Great Strategy" - }, - { - "QuestionText": "Great Innovation", - "DefaultChoices": false, - "DataExportTag": "Q30", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "ChoiceColumnWidthPixels": 353, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great Innovation", - "Choices": { - "2": { - "Display": "Our employee owners contribute ideas and suggestions that both improve products/services for customers and reduce costs to drive efficiency" - }, - "7": { - "Display": "Our employee owners have a mindset that actively drives growth and continuous improvement of the organisation" - }, - "19": { - "Display": "We ensure our employee owners understand how their business works to help promote well-informed ideas and innovation" - }, - "20": { - "Display": "We provide clear channels and processes to ensure new ideas and suggestions are captured, considered and fed back on" - } - }, - "ChoiceOrder": [ - "7", - 2, - "19", - "20" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 21, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID41", - "QuestionText_Unsafe": "Great Innovation" - }, - { - "QuestionText": "Great Resilience", - "DefaultChoices": false, - "DataExportTag": "Q32", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "ChoiceColumnWidthPixels": 353, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great Resilience", - "Choices": { - "2": { - "Display": "Our emplyee owners actively manage risk and protect and enhance the organisation’s reputation and impact" - }, - "7": { - "Display": "During challenging times, we balance current and future interests of our employee owners and our organisation" - }, - "8": { - "Display": "As an employee-owned business, we ensure we embed learnings from challenging times to support future resilience" - }, - "9": { - "Display": "Our culture enables every leader, manager and specialist role to think of, discuss, and develop candidates for their own succession" - } - }, - "ChoiceOrder": [ - "7", - 2, - "8", - "9" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 19, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID42", - "QuestionText_Unsafe": "Great Resilience" - }, - { - "QuestionText": "4. EO Results
\nMeasuring and evolving the impact of your EO approach, roles, and actions.
\n
\nAdopting a structured and consistent way of measuring and evolving the impact of your approach, roles, and actions. An organisation is a product of its relationships, not the sum of its transactions. Resilient, successful organisations deliver balanced and enhanced results across all stakeholders.
\n
\nTo what extent are you delivering best in class performance across a balanced scorecard of results?", - "DefaultChoices": false, - "DataExportTag": "Q34", - "QuestionType": "DB", - "Selector": "TB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "4. EO Results Measuring and evolving the impact of your EO approach, roles, and actions. Adopting...", - "ChoiceOrder": [], - "Validation": { - "Settings": { - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "QuestionID": "QID43", - "QuestionText_Unsafe": "4. EO Results
\nMeasuring and evolving the impact of your EO approach, roles, and actions.
\n
\nAdopting a structured and consistent way of measuring and evolving the impact of your approach, roles, and actions. An organisation is a product of its relationships, not the sum of its transactions. Resilient, successful organisations deliver balanced and enhanced results across all stakeholders.
\n
\nTo what extent are you delivering best in class performance across a balanced scorecard of results?" - }, - { - "QuestionText": "Great EO measurement", - "DefaultChoices": false, - "DataExportTag": "Q35", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidth": 25, - "ChoiceColumnWidthPixels": 197, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great EO measurement", - "Choices": { - "2": { - "Display": "We are benchmarking our performance across a full range of stakeholders, including customers" - }, - "7": { - "Display": "We are benchmarking our performance across a full range of stakeholders, including employee owners" - }, - "8": { - "Display": "We are benchmarking our performance across a full range of stakeholders, including suppliers" - }, - "9": { - "Display": "We are benchmarking our performance across a full range of stakeholders, including the environment" - }, - "20": { - "Display": "We are benchmarking our performance across a full range of stakeholders, including our community" - }, - "21": { - "Display": "We are confident that we are capturing data that tells us how well EO is delivering benefits for the organisation and its employee owners" - } - }, - "ChoiceOrder": [ - "21", - "7", - 2, - "8", - "9", - "20" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 22, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID44", - "QuestionText_Unsafe": "Great EO measurement" - }, - { - "QuestionText": "Great EO evaluation", - "DefaultChoices": false, - "DataExportTag": "Q37", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidthPixels": 197, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great EO evaluation", - "Choices": { - "24": { - "Display": "We are using data-driven insights to enhance how we empower employee owners to contribute to and benefit from organisational success " - }, - "25": { - "Display": "We are using data-driven insights to enhance how our leaders ensure EO delivers strategic advantage to the organisation" - }, - "26": { - "Display": "We are using data-driven insights to enhance how our leaders promote innovation and resilience actions" - }, - "29": { - "Display": "We are using data-driven insights to enhance how our governance bodies play their roles effectively" - } - }, - "ChoiceOrder": [ - "24", - "25", - "26", - "29" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 30, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID45", - "QuestionText_Unsafe": "Great EO evaluation" - }, - { - "QuestionText": "Great EO impact", - "DefaultChoices": false, - "DataExportTag": "Q39", - "QuestionType": "Matrix", - "Selector": "Likert", - "SubSelector": "SingleAnswer", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "TextPosition": "inline", - "ChoiceColumnWidthPixels": 197, - "RepeatHeaders": "none", - "WhiteSpace": "OFF", - "MobileFirst": true - }, - "QuestionDescription": "Great EO impact", - "Choices": { - "27": { - "Display": "We can demonstrate that our EO model is contributing to enhanced productivity and performance" - }, - "28": { - "Display": "We can demonstrate that our EO model is contributing to greater profitability" - }, - "29": { - "Display": "We can demonstrate that our EO model is contributing to stronger ideas from colleagues" - }, - "30": { - "Display": "We can demonstrate that our EO model is contributing to recruiting and holding on to talent" - }, - "31": { - "Display": "We can demonstrate that our EO model is contributing to better health and well-being for our employee owners" - }, - "32": { - "Display": "We can demonstrate that our EO model is contributing to a more skilled workforce" - }, - "33": { - "Display": "We can demonstrate that our EO model is contributing to greater equality of opportunity at work" - }, - "34": { - "Display": "We can demonstrate that our EO model is contributing to greater local community benefits" - }, - "35": { - "Display": "We can demonstrate that our EO model is contributing to a more sustainable business and ecological environment" - } - }, - "ChoiceOrder": [ - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35" - ], - "Validation": { - "Settings": { - "ForceResponse": "ON", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "RecodeValues": { - "41": "-3", - "42": "-2", - "43": "-1", - "44": "0", - "45": "1", - "46": "2", - "47": "3" - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 36, - "NextAnswerId": 49, - "Answers": { - "41": { - "Display": "-3
\nStrongly disagree
" - }, - "42": { - "Display": "-2
\nDisagree

\n " - }, - "43": { - "Display": "-1
\nSomewhat disagree
" - }, - "44": { - "Display": "0
\nNeither agree nor disagree
" - }, - "45": { - "Display": "+1
\nSomewhat agree
" - }, - "46": { - "Display": "+2
\nAgree

\n " - }, - "47": { - "Display": "+3
\nStrongly
\nagree
" - } - }, - "AnswerOrder": [ - "41", - "42", - "43", - "44", - "45", - "46", - "47" - ], - "ChoiceDataExportTags": false, - "QuestionID": "QID46", - "QuestionText_Unsafe": "Great EO impact" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q22", - "QuestionID": "QID47", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q15", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID48", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q29", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID49", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q36", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID50", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Job title", - "DefaultChoices": false, - "DataExportTag": "Q5", - "QuestionType": "TE", - "Selector": "SL", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Job title", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID51", - "QuestionText_Unsafe": "Job title" - }, - { - "QuestionText": "Job function (tick all that apply)", - "DefaultChoices": false, - "DataExportTag": "Q6", - "QuestionID": "QID52", - "QuestionType": "MC", - "Selector": "MAHR", - "SubSelector": "TX", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText", - "LabelPosition": "BELOW" - }, - "QuestionDescription": "Job function (tick all that apply)", - "Choices": { - "1": { - "Display": "Director" - }, - "2": { - "Display": "Manager" - }, - "3": { - "Display": "Trustee" - }, - "4": { - "Display": "Employee Rep" - } - }, - "ChoiceOrder": [ - "1", - "2", - "3", - "4" - ], - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 5, - "NextAnswerId": 1, - "QuestionText_Unsafe": "Job function (tick all that apply)" - }, - { - "QuestionText": "Job title of the person you report to", - "DefaultChoices": false, - "DataExportTag": "Q7", - "QuestionType": "TE", - "Selector": "SL", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Job title of the person you report to", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID53", - "QuestionText_Unsafe": "Job title of the person you report to" - }, - { - "QuestionText": "Department (e.g. finance, operations, sales)", - "DefaultChoices": false, - "DataExportTag": "Q8", - "QuestionType": "TE", - "Selector": "SL", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Department (e.g. finance, operations, sales)", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID54", - "QuestionText_Unsafe": "Department (e.g. finance, operations, sales)" - }, - { - "QuestionText": "Years since joined the company", - "DefaultChoices": false, - "DataExportTag": "Q9", - "QuestionType": "TE", - "Selector": "SL", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Years since joined the company", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID55", - "QuestionText_Unsafe": "Years since joined the company" - }, - { - "QuestionText": "Location", - "DefaultChoices": false, - "DataExportTag": "Q10", - "QuestionType": "TE", - "Selector": "SL", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Location", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID56", - "QuestionText_Unsafe": "Location" - }, - { - "QuestionText": "Gender", - "DefaultChoices": false, - "DataExportTag": "Q11", - "QuestionType": "TE", - "Selector": "SL", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Gender", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID57", - "QuestionText_Unsafe": "Gender" - }, - { - "QuestionText": "Age", - "DefaultChoices": false, - "DataExportTag": "Q12", - "QuestionType": "TE", - "Selector": "SL", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Age", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "ForceResponseType": "ON", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 1, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID58", - "QuestionText_Unsafe": "Age" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q19", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID59", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q17", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID60", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q26", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID61", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q24", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID62", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q33", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID63", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q31", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID64", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q40", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID65", - "QuestionText_Unsafe": "Please add any additional comments:" - }, - { - "QuestionText": "Please add any additional comments:", - "DefaultChoices": false, - "DataExportTag": "Q38", - "QuestionType": "TE", - "Selector": "ESTB", - "DataVisibility": { - "Private": false, - "Hidden": false - }, - "Configuration": { - "QuestionDescriptionOption": "UseText" - }, - "QuestionDescription": "Please add any additional comments:", - "Validation": { - "Settings": { - "ForceResponse": "OFF", - "Type": "None" - } - }, - "GradingData": [], - "Language": [], - "NextChoiceId": 4, - "NextAnswerId": 1, - "SearchSource": { - "AllowFreeResponse": "false" - }, - "QuestionID": "QID66", - "QuestionText_Unsafe": "Please add any additional comments:" - } - ] - } -} diff --git a/eoq_code/config.php b/eoq_code/config.php deleted file mode 100644 index f43cdcf5f6bf847ba11c795c83bf4f54add24d92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153600 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ⓈRckWp+{YmnLd&0~+a6HjYJ9bJM$itb$-xDehHA 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 diff --git a/eoq_code/db.php b/eoq_code/db.php deleted file mode 100644 index 49b83c3..0000000 --- a/eoq_code/db.php +++ /dev/null @@ -1,139 +0,0 @@ - PDO::ERRMODE_EXCEPTION, // throw exceptions on error - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // fetch results as associative arrays - PDO::ATTR_EMULATE_PREPARES => false, // use native prepared statements -]; - -try { - $pdo = new PDO($dsn, $user, $pass, $options); -} catch (\PDOException $e) { - die("Database connection failed: " . $e->getMessage()); -} - - -// ...and now the functions - -function getOrCreateSurvey($surveyId, $description = '') { - global $pdo; - - // Step 1: Check if survey exists - $check = $pdo->prepare("SELECT id FROM Surveys WHERE surveyId = :surveyId"); - $check->execute(['surveyId' => $surveyId]); - $existing = $check->fetch(); - - if ($existing) { - return $existing['id']; - } - - // Step 2: Insert if not found - $insert = $pdo->prepare(" - INSERT INTO Surveys (surveyId, description) - VALUES (:surveyId, :description) - "); - $insert->execute([ - 'surveyId' => $surveyId, - 'description' => $description - ]); - - - // Step 3: Get the id - $check = $pdo->prepare("SELECT id FROM Surveys WHERE surveyId = :surveyId"); - $check->execute(['surveyId' => $surveyId]); - $existing = $check->fetch(); - return $existing['id']; -} - -function upsertResponse($response) { - global $pdo; - - $sql = " - INSERT INTO Responses ( - responseId, surveyId, startDate, endDate, status, ipAddress, - progress, duration, finished, recordedDate, locationLatitude, - locationLongitude, distributionChannel, userLanguage - ) VALUES ( - :responseId, :surveyId, :startDate, :endDate, :status, :ipAddress, - :progress, :duration, :finished, :recordedDate, :locationLatitude, - :locationLongitude, :distributionChannel, :userLanguage - ) - ON DUPLICATE KEY UPDATE - surveyId = VALUES(surveyId), - startDate = VALUES(startDate), - endDate = VALUES(endDate), - status = VALUES(status), - ipAddress = VALUES(ipAddress), - progress = VALUES(progress), - duration = VALUES(duration), - finished = VALUES(finished), - recordedDate = VALUES(recordedDate), - locationLatitude = VALUES(locationLatitude), - locationLongitude = VALUES(locationLongitude), - distributionChannel = VALUES(distributionChannel), - userLanguage = VALUES(userLanguage) - "; - - $stmt = $pdo->prepare($sql); - $stmt->execute($response); - - $selectStmt = $pdo->prepare("SELECT id FROM Responses WHERE responseId = :responseId"); - $selectStmt->execute(['responseId' => $response['responseId']]); - $existing = $selectStmt->fetch(PDO::FETCH_ASSOC); - if ($existing) { - return $existing['id']; - } else { - return null; // not found, something unexpected happened - } -} - - -function insertAnswers($pdo, $surveyId, $responseId, $answers) { - -$stmt = $pdo->prepare(" - INSERT INTO Answers (surveyId, responseId, QID, text, value) - VALUES (:surveyId, :responseId, :QID, :text, :value) - ON DUPLICATE KEY UPDATE - text = VALUES(text), - value = VALUES(value) -"); - - foreach ($answers as $key => $val) { - if (strpos($key, 'QID') === 0) { - $qid = $key; - $text = null; - $value = null; - - // Handle numeric between -3 and +3 - if (is_numeric($val) && $val >= -3 && $val <= 3) { - $value = (int) $val; - } else { - $text = substr($val, 0, 255); // enforce VARCHAR(255) limit - } - - $stmt->execute([ - 'surveyId' => $surveyId, - 'responseId' => $responseId, - 'QID' => $qid, - 'text' => $text, - 'value' => $value - ]); - } - } -} - - - -?> diff --git a/eoq_code/debug.html b/eoq_code/debug.html deleted file mode 100644 index b5551d1..0000000 --- a/eoq_code/debug.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - Spider Graph - - - - - - - - - - diff --git a/eoq_code/draw3axis.js b/eoq_code/draw3axis.js deleted file mode 100644 index b49a9ce..0000000 --- a/eoq_code/draw3axis.js +++ /dev/null @@ -1,111 +0,0 @@ - -function drawGraph() { - let ValA = 0.8; - let ValB = 0.4; - let ValC = 0.6; - createSVGgraphic("#Q1","FeatureA", "FeatureB", "FeatureC", ValA, ValB, ValC); - createSVGgraphic("#Q2","ConceptA", "ConceptB", "ConceptC", 0.2, 0.8, 0.8); - -} - - -function createSVGgraphic(divID,FA,FB,FC,VA,VB,VC) { - -const svg = d3.select(divID); -const width = +svg.attr("width"); -const height = +svg.attr("height"); -const radius = 150; -const center = { x: width / 2, y: height / 2 }; - -// Define axes with A at the top (rotate -90 degrees) -const axes = [ - { name: FA, angle: 0 }, - { name: FB, angle: 120 }, - { name: FC, angle: 240 } -]; -axes.forEach(d => d.angle = (d.angle - 90) * Math.PI / 180); - -// Sample data: [0-1] scale -const values = [VA, VB, VC]; - -// Draw axis lines -svg.append("g") - .attr("class", "axis") - .selectAll("line") - .data(axes) - .join("line") - .attr("x1", center.x) - .attr("y1", center.y) - .attr("x2", d => center.x + radius * Math.cos(d.angle)) - .attr("y2", d => center.y + radius * Math.sin(d.angle)); - -// Draw grid rings (polygons) -const levels = 5; -for (let i = 1; i <= levels; i++) { - const r = (radius / levels) * i; - const points = axes.map(d => { - return [ - center.x + r * Math.cos(d.angle), - center.y + r * Math.sin(d.angle) - ]; - }); - svg.append("polygon") - .attr("class", "grid") - .attr("points", points.map(p => p.join(",")).join(" ")); -} - -// Draw axis ticks -const tickLength = 5; -axes.forEach(axis => { - for (let i = 1; i <= levels; i++) { - const r = (radius / levels) * i; - const angle = axis.angle; - - const x1 = center.x + r * Math.cos(angle); - const y1 = center.y + r * Math.sin(angle); - - // Perpendicular tick - const perpAngle = angle + Math.PI / 2; - const x2 = x1 + tickLength * Math.cos(perpAngle); - const y2 = y1 + tickLength * Math.sin(perpAngle); - - svg.append("line") - .attr("x1", x1) - .attr("y1", y1) - .attr("x2", x2) - .attr("y2", y2) - .attr("class", "tick"); - } -}); - -// Convert values to coordinates -const valuePoints = axes.map((d, i) => { - const r = radius * values[i]; - return [ - center.x + r * Math.cos(d.angle), - center.y + r * Math.sin(d.angle) - ]; -}); - -// Draw data area -svg.append("polygon") - .attr("class", "area") - .attr("points", valuePoints.map(p => p.join(",")).join(" ")) - -// Add axis labels -svg.selectAll(".label") - .data(axes) - .join("text") - .attr("class", "label") - .attr("x", d => center.x + (radius + 20) * Math.cos(d.angle)) - .attr("y", (d,i) => { - if (i === 0) { //adjust for 1st access, rather than using d.name - return center.y + (radius + 20) * Math.sin(d.angle) - } else - return center.y + (radius + 20 + 30) * Math.sin(d.angle) - }) - .text(d => d.name); - - -} - diff --git a/eoq_code/drawbar.js b/eoq_code/drawbar.js deleted file mode 100644 index eff9198..0000000 --- a/eoq_code/drawbar.js +++ /dev/null @@ -1,285 +0,0 @@ - - - -function drawBar(id,data) { -//console.log(id); -const svg = d3.select(`${id}`); -const backgroundwidth = +svg.attr("width"); -const backgroundradius = 10; -const width = 600; //+svg.attr("width"); -const height = 200; //+svg.attr("height"); -const margin = { top: 40, right: 30, bottom: 60, left: 30 }; - -// Draw the white background -// Draw the rounded rectangle -svg.append("rect") - .attr("x", 0) - .attr("y", 0) - .attr("width", backgroundwidth) - .attr("height", height) - .attr("rx", backgroundradius) - .attr("ry", backgroundradius) - .attr("fill", "white"); - // .attr("stroke", "white") - // .attr("stroke-width", 2); - - -//const data = { -/* -data = { - "-3": 0, - "-2": 1, - "-1": 3, - "0": 0, - "1": 2, - "2": 0, - "3": 10 -}; -*/ -//console.log(data); - - -const dataArray = Object.entries(data).map(([key, count]) => ({ - key: +key, - count: count -})); - -const x = d3.scaleBand() - .domain([-3,-2,-1,0,1,2,3]) - .range([margin.left, width - margin.right]) - .padding(0); - -const y = d3.scaleLinear() - .domain([0, d3.max(dataArray, d => d.count)]) - .nice() - .range([height - margin.bottom, margin.top]); - -// X Axis -svg.append("g") - .attr("transform", `translate(0,${height - margin.bottom})`) - .call(d3.axisBottom(x) - .tickSize(0)) - .selectAll("text") - .attr("x", 0) - .attr("y", 10) - .style("text-anchor", "middle") - .style("font-size", "12px"); - - -// Add the required ticks -const xTicks = d3.scaleLinear() - .domain([-3.5, 3.5]) - .range([margin.left, width - margin.right]); - -svg.append("g") - .attr("transform", `translate(0,${height - margin.bottom})`) - .call(d3.axisBottom(xTicks).tickValues(d3.range(-3.5, 4, 1))) - .selectAll("text") - .style("visibility", "hidden"); // This hides the labels - -// Y Axis -//svg.append("g") -// .attr("transform", `translate(${margin.left},0)`) -// .call(d3.axisLeft(y).ticks(5)); - -// Bars -svg.selectAll(".bar") - .data(dataArray) - .enter() - .append("rect") - .attr("class", "bar") - .attr("x", d => x(d.key)) - .attr("y", d => y(d.count)) - .attr("width", x.bandwidth()) - .attr("height", d => y(0) - y(d.count)) - .attr("fill", "#003c4b"); // From brand guidelines - -// Labels -svg.selectAll(".label") - .data(dataArray) - .enter() - .append("text") - .attr("x", d => x(d.key) + x.bandwidth() / 2) - .attr("y", d => d.count > 0 ? y(d.count) - 5 : y(0)) - .attr("text-anchor", "middle") - .attr("font-size", "12px") - .attr("font-style", "italic") - .attr("fill", "black") - .text(d => d.count > 0 ? d.count : ""); - -// Average line -const format = d3.format(".2f"); -const totalCount = d3.sum(dataArray, d => d.count); -const weightedSum = d3.sum(dataArray, d => d.key * d.count); -average = totalCount > 0 ? weightedSum / totalCount : 0; - -const xLinear = d3.scaleLinear() - .domain([-3, 3]) - .range([margin.left + x.bandwidth() / 2, width - margin.right - x.bandwidth() / 2]); - -const avgX = xLinear(average); -//const avgX = xLinear(-0.50); // Temporary for testing - -svg.append("line") - .attr("x1", avgX) - .attr("x2", avgX) - .attr("y1", y(0)+20) - .attr("y2", y(d3.max(dataArray, d => d.count)) - 20) - .attr("stroke", "#e40074") // From brand guidelines - .attr("stroke-width", 4) - .attr("stroke-dasharray", "6,2"); - -/* -svg.append("text") - .attr("x", avgX) - .attr("y", y(d3.max(dataArray, d => d.count)) - 30) - .attr("text-anchor", "middle") - .attr("fill", "#e40074") - .attr("font-size", "12px") - .text("Average ("+average+")"); -*/ - -// Title beneath the graph -/* -svg.append("text") - .attr("x", width / 2) - .attr("y", height - 10) // Just below the x-axis - .attr("text-anchor", "middle") - .attr("font-size", "14px") - .attr("fill", "black") - .text("Demo bar graph"); -*/ - - -// Add info to right of bar chart -// Oblong settings -const boxx = 610; -const boxy = 60; -const boxwidth = 170; -const boxheight = 80; -const cornerRadius = 10; - -// Draw the rounded rectangle -svg.append("rect") - .attr("x", boxx) - .attr("y", boxy) - .attr("width", boxwidth) - .attr("height", boxheight) - .attr("rx", cornerRadius) - .attr("ry", cornerRadius) - .attr("fill", "white") - .attr("stroke", "#333") - .attr("stroke-width", 2); - -// Draw the horizontal divider -svg.append("line") - .attr("x1", boxx) - .attr("x2", boxx + boxwidth) - .attr("y1", boxy + boxheight / 2) - .attr("y2", boxy + boxheight / 2) - .attr("stroke", "#333") - .attr("stroke-width", 1); - -// Add text to the top half -svg.append("text") - .attr("x", boxx + boxwidth / 2) - .attr("y", boxy + boxheight / 4) - .attr("text-anchor", "middle") - .attr("dominant-baseline", "middle") - .attr("font-size", "20px") - .attr("font-weight", "400") // 400 is normal, 700 is bold, 900 is extra-bold - .attr("font-family", "sans-serif") - .text("Average: ") - .append(function() { - return document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - }) - .text(average.toFixed(1)) - .attr("class", "average") - .attr("font-weight", "900"); - - -// .text("Average : "+average.toFixed(2)); - -// Get the score gap: - -let maxKey = null; -let minKey = null; - -for (const [key, value] of Object.entries(data)) { - if (value > 0) { - const numKey = Number(key); - //console.log(numkey); - if (maxKey === null || numKey > maxKey) { - maxKey = numKey; - } - if (minKey === null || numKey < minKey) { - minKey = numKey; - } - } -} - - -scoregap = maxKey - minKey+1; - -// Add text to the bottom half -svg.append("text") - .attr("x", boxx + boxwidth / 2) - .attr("y", boxy + 3 * boxheight / 4) - .attr("text-anchor", "middle") - .attr("dominant-baseline", "middle") - .attr("font-size", "20px") - .attr("font-weight", "400") // 400 is normal, 700 is bold, 900 is extra-bold - .attr("font-family", "sans-serif") - .text("Score gap: ") - .append(function() { - return document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - }) - .text(scoregap) - .attr("font-weight", "900"); - - - - -// .text("Score Gap : "+scoregap); - - -return average; //Needed for the next layer up in the analysis - -} - - - -function doBarData(id,qid) { - return fetch('get_qid_counts.php', { - method: 'POST', - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - body: new URLSearchParams({ qid }) - }) - .then(response => { - if (!response.ok) { - throw new Error('Network response was not OK'); - } - return response.json(); - }) - .then(data => { - if (data.error) { - throw new Error(data.error); - } -// console.log(data); -// console.log(data[0][Object.keys(data[0])[0]]); -/* */ - bardata = { - "-3": data[0][Object.keys(data[0])[0]], - "-2": data[1][Object.keys(data[1])[0]], - "-1": data[2][Object.keys(data[2])[0]], - "0": data[3][Object.keys(data[3])[0]], - "1": data[4][Object.keys(data[4])[0]], - "2": data[5][Object.keys(data[5])[0]], - "3": data[6][Object.keys(data[6])[0]], - }; - - //console.log(bardata); - drawBar(id,bardata); - // return data; // Should be an array like [{ value: -3, count: 2 }, ..., { value: 3, count: 5 }] - }); -} diff --git a/eoq_code/drawtriangle.js b/eoq_code/drawtriangle.js deleted file mode 100644 index 4b91246..0000000 --- a/eoq_code/drawtriangle.js +++ /dev/null @@ -1,178 +0,0 @@ - -function drawtriangle(id,text,colour,values,rag,offset,mean) -{ - -const svg = d3.select(`${id}`); -const width = 500; // Fixed size. Was +svg.attr("width"); -const height = 500; // Fixed size. Was +svg.attr("height"); -const radius = 200; -const center = { x: (width / 2) + offset.x, y: (height / 2) + offset.y}; - -let textcolour = colour; -let polycolour = colour; -let opacity = 0.3; - -if (rag !== "") -{ - polycolour = rag; - textcolour = "black"; - console.log("rag: "+rag); - opacity = 0.6; -} - - -// Define axes with A at the top (rotate -90 degrees) -const axes = [ - { name: "Feature A", angle: 0 }, - { name: "Feature B", angle: 120 }, - { name: "Feature C", angle: 240 } -]; -axes.forEach(d => d.angle = (d.angle - 90) * Math.PI / 180); - -// Sample data: [0-1] scale -// const values = [0.8, 0.1, 0.76]; Now passed in function args - -// Don't draw if class "no-axis" -if (!svg.classed("no-axis")) { -// Draw axis lines -svg.append("g") - .attr("class", "axis") - .selectAll("line") - .data(axes) - .join("line") - .attr("x1", center.x) - .attr("y1", center.y) - .attr("x2", d => center.x + radius * Math.cos(d.angle)) - .attr("y2", d => center.y + radius * Math.sin(d.angle)); - -} - - -// Draw grid rings (polygons) -const levels = 7; -for (let i = 1; i <= levels; i++) { - const r = (radius / levels) * i; - const points = axes.map(d => { - return [ - center.x + r * Math.cos(d.angle), - center.y + r * Math.sin(d.angle) - ]; - }); - svg.append("polygon") - .attr("class", "grid") - .attr("points", points.map(p => p.join(",")).join(" ")); -} - - -// Draw axis ticks -let tickLength = 5; -if (svg.classed("no-axis")) { - tickLength = 0; -} -axes.forEach(axis => { - for (let i = 1; i <= levels -1 ; i++) { // -1 to remove tick outside outline - const r = (radius / levels) * i; - const angle = axis.angle; - - const x1 = center.x + r * Math.cos(angle); - const y1 = center.y + r * Math.sin(angle); - - // Perpendicular tick - const perpAngle = angle + Math.PI / 2; - const x2 = x1 + tickLength * Math.cos(perpAngle); - const y2 = y1 + tickLength * Math.sin(perpAngle); - - svg.append("line") - .attr("x1", x1) - .attr("y1", y1) - .attr("x2", x2) - .attr("y2", y2) - .attr("class", "tick"); - } -}); - -// Convert values to coordinates -const valuePoints = axes.map((d, i) => { - const r = radius * values[i]; - return [ - center.x + r * Math.cos(d.angle), - center.y + r * Math.sin(d.angle) - ]; -}); - -// Draw data area -svg.append("polygon") - .attr("class", "area") - .attr("points", valuePoints.map(p => p.join(",")).join(" ")) - .attr("fill", polycolour) // #d76a23 with 30% opacity (translucent) - .attr("fill-opacity", opacity) - .attr("stroke", polycolour) // Outer line color - .attr("stroke-width", 1); // Thin outer line - -// Draw outer triangle border (goes to edge of chart) -const outerPoints = axes.map(d => [ - center.x + radius * Math.cos(d.angle), - center.y + radius * Math.sin(d.angle) -]); - -// Draw border separately (on top) -svg.append("polygon") - .attr("points", outerPoints.map(p => p.join(",")).join(" ")) - .attr("fill","none") - .attr("stroke", colour) // Outer line color - .attr("stroke-width", 5); // Thicker outer line - -// Put label in bottom centre of triangle -const bottomLeft = outerPoints[1]; -const bottomRight = outerPoints[2]; - -const midX = (bottomLeft[0] + bottomRight[0]) / 2; -const midY = (bottomLeft[1] + bottomRight[1]) / 2; - -//Don't draw the label for 'no-text' class -if (!svg.classed("no-text")){ -svg.append("text") - .attr("x", midX) - .attr("y", midY - 10) // Alter for correct height - .attr("text-anchor", "middle") - .attr("fill", textcolour) /// My Colour - .attr("font-size", "22px") - .attr("font-weight", "bold") - .text(`${text}`); -} - -// And now a central number -let bigy = midY-45; -let bigfont = "36px"; -if (svg.classed("big-number")){ - bigy = midY-85; - bigfont = "70px"; -} -svg.append("text") - .attr("x", midX) - .attr("y", bigy) - .attr("text-anchor", "middle") - .attr("fill", "black") // 🎨 customize color - .attr("font-size", bigfont) - .attr("font-weight", "bold") - .attr("font-family", "Courier New, monospace") - .text(`${mean}`); - -// Add axis labels -/* - svg.selectAll(".label") - .data(axes) - .join("text") - .attr("class", "label") - .attr("x", d => center.x + (radius + 20) * Math.cos(d.angle)) - .attr("y", (d,i) => { - if (i === 0) { //adjust for 1st access, rather than using d.name - return center.y + (radius + 20) * Math.sin(d.angle) - } else - return center.y + (radius + 20 + 30) * Math.sin(d.angle) - }) - .text(d => d.name); -*/ - - -} diff --git a/eoq_code/drawtriangleinverted.js b/eoq_code/drawtriangleinverted.js deleted file mode 100644 index 99c9887..0000000 --- a/eoq_code/drawtriangleinverted.js +++ /dev/null @@ -1,161 +0,0 @@ - -function drawtriangleinverted(id,text,colour,values,rag,offset,mean) -{ - -const svg = d3.select(`${id}`); -const width = 500; // Fixed size. Was +svg.attr("width"); -const height = 500; // Fixed size. Was +svg.attr("height"); -const radius = 200; -const center = { x: (width / 2) + offset.x, y: (height / 2) + offset.y}; - -let textcolour = colour; -let polycolour = colour; -let opacity = 0.3; - -if (rag !== "") -{ - polycolour = rag; - textcolour = "black"; - console.log("rag: "+rag); - opacity = 0.6; -} - -// Update angles for flat top triangle -const axes = [ - { name: "Feature A", angle: 60 }, // Left axis - { name: "Feature B", angle: 180 }, // Top axis (flat) - { name: "Feature C", angle: 300 } // Right axis -]; - -// Convert angles to radians (subtract 90 degrees to rotate the whole chart) -axes.forEach(d => d.angle = (d.angle - 90) * Math.PI / 180); - -// Sample data: [0-1] scale -// const values = [0.8, 0.1, 0.76]; Now passed in function args -// Don't draw if class "no-axis" -if (!svg.classed("no-axis")) { -// Draw axis lines -svg.append("g") - .attr("class", "axis") - .selectAll("line") - .data(axes) - .join("line") - .attr("x1", center.x) - .attr("y1", center.y) - .attr("x2", d => center.x + radius * Math.cos(d.angle)) - .attr("y2", d => center.y + radius * Math.sin(d.angle)); -} - - - -// Draw grid rings (polygons) -const levels = 7; -for (let i = 1; i <= levels; i++) { - const r = (radius / levels) * i; - const points = axes.map(d => { - return [ - center.x + r * Math.cos(d.angle), - center.y + r * Math.sin(d.angle) - ]; - }); - svg.append("polygon") - .attr("class", "grid") - .attr("points", points.map(p => p.join(",")).join(" ")); -} - - -// Draw axis ticks -let tickLength = 5; -if (svg.classed("no-axis")) { - tickLength = 0; -} -axes.forEach(axis => { - for (let i = 1; i <= levels - 1; i++) { // -1 so that tick doesn't stick out - const r = (radius / levels) * i; - const angle = axis.angle; - - const x1 = center.x + r * Math.cos(angle); - const y1 = center.y + r * Math.sin(angle); - - // Perpendicular tick - const perpAngle = angle + Math.PI / 2; - const x2 = x1 + tickLength * Math.cos(perpAngle); - const y2 = y1 + tickLength * Math.sin(perpAngle); - - svg.append("line") - .attr("x1", x1) - .attr("y1", y1) - .attr("x2", x2) - .attr("y2", y2) - .attr("class", "tick"); - } -}); - -// Convert values to coordinates -const valuePoints = axes.map((d, i) => { - const r = radius * values[i]; - return [ - center.x + r * Math.cos(d.angle), - center.y + r * Math.sin(d.angle) - ]; -}); - -// Draw data area -svg.append("polygon") - .attr("class", "area") - .attr("points", valuePoints.map(p => p.join(",")).join(" ")) - .attr("fill", polycolour) // #9f84b8 - .attr("fill-opacity", opacity) // with 30% opacity (translucent) - .attr("stroke", polycolour) // Outer line color - .attr("stroke-width", 1); // Thin outer line - -// Draw outer triangle border (goes to edge of chart) -const outerPoints = axes.map(d => [ - center.x + radius * Math.cos(d.angle), - center.y + radius * Math.sin(d.angle) -]); - -// Draw border separately (on top) -svg.append("polygon") - .attr("points", outerPoints.map(p => p.join(",")).join(" ")) - .attr("fill","none") - .attr("stroke", colour) // Outer line color - .attr("stroke-width", 5); // Thicker outer line - -// Put label in bottom centre of triangle (adjust for flat top) -const bottomLeft = outerPoints[0]; -const bottomRight = outerPoints[2]; - -const midX = (bottomLeft[0] + bottomRight[0]) / 2; -const midY = (bottomLeft[1] + bottomRight[1]) / 2; - -//Don't draw the label for 'no-text' class -if (!svg.classed("no-text")){ -svg.append("text") - .attr("x", midX) - .attr("y", midY + 25) // Adjust for correct height (moved to bottom) - .attr("text-anchor", "middle") - .attr("fill", textcolour) // My Colour - .attr("font-size", "22px") - .attr("font-weight", "bold") - .text(`${text}`); -} - -// And now a central number -let bigy = midY + 70; -let bigfont = "36px"; -if (svg.classed("big-number")){ - bigy = midY + 120; - bigfont = "70px"; -} -svg.append("text") - .attr("x", midX) - .attr("y", bigy) - .attr("text-anchor", "middle") - .attr("fill", "black") // 🎨 customize color - .attr("font-size", bigfont) - .attr("font-weight", "bold") - .attr("font-family", "Courier New, monospace") - .text(`${mean}`); - -} diff --git a/eoq_code/getData.php b/eoq_code/getData.php deleted file mode 100644 index e0545e9..0000000 --- a/eoq_code/getData.php +++ /dev/null @@ -1,152 +0,0 @@ - "json", - "compress" => false -]); - -$ch = curl_init(); -curl_setopt($ch, CURLOPT_URL, $exportUrl); -curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); -curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); -curl_setopt($ch, CURLOPT_POST, true); -curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); -$response = curl_exec($ch); - -if (curl_errno($ch)) { - echo "cURL Error: " . curl_error($ch); - curl_close($ch); - exit; -} - -curl_close($ch); - -$result = json_decode($response, true); -echo "
".$surveyId."     ".$exportUrl."
"; -if (!isset($result['result']['progressId'])) { - - echo "
Export API Response:\n";
-    print_r($response);
-    echo "
"; - die("Failed to start export.\n$response"); -} -$progressId = $result['result']['progressId']; - -echo "Polling for completion"; - - - -// Step 2: Poll for completion -$progressUrl = "$exportUrl/$progressId"; -do { - sleep(2); // avoid hammering the API - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $progressUrl); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - $response = curl_exec($ch); - curl_close($ch); - - $result = json_decode($response, true); - $status = $result['result']['status'] ?? 'failed'; -} while ($status !== 'complete' && $status !== 'failed'); - -if ($status !== 'complete') { - die("Export failed or timed out.\n$response"); -} - -$fileId = $result['result']['fileId']; - -// Step 4: Download the file (uncompressed JSON) -$downloadUrl = "$exportUrl/$fileId/file"; -$ch = curl_init(); -curl_setopt($ch, CURLOPT_URL, $downloadUrl); -curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); -curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); -$response = curl_exec($ch); - -if (curl_errno($ch)) { - die("Error downloading the file: " . curl_error($ch)); -} - -curl_close($ch); - -// Decode the response -$data = json_decode($response, true); - -//Save surveyId -//insertSurveyIfNotExists($identifier, $description); // The identifier is actually the surveyId, and the description isn't included at this point. -$surveyIndex = getOrCreateSurvey($surveyId, ""); - -echo "-------".$surveyIndex."-----------"; - -// $data = $result['result'][''] ?? []; -echo "Total responses: " . count($data['responses']) . "\n\n
"; - -if (isset($data['responses']) && is_array($data['responses'])) { - foreach ($data['responses'] as $response) { - echo "Response ID: " . $response['responseId'] . "\n"; - //Insert responseId into the database - // - $startDate = new DateTime($response['values']['startDate']); - $startDateFormatted = $startDate->format('Y-m-d H:i:s'); - $endDate = new DateTime($response['values']['endDate']); - $endDateFormatted = $endDate->format('Y-m-d H:i:s'); - $recordedDate = new DateTime($response['values']['recordedDate']); - $recordedDateFormatted = $recordedDate->format('Y-m-d H:i:s'); - - $responseData = [ - 'responseId' => $response['responseId'], - 'surveyId' => $surveyIndex, - 'startDate' => $startDateFormatted, - 'endDate' => $endDateFormatted, - 'status' => $response['values']['status'], - 'ipAddress' => $response['values']['ipAddress'], - 'progress' => $response['values']['progress'], - 'duration' => $response['values']['duration'], - 'finished' => $response['values']['finished'], - 'recordedDate' => $recordedDateFormatted, - 'locationLatitude' => $response['values']['locationLatitude'], - 'locationLongitude' => $response['values']['locationLongitude'], - 'distributionChannel' => $response['values']['distributionChannel'], - 'userLanguage' => $response['values']['userLanguage'] - ]; - - - $responseIndex = upsertResponse($responseData); - // Now read in the answers. These all start with QID????? etc - $answers = $response['values']; - - insertAnswers($pdo, $surveyIndex, $responseIndex, $answers); - - // Prepare and execute the INSERT statement - // - // - } -} else { - echo "No responses found."; -} - - - -?> - diff --git a/eoq_code/getQuestions.php b/eoq_code/getQuestions.php deleted file mode 100644 index 8990d6a..0000000 --- a/eoq_code/getQuestions.php +++ /dev/null @@ -1,66 +0,0 @@ -'; -print_r(array_slice($questions, 0, 1)); // Show one question object -echo ''; -?> - - - - Survey Questions - - -

Survey Questions

- -
    - $question): ?> -
  • - : - -
  • - -
- - diff --git a/eoq_code/getSurveys.php b/eoq_code/getSurveys.php deleted file mode 100644 index f73899b..0000000 --- a/eoq_code/getSurveys.php +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Select a Qualtrics Survey - - -

Select a Survey

- - -

No surveys found or an error occurred.





- -
-
- -
- - -

- -
- - - - - diff --git a/eoq_code/get_qid_counts.html b/eoq_code/get_qid_counts.html deleted file mode 100644 index f878ad1..0000000 --- a/eoq_code/get_qid_counts.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - -QID Value Counts - - - - -

Query Value Counts by QID

- -
-
- - -
- -
- - - - - - diff --git a/eoq_code/get_qid_counts.php b/eoq_code/get_qid_counts.php deleted file mode 100644 index 09b00df..0000000 --- a/eoq_code/get_qid_counts.php +++ /dev/null @@ -1,67 +0,0 @@ - 'Missing QID parameter']); - exit; -} -$qid = $_POST['qid']; - -// Database connection (adjust credentials accordingly) -// -$config = require 'config.php'; -$host = $config['db_host']; -$db = $config['db_name']; -$user = $config['db_user']; -$pass = $config['db_pass']; -$charset = 'utf8mb4'; - -$dsn = "mysql:host=$host;dbname=$db;charset=$charset"; -$options = [ - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, - PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, -]; - -try { - $pdo = new PDO($dsn, $user, $pass, $options); - - $sql = " - SELECT value, COUNT(*) AS count - FROM Answers - WHERE QID = :qid - AND value BETWEEN -3 AND 3 - GROUP BY value - ORDER BY value - "; - - $stmt = $pdo->prepare($sql); - $stmt->execute(['qid' => $qid]); - $results = $stmt->fetchAll(); - - // Initialize array with all possible values from -3 to 3 with zero counts - $counts = []; - for ($i = -3; $i <= 3; $i++) { - $counts[$i] = 0; - } - - // Fill in counts from query results - foreach ($results as $row) { - $counts[(int)$row['value']] = (int)$row['count']; - } - - // Return as JSON array of objects [{value: -3, count: 5}, ...] - $response = []; - foreach ($counts as $value => $count) { - //$response[] = ['value' => $value, 'count' => $count]; - $response[] = ['"'.strval($value).'"' => $count]; - } - - echo json_encode($response); - -} catch (PDOException $e) { - echo json_encode(['error' => 'Database error: ' . $e->getMessage()]); - exit; -} - - diff --git a/eoq_code/populateGraphics.js b/eoq_code/populateGraphics.js deleted file mode 100644 index 42d1b16..0000000 --- a/eoq_code/populateGraphics.js +++ /dev/null @@ -1,337 +0,0 @@ -function RAGGED(average){ -// This returns the correct colour red, amber or gree depending on the value presented - if (average <= -1) { - return "red"; - } - if (average >= 1) { - return "green"; - } - return "#ffbf00"; -} - - - -function getAverage(prefix) { - console.log("Prefix:", prefix); - - const elements = Array.from(document.querySelectorAll(`svg[id^="${prefix}"] tspan.average`)); - - const numbers = elements.map(el => { - const text = el.textContent; - //console.log("Raw text content:", text); - const value = parseFloat(text); - //console.log("Parsed value:", value); - return value; - }).filter(n => !isNaN(n)); - - //console.log("Parsed numeric values:", numbers); - - if (numbers.length === 0) { - console.warn("No valid numbers found!"); - return NaN; - } - - const avg = numbers.reduce((sum, n) => sum + n, 0) / numbers.length; - //console.log("Average of averages:", avg); - return avg; -} - - -function loaded(){ - console.log("loaded"); - - let amber = '#ffbf00'; - //doBigWhiteTriangle('svg1'); - //drawtriangle('#svg1','Roles','#008845',[0.5,0.6,0.5],'red', { x: 0, y: 350 },-0.7); - //drawtriangle('#svg1','Actions','#b2c8c4',[0.1,0.6,0.5],'green',{ x: 370, y: 350 },2.3); - //drawtriangle('#svg1','Approach','#ed4c0c',[0.3,0.6,0.5],amber,{ x: 185, y: 30 },1.4); - //drawtriangleinverted('#svg1','Impact','#74469c',[0.7,0.6,0.8],'green',{ x: 185, y: 243},2.4); - //makeSvgRightClickable('svg1'); - - - - //doLittleWhiteTriangle('svg2'); - //drawtriangle('#svg2','Roles','#008845',[0.5,0.6,0.5],'', { x: 0, y: 100 },-0.7); - - //EO ROLES - //Great Employee Owners - let average = doBarData('#svg1_1','QID35_7'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg1_2','QID35_2'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg1_3','QID35_8'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg1_4','QID35_9'); - //makeSvgRightClickable('svg1_4'); - doBarData('#svg1_5','QID35_10'); - //makeSvgRightClickable('svg1_5'); - - - - //Great EO Leaders - average = doBarData('#svg2_1','QID36_7'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg2_2','QID36_2'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg2_3','QID36_8'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg2_4','QID36_9'); - //makeSvgRightClickable('svg1_4'); - - - //Great EO Governance - average = doBarData('#svg3_1','QID37_7'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg3_2','QID37_2'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg3_3','QID37_8'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg3_4','QID37_20'); - //makeSvgRightClickable('svg1_4'); - doBarData('#svg3_5','QID37_21'); - //makeSvgRightClickable('svg1_5'); - doBarData('#svg3_6','QID37_22'); - //makeSvgRightClickable('svg1_5'); - - - //EO APPROACH - //Great EO Culture - average = doBarData('#svg4_1','QID2_7'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg4_2','QID2_2'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg4_3','QID2_8'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg4_4','QID2_9'); - //makeSvgRightClickable('svg1_4'); - - - //Great EO Engagement - average = doBarData('#svg5_1','QID33_7'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg5_2','QID33_2'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg5_3','QID33_8'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg5_4','QID33_9'); - //makeSvgRightClickable('svg1_4'); - - - //Great EO Stewardship - average = doBarData('#svg6_1','QID34_7'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg6_2','QID34_2'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg6_3','QID34_8'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg6_4','QID34_17'); - //makeSvgRightClickable('svg1_4'); - - - //EO ACTIONS - //Great EO Strategy - average = doBarData('#svg7_1','QID40_7'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg7_2','QID40_2'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg7_3','QID40_8'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg7_4','QID40_9'); - //makeSvgRightClickable('svg1_4'); - - - //Great EO Innovation - average = doBarData('#svg8_1','QID41_7'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg8_2','QID41_2'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg8_3','QID41_19'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg8_4','QID41_20'); - //makeSvgRightClickable('svg1_4'); - doBarData('#svg8_5','QID41_21'); - //makeSvgRightClickable('svg1_5'); - - - //Great EO Advantage - average = doBarData('#svg9_1','QID42_7'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg9_2','QID42_2'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg9_3','QID42_8'); - //makeSvgRightClickable('svg1_3'); - - - //EO RESULTS - //Great EO Measurement - average = doBarData('#svg10_1','QID44_21'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg10_2','QID44_7'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg10_3','QID44_2'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg10_4','QID44_8'); - //makeSvgRightClickable('svg1_4'); - - - //Great EO Evaluation - average = doBarData('#svg11_1','QID45_24'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg11_2','QID45_25'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg11_3','QID45_26'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg11_4','QID45_29'); - //makeSvgRightClickable('svg1_4'); - - - //Great EO Impact - average = doBarData('#svg12_1','QID46_27'); - //makeSvgRightClickable('svg1_1'); - doBarData('#svg12_2','QID46_28'); - //makeSvgRightClickable('svg1_2'); - doBarData('#svg12_3','QID46_29'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg12_4','QID46_30'); - //makeSvgRightClickable('svg1_4'); - doBarData('#svg12_5','QID46_31'); - //makeSvgRightClickable('svg1_5'); - doBarData('#svg12_6','QID46_32'); - //makeSvgRightClickable('svg1_5'); - doBarData('#svg12_7','QID46_33'); - //makeSvgRightClickable('svg1_3'); - doBarData('#svg12_8','QID46_34'); - //makeSvgRightClickable('svg1_4'); - doBarData('#svg12_9','QID46_36'); - //makeSvgRightClickable('svg1_5'); - doBarData('#svg12_10','QID46_37'); - //makeSvgRightClickable('svg1_5'); - - - - - - // Make sure that evreything is loaded! - setTimeout(() => { - console.log("Waited 2 seconds"); - // We now have access to all of the averages, so can calculate the basic triangle. - - //EO ROLES - let svg1_avg = (getAverage("svg1_")+3)/7; - let svg2_avg = (getAverage("svg2_")+3)/7; - let svg3_avg = (getAverage("svg3_")+3)/7; - let roles_avg = (7*(svg1_avg+svg2_avg+svg3_avg)/3)-3; // this converts the scales lengths to the correct value - - console.log(svg1_avg,svg2_avg,svg3_avg, roles_avg); - - doLittleWhiteTriangle('svg_roles'); - //drawtriangle('#svg_roles','Roles','#008845',[0.25,0.5,0.75],'', { x: 0, y: 100 },roles_avg.toFixed(1)); - drawtriangle('#svg_roles','Roles','#008845',[svg1_avg,svg2_avg,svg3_avg],'', { x: 0, y: 100 },roles_avg.toFixed(1)); - //makeSvgRightClickable('svg_roles'); - - doLittleWhiteTriangle('svg_roles_RAG'); - drawtriangle('#svg_roles_RAG','Roles','#008845',[svg1_avg,svg2_avg,svg3_avg],RAGGED(roles_avg), { x: 0, y: 100 },roles_avg.toFixed(1)); - //makeSvgRightClickable('svg_roles_RAG'); - - doLittleWhiteTriangle('svg_roles_test'); - drawtriangle('#svg_roles_test','Roles','#008845',[0.95,0.95,0.95],RAGGED(roles_avg), { x: 0, y: 100 },roles_avg.toFixed(1)); - //makeSvgRightClickable('svg_roles_test'); - - - //EO APPROACH - let svg4_avg = (getAverage("svg4_")+3)/7; - let svg5_avg = (getAverage("svg5_")+3)/7; - let svg6_avg = (getAverage("svg6_")+3)/7; - let approach_avg = (7*(svg4_avg+svg5_avg+svg6_avg)/3)-3; // this converts the scales lengths to the correct value - - console.log(svg4_avg,svg5_avg,svg6_avg,approach_avg); - - doLittleWhiteTriangle('svg_approach'); - //drawtriangle('#svg_approach','Approach','#008845',[0.25,0.5,0.75],'', { x: 0, y: 100 },average_avg.toFixed(1)); - drawtriangle('#svg_approach','Approach','#ed4c0c',[svg4_avg,svg5_avg,svg6_avg],'', { x: 0, y: 100 },approach_avg.toFixed(1)); - //makeSvgRightClickable('svg_approach'); - - doLittleWhiteTriangle('svg_approach_RAG'); - drawtriangle('#svg_approach_RAG','Approach','#ed4c0c',[svg4_avg,svg5_avg,svg6_avg],RAGGED(approach_avg), { x: 0, y: 100 },approach_avg.toFixed(1)); - //makeSvgRightClickable('svg_approach_RAG'); - - //doLittleWhiteTriangle('svg_approach_test'); - //drawtriangle('#svg_approach_test','Approach','#ed4c0c',[0.95,0.95,0.95],RAGGED(approach_avg), { x: 0, y: 100 },approach_avg.toFixed(1)); - //makeSvgRightClickable('svg_approach_test'); - - - //EO ACTIONS - let svg7_avg = (getAverage("svg7_")+3)/7; - let svg8_avg = (getAverage("svg8_")+3)/7; - let svg9_avg = (getAverage("svg9_")+3)/7; - let actions_avg = (7*(svg7_avg+svg8_avg+svg9_avg)/3)-3; // this converts the scales lengths to the correct value - - console.log(svg7_avg,svg8_avg,svg9_avg,actions_avg); - - doLittleWhiteTriangle('svg_actions'); - //drawtriangle('#svg_actions','Actions','#b2c8c4',[0.25,0.5,0.75],'', { x: 0, y: 100 },actions_avg.toFixed(1)); - drawtriangle('#svg_actions','Actions','#b2c8c4',[svg7_avg,svg8_avg,svg9_avg],'', { x: 0, y: 100 },actions_avg.toFixed(1)); - //makeSvgRightClickable('svg_actions'); - - doLittleWhiteTriangle('svg_actions_RAG'); - drawtriangle('#svg_actions_RAG','Actions','#b2c8c4',[svg7_avg,svg8_avg,svg9_avg],RAGGED(actions_avg), { x: 0, y: 100 },actions_avg.toFixed(1)); - //makeSvgRightClickable('svg_actions_RAG'); - - //doLittleWhiteTriangle('svg_actions_test'); - //drawtriangle('#svg_actions_test','Actions','#b2c8c4',[0.95,0.95,0.95],RAGGED(actions_avg), { x: 0, y: 100 },actions_avg.toFixed(1)); - //makeSvgRightClickable('svg_actions_test'); - - - //EO IMPACT - let svg10_avg = (getAverage("svg10_")+3)/7; - let svg11_avg = (getAverage("svg11_")+3)/7; - let svg12_avg = (getAverage("svg12_")+3)/7; - let results_avg = (7*(svg10_avg+svg11_avg+svg12_avg)/3)-3; // this converts the scales lengths to the correct value - - console.log(svg10_avg,svg11_avg,svg12_avg,results_avg); - - doLittleWhiteTriangle('svg_results'); - //drawtriangle('#svg_results','Results','#74469',[0.25,0.5,0.75],'', { x: 0, y: 100 },impact_avg.toFixed(1)); - drawtriangleinverted('#svg_results','Results','#74469c',[svg10_avg,svg11_avg,svg12_avg],'', { x: 0, y: 0 },results_avg.toFixed(1)); - //makeSvgRightClickable('svg_results'); - - doLittleWhiteTriangle('svg_results_RAG'); - drawtriangleinverted('#svg_results_RAG','Results','#74469c',[svg10_avg,svg11_avg,svg12_avg],RAGGED(results_avg), { x: 0, y: 0 },results_avg.toFixed(1)); - //makeSvgRightClickable('svg_results_RAG'); - - doLittleWhiteTriangle('svg_results_test'); - drawtriangleinverted('#svg_results_test','Results','#74469c',[0.95,0.95,0.95],RAGGED(results_avg), { x: 0, y: 0 },results_avg.toFixed(1)); - //makeSvgRightClickable('svg_results_test'); - - - - doBigWhiteTriangle('svg_pyramid'); - drawtriangle('#svg_pyramid','Roles','#008845',[svg1_avg,svg2_avg,svg3_avg],'', { x: 0, y: 350 },roles_avg.toFixed(1)); - drawtriangle('#svg_pyramid','Actions','#b2c8c4',[svg4_avg,svg5_avg,svg6_avg],'',{ x: 370, y: 350 },actions_avg.toFixed(1)); - drawtriangle('#svg_pyramid','Approach','#ed4c0c',[svg7_avg,svg8_avg,svg9_avg],'',{ x: 185, y: 30 },approach_avg.toFixed(1)); - drawtriangleinverted('#svg_pyramid','Results','#74469c',[svg10_avg,svg11_avg,svg12_avg],'',{ x: 185, y: 243},results_avg.toFixed(1)); - makeSvgRightClickable('svg_pyramid'); - - - - doBigWhiteTriangle('svg_pyramid_RAG'); - drawtriangle('#svg_pyramid_RAG','Roles','#008845',[svg1_avg,svg2_avg,svg3_avg],RAGGED(roles_avg), { x: 0, y: 350 },roles_avg.toFixed(1)); - drawtriangle('#svg_pyramid_RAG','Actions','#b2c8c4',[svg4_avg,svg5_avg,svg6_avg],RAGGED(actions_avg),{ x: 370, y: 350 },actions_avg.toFixed(1)); - drawtriangle('#svg_pyramid_RAG','Approach','#ed4c0c',[svg7_avg,svg8_avg,svg9_avg],RAGGED(approach_avg),{ x: 185, y: 30 },approach_avg.toFixed(1)); - drawtriangleinverted('#svg_pyramid_RAG','Results','#74469c',[svg10_avg,svg11_avg,svg12_avg],RAGGED(results_avg),{ x: 185, y: 243},results_avg.toFixed(1)); - makeSvgRightClickable('svg_pyramid_RAG'); - - - doBigWhiteTriangle('svg_pyramid_RAG_test'); - drawtriangle('#svg_pyramid_RAG_test','Roles','#008845',[0.95,0.95,0.95],RAGGED(roles_avg), { x: 0, y: 350 },roles_avg.toFixed(1)); - drawtriangle('#svg_pyramid_RAG_test','Actions','#b2c8c4',[0.95,0.95,0.95],RAGGED(actions_avg),{ x: 370, y: 350 },actions_avg.toFixed(1)); - drawtriangle('#svg_pyramid_RAG_test','Approach','#ed4c0c',[0.95,0.95,0.95],RAGGED(approach_avg),{ x: 185, y: 30 },approach_avg.toFixed(1)); - drawtriangleinverted('#svg_pyramid_RAG_test','Results','#74469c',[0.95,0.95,0.95],RAGGED(results_avg),{ x: 185, y: 243},results_avg.toFixed(1)); - makeSvgRightClickable('svg_pyramid_RAG_test'); - - - }, 500); - - - -} diff --git a/eoq_code/reportTemplate.html b/eoq_code/reportTemplate.html deleted file mode 100644 index b47a313..0000000 --- a/eoq_code/reportTemplate.html +++ /dev/null @@ -1,347 +0,0 @@ - - - - - EOQ Output - - - - - - - - - - - - -

TITLE

- -

Dates: TO

- -

Number of completed surveys:

- -
- - -

A Health Check for your Employee Owned Business

- -

Employee ownership (EO) has the potential to deliver outstanding benefits to individual owners and drive exceptional company performance.

- -

However, research shows, for that to happen, a business must have excellent EO management practices in place.

- -

To help identify EO best practice, we developed the EO Framework. It is built on insights gathered directly from leaders, senior decision-makers and employee owners on how they have successfully implemented impactful EO.

- -

Developed by Great EO's founding partners in collaboration with the Employee Ownership Association, the EO Framework sets out four simple areas of EO management best practice:

- -
    -
  • EO Roles: Clearly defined EO roles through which leaders, trustees and employee owners all understand the part they play in making EO successful.
  • -
  • EO Approach: Strong EO core practices that empower employees to contribute to success.
  • -
  • EO Actions: Specific areas of EO management practice that can harness the full potential of employee ownership to strengthen strategy, innovation, and brand difference.
  • -
  • EO Results: Structured and consistent ways of measuring EO practice to track and enhance owner benefits and business outcomes.
  • -
- -

To bring the EO Framework to life, we have created a simple health check - the eoQ™ test - to help you assess the strength of your current EO practice and signpost areas for possible improvement. It should take up to 20-30 minutes to complete the questionnaire.

- - - - -
- - -

1. EO Roles

- -

It is vital that individual leaders, trustees, employee representatives and all employee owners understand their roles to ensure a successful EO business.

- -

To what extent does everyone fulfil their responsibilities in your business?

- - - - - - -
-

Q14 Great Employee Owners

- -

1. Our employee owners understand how to think and act like an owner.

- -

2. Our employee owners are committed to making the business stronger.

- -

3. Our employee owners understand how their actions impact the current year’s business results.

- -

4. Our employee owners understand how their actions help to execute our longer-term strategy.

- -

5. Our employee owners understand how their actions strengthen our organisational culture.

- -

Q15 Please add any additional comments:

- - -
- - -

Q16 Great EO Leaders

- -

1. Our executive leaders (those responsible for leading the business) are committed to realising the full business potential of our employee ownership.

- -

2. Our executive leaders regularly engage our people to contribute as owners to our vision and strategy.

- -

3. Our executive leaders ensure our people feel connected to our purpose, values, owner mindset and behaviours.

- -

4. Our executive leaders are role models for our desired owner behaviours and culture.

- - -

Q17 Please add any additional comments:

- - -
- - -

Q18 Great EO Governance

- -

1. All our governance bodies (boards, councils and voice groups) are clear on their role in ensuring long-term success for the business and its employee owners.

- - -

2. All our governance bodies work collaboratively and effectively to promote an ownership culture.

- -

3. All our governance bodies involve independent members who bring relevant experience, perspectives, and insights.

- -

4. All our governance bodies effectively use the diverse skills, experiences and opinions of their members.

- -

5. All our governance bodies fairly distribute ownership benefits in a manner that supports an ownership culture.

- -

6. All our governance bodies make decisions in the long-term best interests of the organisation and its stakeholders.

- - -

Q19 Please add any additional comments:

- - -
- - -

2. EO Approach

-

EO core practices build a strong ownership culture which drives engagement levels and encourages owner behaviours, including how to promote and protect the business over the long-term.

-

To what extent are you effectively engaging your people as owners and building an ownership mindset?

- - - - - - -
- - -

Great EO Culture

- -

1. Our behaviours as owners are improving the performance of the business.

- -

2. Our people processes (recruitment, development, appraisal and reward) encourage and reward our desired owner behaviours.

- -

3. Our culture creates a safe environment for feedback, learning, growth, health, well-being, inclusion and diversity.

- -

4. Our culture and support for people develops and retains the right talent.

- - -

Q22 Please add any additional comments:

- -
- - -

Q23 Great EO Engagement

- -

1. All of our managers (those responsible for managing people and processes) help ensure our people understand how and where decisions are made in the business.

- -

2. All of our managers help ensure our planning process, goal setting, and feedback channels enable people to influence decision-making as owners.

- -

3. All of our managers help ensure our people clearly understand the connection between their owner behaviours and strategy, business performance and reward.

- -

4. All of our managers help ensure our people are encouraged and empowered as owners to take responsibility for their own performance and contribution.

- - -

Q24 Please add any additional comments:

- -
- - -

Q25 Great EO Stewardship

- -

1. During tough times, we balance the current and future needs of our employee owners with those of the organisation.

- -

2. Our employee owners identify and manage risks to protect our organisation and reputation.

- -

3. We learn from tough times to become stronger in the future.

- -

4. Our culture encourages leaders, managers and specialists to develop candidates for their own succession.

- - -

Q26 Please add any additional comments:

- -
- - -

3. EO Actions

-

An EO business can use its ownership model to provide commercial advantages as it faces into the world.

-

To what extent are you harnessing the contributions of employees as owners to strengthen the quality and effectiveness of your strategy, innovation and commercial sustainability?

- - - - - - -
- - -

Q28 Great EO Strategy

- -

1. Our vision sets out the compelling benefits of our ownership model.

- -

2. Our strategy builds on our unique strengths including our ownership model.

- -

3. Our strategy outlines key activities and milestones that ensure our employee owners know how to contribute to a successful business.

- -

4. Our strategic approach to key markets ensures success by drawing on the experience and insights of our employee owners.

- - -

Q29 Please add any additional comments:

- -
- - -

Q30 Great EO Innovation

- -

1. Our employee owners understand how our business works and delivers results.

- -

2. Our employee owners are committed to driving continuous improvement and growth.

- -

3. Our employee owners consistently contribute ideas that improve our business.

- -

4. We provide clear channels and processes to capture, consider and provide feedback on new ideas and suggestions.

- -

5. We successfully prioritise and manage these ideas to deliver improvements to our business.

- - -

Q31 Please add any additional comments:

- -
- - -

Great EO Advantage

- -

1. We leverage our EO status to differentiate our customer brand to win against our competitors in the market.

- -

2. We leverage our EO status to differentiate our employer brand to strengthen our people proposition and attract talent.

- -

3. We leverage our EO status to differentiate our company brand to develop and retain high-quality relationships with suppliers and delivery partners.

- - -

Q33 Please add any additional comments:

- -
- - - - -

4. EO Results

- -

Well-run EO businesses ensure decision-making is informed by relevant data and insights from inside the business and by benchmarking themselves against others. This helps set strategic focus, direct operational effort, ensure continuous improvement and drive better business performance.

- -

Do you have the right EO data and insights to make this happen?

- - - -
- -

Q35 Great EO Measurement

- -

1. We are collecting data within the business that helps us understand how we benefit from our EO model.

- -

2. We measure and compare our EO performance with other similar EO businesses.

- -

3. We measure and compare our performance with other businesses in our sector (regardless of their ownership model).

- -

4. We pay attention to our impacts on more than just our employee owners (e.g. our customers, community or planet).

- - -

Q36 Please add any additional comments:

- -
- - -

Q37 Great EO Evaluation

- -

1. Our leaders and governance bodies use relevant EO data and insights to increase engagement levels among our people.

- -

2. Our leaders and governance bodies use relevant EO data and insights to strengthen our ownership culture.

- -

3. Our leaders and governance bodies use relevant EO data and insights to grow our business.

- -

4. Our leaders and governance bodies use relevant EO data and insights to meet the aspirations of our current employee owners.

- - -

Q38 Please add any additional comments:

- -
- -

Q39 Great EO Impact

- -

1. EO data and insights helps us demonstrate that our EO model encourages collaboration and team-working.

- -

2. EO data and insights help us demonstrate that our EO model promotes engagement and job satisfaction.

- -

3. EO data and insights help us demonstrate that our EO model improves health and well-being for employee owners.

- -

4. EO data and insights help us demonstrate that our EO model supports colleagues’ skills and capability.

- -

5. EO data and insights help us demonstrate that our EO model encourages strong ideas from colleagues.

- -

6. EO data and insights help us demonstrate that our EO model helps us recruit and retain talent.

- -

7. EO data and insights help us demonstrate that our EO model boosts personal commitment and productivity.

- -

8. EO data and insights help us demonstrate that our EO model increases profitability.

- -

9. EO data and insights help us demonstrate that our EO model encourages more contribution to the local community.

- -

10. EO data and insights help us demonstrate that our EO model encourages a focus on protecting the planet.

- - -

Q40 Please add any additional comments:

- -
- - - diff --git a/eoq_code/savesvg.js b/eoq_code/savesvg.js deleted file mode 100644 index 5e9f627..0000000 --- a/eoq_code/savesvg.js +++ /dev/null @@ -1,177 +0,0 @@ -function doBigWhiteTriangle(id){ - const svg = document.getElementById(id); - - // Triangle settings - const sideLength = 740; - const centerX = 435; - const centerY = 493; - const angleOffset = -90 * (Math.PI / 180); // Start at top - - // Generate 3 equilateral triangle points - const points = []; - for (let i = 0; i < 3; i++) { - const angle = angleOffset + i * (2 * Math.PI / 3); // 120° steps - const x = centerX + (sideLength / Math.sqrt(3)) * Math.cos(angle); - const y = centerY + (sideLength / Math.sqrt(3)) * Math.sin(angle); - points.push(`${x},${y}`); - } - - // Create the triangle - const triangle = document.createElementNS("http://www.w3.org/2000/svg", "polygon"); - triangle.setAttribute("points", points.join(" ")); - triangle.setAttribute("fill", "white"); - //triangle.setAttribute("stroke", "black"); // Optional - //triangle.setAttribute("stroke-width", "2"); // Optional - svg.appendChild(triangle); -} - -function doLittleWhiteTriangle(id){ - const svg = document.getElementById(id); - - // Triangle settings - const sideLength = 369; - const centerX = 250; - const centerY = 350; - const angleOffset = -90 * (Math.PI / 180); // Start at top - - // Generate 3 equilateral triangle points - const points = []; - for (let i = 0; i < 3; i++) { - const angle = angleOffset + i * (2 * Math.PI / 3); // 120° steps - const x = centerX + (sideLength / Math.sqrt(3)) * Math.cos(angle); - const y = centerY + (sideLength / Math.sqrt(3)) * Math.sin(angle); - points.push(`${x},${y}`); - } - - // Create the triangle - const triangle = document.createElementNS("http://www.w3.org/2000/svg", "polygon"); - triangle.setAttribute("points", points.join(" ")); - triangle.setAttribute("fill", "white"); - //triangle.setAttribute("stroke", "black"); // Optional - //triangle.setAttribute("stroke-width", "2"); // Optional - svg.appendChild(triangle); - - -} - - - - -/* -function inlineStyles(svgElement) { - const allElements = svgElement.querySelectorAll('*'); - const computedStyles = window.getComputedStyle(svgElement); - - // Apply style to root SVG element - svgElement.setAttribute("style", computedStyles.cssText || ""); - - // Recursively apply computed styles to each element - allElements.forEach(el => { - const computed = window.getComputedStyle(el); - let inline = ''; - for (let i = 0; i < computed.length; i++) { - const key = computed[i]; - const value = computed.getPropertyValue(key); - inline += `${key}:${value};`; - } - el.setAttribute('style', inline); - }); - } - -*/ - -function inlineStyles(svgElement) { - const allElements = svgElement.querySelectorAll('*'); - - allElements.forEach(el => { - const computed = window.getComputedStyle(el); - const style = []; - - for (let i = 0; i < computed.length; i++) { - const key = computed[i]; - let value = computed.getPropertyValue(key); - - // Replace currentColor with resolved color - if (value === 'currentcolor') { - value = computed.color; - } - - style.push(`${key}:${value};`); - } - - el.setAttribute('style', style.join(' ')); - }); - - // Also inline root - const svgComputed = window.getComputedStyle(svgElement); - let rootStyle = ''; - for (let i = 0; i < svgComputed.length; i++) { - const key = svgComputed[i]; - let value = svgComputed.getPropertyValue(key); - if (value === 'currentcolor') { - value = svgComputed.color; - } - rootStyle += `${key}:${value};`; - } - svgElement.setAttribute('style', rootStyle); -} - - -/* -function makeSvgRightClickable(id) { - const svg = document.getElementById(id); - inlineStyles(svg); - - // Ensure SVG has proper namespace - svg.setAttribute("xmlns", "http://www.w3.org/2000/svg"); - - // Serialize SVG - const svgData = new XMLSerializer().serializeToString(svg); - const svgBlob = new Blob([svgData], { type: "image/svg+xml;charset=utf-8" }); - const url = URL.createObjectURL(svgBlob); - - // Create image element - const img = document.createElement("img"); - img.src = url; - img.width = svg.width.baseVal.value; - img.height = svg.height.baseVal.value; - img.alt = "Right-click to save SVG image"; - - // Replace or insert after SVG - //svg.style.display = "none"; // hide original - svg.parentNode.insertBefore(img, svg.nextSibling); -} - - // Call the function after D3 has drawn the SVG - //makeSvgRightClickable("id"); -*/ - - -function makeSvgRightClickable(id) { - const svg = document.getElementById(id); - inlineStyles(svg); - - // Set namespace - svg.setAttribute("xmlns", "http://www.w3.org/2000/svg"); - - // Ensure width and height are set - if (!svg.hasAttribute("width")) svg.setAttribute("width", svg.getBoundingClientRect().width); - if (!svg.hasAttribute("height")) svg.setAttribute("height", svg.getBoundingClientRect().height); - - // Serialize - const svgData = new XMLSerializer().serializeToString(svg); - const svgBlob = new Blob([svgData], { type: "image/svg+xml;charset=utf-8" }); - const url = URL.createObjectURL(svgBlob); - - // Create image element - const img = document.createElement("img"); - img.src = url; - img.width = svg.getAttribute("width"); - img.height = svg.getAttribute("height"); - img.alt = "Right-click to save SVG image"; - - svg.style.display = "none"; - svg.parentNode.insertBefore(img, svg.nextSibling); -} - -