Skip to content

Commit

Permalink
fix(menu): additional menu entries with children collapsed (first lev…
Browse files Browse the repository at this point in the history
…el only)

fix #714
  • Loading branch information
vogloblinsky committed Jan 16, 2019
1 parent f94d664 commit d6086b4
Show file tree
Hide file tree
Showing 9 changed files with 610 additions and 545 deletions.
58 changes: 51 additions & 7 deletions src/app/application.ts
Expand Up @@ -8,6 +8,7 @@ import { SyntaxKind } from 'ts-simple-ast';
const chokidar = require('chokidar');
const marked = require('marked');
const traverse = require('traverse');
const crypto = require('crypto');

import { logger } from '../utils/logger';

Expand Down Expand Up @@ -37,7 +38,9 @@ import {
findMainSourceFolder
} from '../utils/utils';

import { AdditionalNode } from './interfaces/additional-node.interface';
import { CoverageData } from './interfaces/coverageData.interface';
import { resolve } from 'url';

let cwd = process.cwd();
let startTime = new Date();
Expand Down Expand Up @@ -748,12 +751,17 @@ export class Application {
const parsedSummaryData = JSON.parse(summaryData);

let that = this;
let lastLevelOnePage = null;

traverse(parsedSummaryData).forEach(function() {
// tslint:disable-next-line:no-invalid-this
if (this.notRoot && typeof this.node === 'object') {
// tslint:disable-next-line:no-invalid-this
let rawPath = this.path;
let file = this.node.file;
let title = this.node.title;
// tslint:disable-next-line:no-invalid-this
let additionalNode: AdditionalNode = this.node;
let file = additionalNode.file;
let title = additionalNode.title;
let finalPath = Configuration.mainData.includesFolder;

let finalDepth = rawPath.filter(el => {
Expand All @@ -763,14 +771,25 @@ export class Application {
if (typeof file !== 'undefined' && typeof title !== 'undefined') {
const url = cleanNameWithoutSpaceAndToLowerCase(title);

/**
* Id created with title + file path hash, seems to be hypothetically unique here
*/
const id = crypto
.createHash('md5')
.update(title + file)
.digest('hex');

// tslint:disable-next-line:no-invalid-this
this.node.id = id;

let lastElementRootTree = null;
finalDepth.forEach(el => {
let elementTree =
lastElementRootTree === null
? parsedSummaryData
: lastElementRootTree;
if (typeof elementTree.children !== 'undefined') {
elementTree = elementTree.children[el];
elementTree = elementTree['children'][el];
} else {
elementTree = elementTree[el];
}
Expand All @@ -788,16 +807,30 @@ export class Application {
if (finalDepth.length > 5) {
logger.error('Only 5 levels of depth are supported');
} else {
Configuration.addAdditionalPage({
let _page = {
name: title,
id: title,
id: id,
filename: url,
context: 'additional-page',
path: finalPath,
additionalPage: markdownFile,
depth: finalDepth.length,
childrenLength: additionalNode.children
? additionalNode.children.length
: 0,
children: [],
lastChild: false,
pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
});
};
if (finalDepth.length === 1) {
lastLevelOnePage = _page;
}
if (finalDepth.length > 1) {
// store all child pages of the last root level 1 page inside it
lastLevelOnePage.children.push(_page);
} else {
Configuration.addAdditionalPage(_page);
}
}
}
}
Expand Down Expand Up @@ -2504,7 +2537,18 @@ at least one config for the 'info' or 'source' tab in --navTabConfig.`);
public processAdditionalPages() {
logger.info('Process additional pages');
let pages = Configuration.mainData.additionalPages;
Promise.all(pages.map((page, i) => this.processPage(page)))
Promise.all(
pages.map(page => {
if (page.children.length > 0) {
return Promise.all([
this.processPage(page),
...page.children.map(childPage => this.processPage(childPage))
]);
} else {
return this.processPage(page);
}
})
)
.then(() => {
SearchEngine.generateSearchIndexJson(Configuration.mainData.output).then(() => {
if (Configuration.mainData.assetsFolder !== '') {
Expand Down
4 changes: 2 additions & 2 deletions src/app/compiler/angular/deps/component-dep.factory.ts
@@ -1,7 +1,7 @@
import { IDep } from '../dependencies.interfaces';
import { ComponentHelper } from './helpers/component-helper';
import { cleanLifecycleHooksFromMethods } from '../../../../utils';
import Configuration from '../../../configuration';
import { IDep } from '../dependencies.interfaces';
import { ComponentHelper } from './helpers/component-helper';

const crypto = require('crypto');

Expand Down
7 changes: 6 additions & 1 deletion src/app/configuration.ts
Expand Up @@ -3,6 +3,7 @@ import * as _ from 'lodash';
import { COMPODOC_DEFAULTS } from '../utils/defaults';

import { ConfigurationInterface } from './interfaces/configuration.interface';
import { CoverageData } from './interfaces/coverageData.interface';
import { MainDataInterface } from './interfaces/main-data.interface';
import { PageInterface } from './interfaces/page.interface';

Expand Down Expand Up @@ -72,7 +73,7 @@ export class Configuration implements ConfigurationInterface {
routesLength: 0,
angularVersion: '',
exportFormat: COMPODOC_DEFAULTS.exportFormat,
coverageData: {},
coverageData: {} as CoverageData,
customFavicon: '',
customLogo: '',
packageDependencies: [],
Expand Down Expand Up @@ -109,6 +110,10 @@ export class Configuration implements ConfigurationInterface {
this._mainData.additionalPages.push(page);
}

public getAdditionalPageById(id): PageInterface {
return this._mainData.additionalPages.find(page => page.id === id);
}

public resetPages() {
this._pages = [];
}
Expand Down
3 changes: 3 additions & 0 deletions src/app/interfaces/page.interface.ts
Expand Up @@ -18,4 +18,7 @@ export interface PageInterface {
pageType?: string;
component?: any;
markdown?: string;
childrenLength?: number;
children: any[];
lastChild?: boolean;
}
66 changes: 46 additions & 20 deletions src/resources/js/menu.js
Expand Up @@ -3,15 +3,15 @@ document.addEventListener('DOMContentLoaded', function() {
mobileMenu = document.getElementById('mobile-menu');

var localContextInUrl = '';

if (COMPODOC_CURRENT_PAGE_CONTEXT !== '') {
localContextInUrl = localContextInUrl;
switch (COMPODOC_CURRENT_PAGE_CONTEXT) {
case 'additional-page':
localContextInUrl = 'additional-documentation'
localContextInUrl = 'additional-documentation';
break;
case 'class':
localContextInUrl = 'classes'
localContextInUrl = 'classes';
break;
case 'miscellaneous-functions':
case 'miscellaneous-variables':
Expand All @@ -24,13 +24,13 @@ document.addEventListener('DOMContentLoaded', function() {
}

function hasClass(el, cls) {
return el.className && new RegExp("(\\s|^)" + cls + "(\\s|$)").test(el.className);
return el.className && new RegExp('(\\s|^)' + cls + '(\\s|$)').test(el.className);
}

var processLink = function(link, url) {
if (url.charAt(0) !== '.') {
var prefix = '';
switch(COMPODOC_CURRENT_PAGE_DEPTH) {
switch (COMPODOC_CURRENT_PAGE_DEPTH) {
case 5:
prefix = '../../../../../';
break;
Expand All @@ -52,24 +52,26 @@ document.addEventListener('DOMContentLoaded', function() {
}
link.setAttribute('href', prefix + url);
}
}
};

var processMenuLinks = function(links, dontAddClass) {
for (var i = 0; i < links.length; i++) {
var link = links[i];
var linkHref = link.getAttribute('href');
if (linkHref) {
var linkHrefFile = linkHref.substr(linkHref.lastIndexOf('/') + 1, linkHref.length);
if (linkHrefFile.toLowerCase() === COMPODOC_CURRENT_PAGE_URL.toLowerCase()
&& link.innerHTML.indexOf('Getting started') == -1
&& !dontAddClass
&& linkHref.toLowerCase().indexOf(localContextInUrl.toLowerCase()) !== -1 ) {
if (
linkHrefFile.toLowerCase() === COMPODOC_CURRENT_PAGE_URL.toLowerCase() &&
link.innerHTML.indexOf('Getting started') == -1 &&
!dontAddClass &&
linkHref.toLowerCase().indexOf(localContextInUrl.toLowerCase()) !== -1
) {
link.classList.add('active');
}
processLink(link, linkHref);
}
}
}
};
var chapterLinks = document.querySelectorAll('[data-type="chapter-link"]');
processMenuLinks(chapterLinks);
var entityLinks = document.querySelectorAll('[data-type="entity-link"]');
Expand All @@ -84,7 +86,7 @@ document.addEventListener('DOMContentLoaded', function() {
var url = entityLogo.getAttribute('data-src');
if (url.charAt(0) !== '.') {
var prefix = '';
switch(COMPODOC_CURRENT_PAGE_DEPTH) {
switch (COMPODOC_CURRENT_PAGE_DEPTH) {
case 5:
prefix = '../../../../../';
break;
Expand All @@ -102,13 +104,13 @@ document.addEventListener('DOMContentLoaded', function() {
break;
case 0:
prefix = './';
break
break;
}
entityLogo.src = prefix + url;
}
}
}
}
};
processLogos(entityLogos);

setTimeout(function() {
Expand Down Expand Up @@ -156,7 +158,7 @@ document.addEventListener('DOMContentLoaded', function() {
elementIconChild = parent.getElementsByClassName(faAngleDownClass)[0];
}
if (elementIconChild) {
elementIconChild = $(elementIconChild)
elementIconChild = $(elementIconChild);
if (elementIconChild.hasClass(faAngleUpClass)) {
elementIconChild.addClass(faAngleDownClass);
elementIconChild.removeClass(faAngleUpClass);
Expand All @@ -180,7 +182,7 @@ document.addEventListener('DOMContentLoaded', function() {
activeMenuClass,
activeLink;

for (i; i<len; i++) {
for (i; i < len; i++) {
if (getComputedStyle(menus[i]).display != 'none') {
activeMenu = menus[i];
activeMenuClass = activeMenu.getAttribute('class').split(' ')[0];
Expand All @@ -202,7 +204,9 @@ document.addEventListener('DOMContentLoaded', function() {
parentChapterMenu = parentUl.parentNode;
if (parentChapterMenu) {
var toggler = parentChapterMenu.querySelector('.menu-toggler'),
elementIconChild = toggler.getElementsByClassName(faAngleUpClass)[0];
elementIconChild = toggler.getElementsByClassName(
faAngleUpClass
)[0];
if (toggler && !elementIconChild) {
toggler.click();
}
Expand All @@ -212,24 +216,46 @@ document.addEventListener('DOMContentLoaded', function() {
if (linkContext && linkContext === 'sub-entity') {
// Toggle also the master parent menu
var linkContextId = activeLink.getAttribute('data-context-id');
var toggler = activeMenu.querySelector('.chapter.' + linkContextId + ' a .menu-toggler');
var toggler = activeMenu.querySelector(
'.chapter.' + linkContextId + ' a .menu-toggler'
);
if (toggler) {
toggler.click();
}
if (linkContextId === 'additional') {
var mainToggler = activeMenu.querySelector(
'.chapter.' + linkContextId + ' div.menu-toggler'
);
if (mainToggler) {
mainToggler.click();
}
}
}
} else if (linkType === 'chapter-link') {
var linkContextId = activeLink.getAttribute('data-context-id');
var toggler = activeLink.querySelector('.menu-toggler');
if (toggler) {
toggler.click();
}
if (linkContextId === 'additional') {
var mainToggler = activeMenu.querySelector(
'.chapter.' + linkContextId + ' div.menu-toggler'
);
if (mainToggler) {
mainToggler.click();
}
}
}
setTimeout(function() {
activeMenu.scrollTop = activeLink.offsetTop;
if (activeLink.innerHTML.toLowerCase().indexOf('readme') != -1 || activeLink.innerHTML.toLowerCase().indexOf('overview') != -1) {
if (
activeLink.innerHTML.toLowerCase().indexOf('readme') != -1 ||
activeLink.innerHTML.toLowerCase().indexOf('overview') != -1
) {
activeMenu.scrollTop = 0;
}
}, 300);
}
}
}, 0);
});
});

0 comments on commit d6086b4

Please sign in to comment.