@cdc/markup-include 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ <!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h1>Header</h1> <p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.</p> <br> <p>Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn’t listen. </p><br><p>She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek.</p></body></html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdc/markup-include",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "React component for displaying HTML content from an outside link",
5
5
  "main": "dist/cdcmarkupinclude",
6
6
  "scripts": {
@@ -19,21 +19,21 @@
19
19
  },
20
20
  "license": "Apache-2.0",
21
21
  "homepage": "https://github.com/CDCgov/cdc-open-viz#readme",
22
- "devDependencies": {
23
- "@cdc/core": "^1.1.2",
24
- "interweave": "^13.0.0",
25
- "react-accessible-accordion": "^3.3.4",
26
- "use-debounce": "^6.0.1"
27
- },
28
22
  "dependencies": {
23
+ "@cdc/core": "^1.1.3",
29
24
  "axios": "^0.26.1",
30
25
  "chroma": "0.0.1",
31
26
  "chroma-js": "^2.1.0",
32
- "html-react-parser": "^1.4.8"
27
+ "html-react-parser": "1.4.9",
28
+ "interweave": "^13.0.0",
29
+ "react-accessible-accordion": "^3.3.4"
33
30
  },
34
31
  "peerDependencies": {
35
32
  "react": "^17.0.2",
36
- "react-dom": ">=16"
33
+ "react-dom": "^17.0.2"
34
+ },
35
+ "resolutions": {
36
+ "@types/react": "17.x"
37
37
  },
38
- "gitHead": "7b505fcc2ba71d8ee9beadc7fdf7aed769e58644"
38
+ "gitHead": "ff89a7aea74c533413c62ef8859cc011e6b3cbfa"
39
39
  }
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useCallback, useState } from 'react'
1
+ import React, { useEffect, useCallback, useState, useRef } from 'react'
2
2
  import axios from 'axios'
3
3
  import parse from 'html-react-parser'
4
4
  import { Markup } from 'interweave'
@@ -9,8 +9,11 @@ import Loading from '@cdc/core/components/Loading'
9
9
  import ConfigContext from './ConfigContext'
10
10
  import EditorPanel from './components/EditorPanel'
11
11
  import defaults from './data/initial-state'
12
+
12
13
  import './scss/main.scss'
13
14
 
