Allow step element to be a HTMLElement
Browse files- demo/scripts/demo.js +1 -1
- index.html +3 -3
- readme.md +1 -1
- src/common/utils.js +8 -0
- src/index.js +12 -10
- types/index.d.ts +1 -1
demo/scripts/demo.js
CHANGED
|
@@ -3,7 +3,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|
| 3 |
|
| 4 |
const tourSteps = [
|
| 5 |
{
|
| 6 |
-
element: '
|
| 7 |
popover: {
|
| 8 |
title: 'Before we start',
|
| 9 |
description: 'This is just one use-case, make sure to check out the rest of the docs below.',
|
|
|
|
| 3 |
|
| 4 |
const tourSteps = [
|
| 5 |
{
|
| 6 |
+
element: document.getElementById('driver-demo-head'),
|
| 7 |
popover: {
|
| 8 |
title: 'Before we start',
|
| 9 |
description: 'This is just one use-case, make sure to check out the rest of the docs below.',
|
index.html
CHANGED
|
@@ -292,9 +292,9 @@ driver.highlight({
|
|
| 292 |
<p>Here are the set of options that you can pass in each step i.e. an item in array of steps or the object that
|
| 293 |
you pass to <code>highlight</code> method</p>
|
| 294 |
<pre><code class="javascript">const stepDefinition = {
|
| 295 |
-
element: '#some-item',
|
| 296 |
-
popover: {
|
| 297 |
-
title: 'Title',
|
| 298 |
description: 'Description', // Body of the popover
|
| 299 |
showButtons: false, // Do not show control buttons in footer
|
| 300 |
closeBtnText: 'Close', // Text on the close button for this step
|
|
|
|
| 292 |
<p>Here are the set of options that you can pass in each step i.e. an item in array of steps or the object that
|
| 293 |
you pass to <code>highlight</code> method</p>
|
| 294 |
<pre><code class="javascript">const stepDefinition = {
|
| 295 |
+
element: '#some-item', // Query selector string or Node to be highlighted
|
| 296 |
+
popover: { // There will be no popover if empty or not given
|
| 297 |
+
title: 'Title', // Title on the popover
|
| 298 |
description: 'Description', // Body of the popover
|
| 299 |
showButtons: false, // Do not show control buttons in footer
|
| 300 |
closeBtnText: 'Close', // Text on the close button for this step
|
readme.md
CHANGED
|
@@ -182,7 +182,7 @@ Here are the set of options that you can pass while defining steps `defineSteps`
|
|
| 182 |
|
| 183 |
```javascript
|
| 184 |
const stepDefinition = {
|
| 185 |
-
element: '#some-item', // Query selector
|
| 186 |
stageBackground: '#ffffff', // This will override the one set in driver
|
| 187 |
popover: { // There will be no popover if empty or not given
|
| 188 |
title: 'Title', // Title on the popover
|
|
|
|
| 182 |
|
| 183 |
```javascript
|
| 184 |
const stepDefinition = {
|
| 185 |
+
element: '#some-item', // Query selector string or Node to be highlighted
|
| 186 |
stageBackground: '#ffffff', // This will override the one set in driver
|
| 187 |
popover: { // There will be no popover if empty or not given
|
| 188 |
title: 'Title', // Title on the popover
|
src/common/utils.js
CHANGED
|
@@ -47,3 +47,11 @@ export const getStyleProperty = (element, propertyName, prefixVendor = false) =>
|
|
| 47 |
return propertyValue && propertyValue.toLowerCase ? propertyValue.toLowerCase() : propertyValue;
|
| 48 |
};
|
| 49 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
return propertyValue && propertyValue.toLowerCase ? propertyValue.toLowerCase() : propertyValue;
|
| 48 |
};
|
| 49 |
|
| 50 |
+
/**
|
| 51 |
+
* Checks if the passed element is dom object or not
|
| 52 |
+
* @param element
|
| 53 |
+
* @returns {boolean}
|
| 54 |
+
*/
|
| 55 |
+
export const isDomElement = function (element) {
|
| 56 |
+
return element && typeof element === 'object' && 'nodeType' in element;
|
| 57 |
+
};
|
src/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
| 17 |
SHOULD_OUTSIDE_CLICK_NEXT,
|
| 18 |
} from './common/constants';
|
| 19 |
import Stage from './core/stage';
|
|
|
|
| 20 |
|
| 21 |
/**
|
| 22 |
* Plugin class that drives the plugin
|
|
@@ -248,10 +249,6 @@ export default class Driver {
|
|
| 248 |
this.steps = [];
|
| 249 |
|
| 250 |
steps.forEach((step, index) => {
|
| 251 |
-
if (!step.element || typeof step.element !== 'string') {
|
| 252 |
-
throw new Error(`Element (query selector string) missing in step ${index}`);
|
| 253 |
-
}
|
| 254 |
-
|
| 255 |
const element = this.prepareElementFromStep(step, steps, index);
|
| 256 |
if (!element) {
|
| 257 |
return;
|
|
@@ -272,13 +269,18 @@ export default class Driver {
|
|
| 272 |
* @private
|
| 273 |
*/
|
| 274 |
prepareElementFromStep(currentStep, allSteps = [], index = 0) {
|
| 275 |
-
let querySelector = '';
|
| 276 |
let elementOptions = {};
|
|
|
|
| 277 |
|
| 278 |
-
// If
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 282 |
querySelector = currentStep.element;
|
| 283 |
elementOptions = {
|
| 284 |
...this.options,
|
|
@@ -286,7 +288,7 @@ export default class Driver {
|
|
| 286 |
};
|
| 287 |
}
|
| 288 |
|
| 289 |
-
const domElement = this.document.querySelector(querySelector);
|
| 290 |
if (!domElement) {
|
| 291 |
console.warn(`Element to highlight ${querySelector} not found`);
|
| 292 |
return null;
|
|
|
|
| 17 |
SHOULD_OUTSIDE_CLICK_NEXT,
|
| 18 |
} from './common/constants';
|
| 19 |
import Stage from './core/stage';
|
| 20 |
+
import { isDomElement } from './common/utils';
|
| 21 |
|
| 22 |
/**
|
| 23 |
* Plugin class that drives the plugin
|
|
|
|
| 249 |
this.steps = [];
|
| 250 |
|
| 251 |
steps.forEach((step, index) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 252 |
const element = this.prepareElementFromStep(step, steps, index);
|
| 253 |
if (!element) {
|
| 254 |
return;
|
|
|
|
| 269 |
* @private
|
| 270 |
*/
|
| 271 |
prepareElementFromStep(currentStep, allSteps = [], index = 0) {
|
|
|
|
| 272 |
let elementOptions = {};
|
| 273 |
+
let querySelector = currentStep;
|
| 274 |
|
| 275 |
+
// If the `currentStep` is step definition
|
| 276 |
+
// then grab the options and element from the definition
|
| 277 |
+
const isStepDefinition = typeof currentStep !== 'string' && !isDomElement(currentStep);
|
| 278 |
+
|
| 279 |
+
if (!currentStep || (isStepDefinition && !currentStep.element)) {
|
| 280 |
+
throw new Error(`Element is required in step ${index}`);
|
| 281 |
+
}
|
| 282 |
+
|
| 283 |
+
if (isStepDefinition) {
|
| 284 |
querySelector = currentStep.element;
|
| 285 |
elementOptions = {
|
| 286 |
...this.options,
|
|
|
|
| 288 |
};
|
| 289 |
}
|
| 290 |
|
| 291 |
+
const domElement = isDomElement(querySelector) ? querySelector : this.document.querySelector(querySelector);
|
| 292 |
if (!domElement) {
|
| 293 |
console.warn(`Element to highlight ${querySelector} not found`);
|
| 294 |
return null;
|
types/index.d.ts
CHANGED
|
@@ -138,7 +138,7 @@ declare module 'driver.js' {
|
|
| 138 |
/**
|
| 139 |
* Query selector representing the DOM Element
|
| 140 |
*/
|
| 141 |
-
element: string;
|
| 142 |
|
| 143 |
/**
|
| 144 |
* Color of stage when this step is active
|
|
|
|
| 138 |
/**
|
| 139 |
* Query selector representing the DOM Element
|
| 140 |
*/
|
| 141 |
+
element: string | HTMLElement | Node;
|
| 142 |
|
| 143 |
/**
|
| 144 |
* Color of stage when this step is active
|