15
+ import { publish } from '@cdc/core/helpers/events';
16
+
14
17
  const CdcMarkupInclude = (
15
18
  {
16
19
  configUrl,
@@ -29,6 +32,21 @@ const CdcMarkupInclude = (
29
32
  const [ urlMarkup, setUrlMarkup ] = useState('')
30
33
  const [ markupError, setMarkupError ] = useState(null)
31
34
  const [ errorMessage, setErrorMessage ] = useState(null)
35
+ const [ coveLoadedHasRan, setCoveLoadedHasRan ] = useState(false)
36
+ const container = useRef();
37
+
38
+ let innerContainerClasses = ['cove-component__inner']
39
+ config.title && innerContainerClasses.push('component--has-title')
40
+ config.subtext && innerContainerClasses.push('component--has-subtext')
41
+ config.biteStyle && innerContainerClasses.push(`bite__style--${config.biteStyle}`)
42
+ config.general?.isCompactStyle && innerContainerClasses.push(`component--isCompactStyle`)
43
+
44
+ let contentClasses = ['cove-component__content'];
45
+ !config.visual?.border && contentClasses.push('no-borders');
46
+ config.visual?.borderColorTheme && contentClasses.push('component--has-borderColorTheme');
47
+ config.visual?.accent && contentClasses.push('component--has-accent');
48
+ config.visual?.background && contentClasses.push('component--has-background');
49
+ config.visual?.hideBackgroundColor && contentClasses.push('component--hideBackgroundColor');
32
50
 
33
51
  let {
34
52
  title
@@ -64,7 +82,6 @@ const CdcMarkupInclude = (
64
82
  setLoading(false)
65
83
  }, [])
66
84
 
67
-
68
85
  // Custom Functions
69
86
  useEffect(() => {
70
87
  if (markupError) {
@@ -94,7 +111,7 @@ const CdcMarkupInclude = (
94
111
 
95
112
  if (config.srcUrl) {
96
113
  if (config.srcUrl === '#example') {
97
- setUrlMarkup('<!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h1>Header</h1> <p> But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. </p><br/><p> No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. </p><br/><p> To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?</p></body></html>')
114
+ setUrlMarkup('<!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <h1>Header</h1> <p>Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. Separated they live in Bookmarksgrove right at the coast of the Semantics, a large language ocean. A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.</p> <br> <p>Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar. The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli, but the Little Blind Text didn’t listen. </p><br><p>She packed her seven versalia, put her initial into the belt and made herself on the way. When she reached the first hills of the Italic Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane. Pityful a rethoric question ran over her cheek.</p></body></html>')
98
115
  } else {
99
116
  try {
100
117
  await axios
@@ -139,8 +156,16 @@ const CdcMarkupInclude = (
139
156
  //Load initial config
140
157
  useEffect(() => {
141
158
  loadConfig().catch((err) => console.log(err))
159
+ publish('cove_loaded', { loadConfigHasRun: true })
142
160
  }, [])
143
161
 
162
+ useEffect(() => {
163
+ if (config && !coveLoadedHasRan && container) {
164
+ publish('cove_loaded', { config: config })
165
+ setCoveLoadedHasRan(true)
166
+ }
167
+ }, [config, container]);
168
+
144
169
  //Reload config if config object provided/updated
145
170
  useEffect(() => {
146
171
  loadConfig().catch((err) => console.log(err))
@@ -153,29 +178,33 @@ const CdcMarkupInclude = (
153
178
 
154
179
  let content = (<Loading/>)
155
180
 
181
+ let bodyClasses = [
182
+ 'markup-include',
183
+ ]
184
+
156
185
  if (loading === false) {
157
186
  let body = (
158
- <>
159
- <div className="cove-component markup-include">
160
- {title &&
161
- <header className={`cove-component__header ${config.theme}`} aria-hidden="true">
162
- {parse(title)} {isDashboard}
163
- </header>
164
- }
165
- <div className="cove-component__content">
166
- {!markupError && urlMarkup &&
187
+ <div className={ bodyClasses.join(' ')} ref={container}>
188
+ {title &&
189
+ <header className={`cove-component__header ${config.theme}`} aria-hidden="true">
190
+ {parse(title)} {isDashboard}
191
+ </header>
192
+ }
193
+ <div className={`cove-component__content ${contentClasses.join(' ')}`}>
194
+ <div className={`${innerContainerClasses.join(' ')}`}>
167
195
  <div className="cove-component__content-wrap">
168
- <Markup content={parseBodyMarkup(urlMarkup)}/>
196
+ {!markupError && urlMarkup &&
197
+ <Markup content={parseBodyMarkup(urlMarkup)}/>
198
+ }
199
+ {markupError && config.srcUrl && <div className="warning">{errorMessage}</div>}
169
200
  </div>
170
- }
171
- {markupError && config.srcUrl && <div className="warning">{errorMessage}</div>}
172
201
  </div>
173
- </div>
174
- </>
202
+ </div>
203
+ </div>
175
204
  )
176
205
 
177
206
  content = (
178
- <div className={`cove`} style={isDashboard ? { marginTop: '3rem' } : null}>
207
+ <div className={`cove markup-include ${config.theme}`}>
179
208
  {isEditor && <EditorPanel>{body}</EditorPanel>}
180
209
  {!isEditor && body}
181
210
  </div>
@@ -1,17 +1,13 @@
1
1
  import React, { useState, useEffect, memo, useContext } from 'react'
2
2
 
3
- import {
4
- Accordion,
5
- AccordionItem,
6
- AccordionItemHeading,
7
- AccordionItemPanel,
8
- AccordionItemButton,
9
- } from 'react-accessible-accordion'
3
+ import ErrorBoundary from '@cdc/core/components/ErrorBoundary'
10
4
 
11
5
  import ConfigContext from '../ConfigContext'
12
- import ErrorBoundary from '@cdc/core/components/ErrorBoundary'
13
- import InputText from '@cdc/core/components/input/InputText'
14
6
 
7
+ import Accordion from '@cdc/core/components/ui/Accordion'
8
+ import InputText from '@cdc/core/components/inputs/InputText'
9
+
10
+ import '@cdc/core/styles/v2/components/editor.scss'
15
11
 
16
12
  const headerColors = [ 'theme-blue', 'theme-purple', 'theme-brown', 'theme-teal', 'theme-pink', 'theme-orange', 'theme-slate', 'theme-indigo', 'theme-cyan', 'theme-green', 'theme-amber' ]
17
13
 
@@ -26,7 +22,8 @@ const EditorPanel = memo((props) => {
26
22
  } = useContext(ConfigContext)
27
23
 
28
24
  const [ displayPanel, setDisplayPanel ] = useState(true)
29
- const [ showConfigConfirm, setShowConfigConfirm ] = useState(true)
25
+ const [ showConfigConfirm, setShowConfigConfirm ] = useState(false)
26
+
30
27
 
31
28
  const updateField = (section, subsection, fieldName, newValue) => {
32
29
  // Top level
@@ -72,7 +69,6 @@ const EditorPanel = memo((props) => {
72
69
 
73
70
  setParentConfig(newConfig)
74
71
  }
75
- // eslint-disable-next-line react-hooks/exhaustive-deps
76
72
  }, [ config ])
77
73
 
78
74
  useEffect(()=> {
@@ -117,7 +113,7 @@ const EditorPanel = memo((props) => {
117
113
  <section className="waiting-container">
118
114
  <h3>Finish Configuring</h3>
119
115
  <p>Set all required options to the left and confirm below to display a preview of the markup.</p>
120
- <button className="btn" style={{ margin: '1em auto' }} disabled={missingRequiredSections()}
116
+ <button className="btn" style={{ margin: '1em auto' }}
121
117
  onClick={confirmDone}>I'm Done
122
118
  </button>
123
119
  </section>
@@ -127,17 +123,56 @@ const EditorPanel = memo((props) => {
127
123
 
128
124
  const convertStateToConfig = () => {
129
125
  let strippedState = JSON.parse(JSON.stringify(config))
130
- if (false === missingRequiredSections()) {
131
- delete strippedState.newViz
132
- }
126
+ delete strippedState.newViz
133
127
  delete strippedState.runtime
134
128
 
135
129
  return strippedState
136
130
  }
137
131
 
138
- if (loading) {
139
- return null
140
- }
132
+ const CheckBox = memo(({ label, value, fieldName, section = null, subsection = null, tooltip, updateField, ...attributes }) => (
133
+ <label className="checkbox">
134
+ <input type="checkbox" name={fieldName} checked={value} onChange={() => { updateField(section, subsection, fieldName, !value) }} {...attributes} />
135
+ <span className="edit-label column-heading">{label}</span><span className="cove-icon">{tooltip}</span>
136
+ </label>
137
+ ))
138
+
139
+ const editorContent = (
140
+ <Accordion>
141
+ <Accordion.Section title="General">
142
+ <InputText value={config.title || ''} fieldName="title" label="Title"
143
+ placeholder="Markup Include Title"
144
+ updateField={updateField}/>
145
+
146
+ <InputText
147
+ value={config.srcUrl || ''} fieldName="srcUrl" label="Source URL"
148
+ placeholder="https://www.example.com/file.html" updateField={updateField}
149
+ />
150
+ </Accordion.Section>
151
+ <Accordion.Section title="Visual">
152
+ <div className="input-group">
153
+ <label>Theme</label>
154
+ <ul className="color-palette">
155
+ {headerColors.map((palette) => (
156
+ <li title={palette} key={palette} onClick={() => {
157
+ updateConfig({ ...config, theme: palette })
158
+ }} className={config.theme === palette ? 'selected ' + palette : palette}>
159
+ </li>
160
+ ))}
161
+ </ul>
162
+ </div>
163
+
164
+ {/* <div className="cove-accordion__panel-section">
165
+ <CheckBox value={config.visual.border} section="visual" fieldName="border" label="Display Border" updateField={updateField} />
166
+ <CheckBox value={config.visual.borderColorTheme} section="visual" fieldName="borderColorTheme" label="Use Border Color Theme" updateField={updateField} />
167
+ <CheckBox value={config.visual.accent} section="visual" fieldName="accent" label="Use Accent Style" updateField={updateField} />
168
+ <CheckBox value={config.visual.background} section="visual" fieldName="background" label="Use Theme Background Color" updateField={updateField} />
169
+ <CheckBox value={config.visual.hideBackgroundColor} section="visual" fieldName="hideBackgroundColor" label="Hide Background Color" updateField={updateField} />
170
+ </div> */}
171
+ </Accordion.Section>
172
+ </Accordion>
173
+ )
174
+
175
+ if (loading) return null
141
176
 
142
177
  return (
143
178
  <ErrorBoundary component="EditorPanel">
@@ -149,48 +184,8 @@ const EditorPanel = memo((props) => {
149
184
  <section className={`cove-editor__panel` + (displayPanel ? `` : ' hidden')}>
150
185
  <div className="cove-editor__panel-container">
151
186
  <h2 className="cove-editor__heading">Configure Markup Include</h2>
152
- <section className="form-container">
153
- <form>
154
- <Accordion allowZeroExpanded={true}>
155
- <AccordionItem> {/* General */}
156
- <AccordionItemHeading>
157
- <AccordionItemButton>
158
- General
159
- </AccordionItemButton>
160
- </AccordionItemHeading>
161
- <AccordionItemPanel>
162
- <InputText value={config.title || ''} fieldName="title" label="Title"
163
- placeholder="Markup Include Title"
164
- updateField={updateField}/>
165
-
166
- <InputText
167
- value={config.srcUrl || ''} fieldName="srcUrl" label="Source URL"
168
- placeholder="https://www.example.com/file.html" updateField={updateField}
169
- />
170
- </AccordionItemPanel>
171
- </AccordionItem>
172
- <AccordionItem>
173
- <AccordionItemHeading>
174
- <AccordionItemButton>
175
- Visual
176
- </AccordionItemButton>
177
- </AccordionItemHeading>
178
- <AccordionItemPanel>
179
- <div className="input-group">
180
- <label>Theme</label>
181
- <ul className="color-palette">
182
- {headerColors.map((palette) => (
183
- <li title={palette} key={palette} onClick={() => {
184
- updateConfig({ ...config, theme: palette })
185
- }} className={config.theme === palette ? 'selected ' + palette : palette}>
186
- </li>
187
- ))}
188
- </ul>
189
- </div>
190
- </AccordionItemPanel>
191
- </AccordionItem>
192
- </Accordion>
193
- </form>
187
+ <section className="cove-editor__content">
188
+ {editorContent}
194
189
  </section>
195
190
  </div>
196
191
  </section>
@@ -3,5 +3,12 @@ export default {
3
3
  "showHeader": false,
4
4
  "type": "markup-include",
5
5
  "srcUrl": "#example",
6
- "theme": "theme-blue"
6
+ "theme": "theme-blue",
7
+ "visual": {
8
+ "border": false,
9
+ "accent": false,
10
+ "background": false,
11
+ "hideBackgroundColor": false,
12
+ "borderColorTheme": false
13
+ },
7
14
  }
package/src/index.js CHANGED
@@ -1,16 +1,20 @@
1
- import React from 'react';
2
- import { render } from 'react-dom';
1
+ import React from 'react'
2
+ import { render } from 'react-dom'
3
+
4
+ import { GlobalContextProvider } from '@cdc/core/components/GlobalContext'
3
5
  import CdcMarkupInclude from './CdcMarkupInclude'
4
6
 
5
- const domContainers = document.querySelectorAll('.react-container');
7
+ const domContainers = document.querySelectorAll('.react-container')
6
8
 
7
- let isEditor = window.location.href.includes('editor=true');
9
+ let isEditor = window.location.href.includes('editor=true')
8
10
 
9
11
  domContainers.forEach((domContainer) => {
10
12
  render(
11
13
  <React.StrictMode>
12
- <CdcMarkupInclude configUrl={domContainer.attributes['data-config'].value} isEditor={isEditor} />
14
+ <GlobalContextProvider>
15
+ <CdcMarkupInclude configUrl={domContainer.attributes['data-config'].value} isEditor={isEditor}/>
16
+ </GlobalContextProvider>
13
17
  </React.StrictMode>,
14
18
  domContainer
15
- );
16
- });
19
+ )
20
+ })
@@ -1,5 +1,16 @@
1
1
  @import '~@cdc/core/styles/v2/main';
2
2
 
3
- html,body {
4
- margin: 0;
3
+ .markup-include {
4
+
5
+ .cove-component__header {
6
+ font-size: unset;
7
+ }
8
+
9
+ .cove-component__content {
10
+ background-color: #f2f2f2;
11
+ font-size: 14px;
12
+ }
13
+ .cove-component__content.component--hideBackgroundColor {
14
+ background: transparent;
15
+ }
5
16
  }
@@ -1,29 +0,0 @@
1
- $theme-colors: (
2
- "blue": $primary,
3
- "purple": $purple-primary,
4
- "brown": $brown-primary,
5
- "teal": $teal-primary,
6
- "pink": $pink-primary,
7
- "orange": $orange-primary,
8
- "slate": $slate-primary,
9
- "indigo": $indigo-primary,
10
- "cyan": $cyan-primary,
11
- "green": $green-primary,
12
- "amber": $amber-primary
13
- );
14
-
15
- $theme-colors-secondary: (
16
- "blue": $secondary,
17
- "purple": $purple-secondary,
18
- "brown": $brown-secondary,
19
- "teal": $teal-secondary,
20
- "pink": $pink-secondary,
21
- "orange": $orange-secondary,
22
- "slate": $slate-secondary,
23
- "indigo": $indigo-secondary,
24
- "cyan": $cyan-secondary,
25
- "green": $green-secondary,
26
- "amber": $amber-secondary
27
- );
28
-
29
- $editorWidth: 350px;