├── .editorconfig
├── .eslintrc.js
├── .eslintrc1.json
├── .github
└── workflows
│ └── codeql-analysis.yml
├── .gitignore
├── .prettierrc
├── .vscode
└── settings.json
├── Examples
├── .ipynb_checkpoints
│ ├── Random Orgstructure-checkpoint.ipynb
│ └── Untitled-checkpoint.ipynb
├── Random Orgstructure.ipynb
└── data.js
├── LICENSE
├── README.md
├── assets
├── README.md
├── css
│ ├── fonts
│ │ ├── roboto-condensed-v16-latin-700.woff
│ │ ├── roboto-condensed-v16-latin-700.woff2
│ │ ├── roboto-condensed-v16-latin-regular.woff
│ │ └── roboto-condensed-v16-latin-regular.woff2
│ └── main.css
├── data
│ └── OrgStructure.json
└── img
│ ├── Screenshot1.PNG
│ ├── Screenshot11.PNG
│ ├── down.svg
│ ├── gh.svg
│ └── profile.png
├── components
├── DepartmentDetails.vue
├── DeptBox copy.vue
├── DeptBox.vue
├── DrawLines.vue
├── EditConfig.vue
├── EditMenu.vue
├── EmployeeList.vue
├── FileMenu.vue
├── OptionsMenu.vue
├── OrgChart.vue
├── PageHeader.vue
├── PersonPicker.vue
├── README.md
├── SearchBox.vue
├── ShowDept.vue
├── ShowPerson.vue
├── SideScreen.vue
└── ViewMenu.vue
├── deploy_linux.bat
├── docs
├── .nojekyll
├── 1b3c704.js
├── 200.html
├── 3b77a50.js
├── 8e0b1c0.js
├── 9dfe856.js
├── LICENSES
├── README.md
├── a865292.js
├── config.js
├── data.js
├── e8cd43a.js
├── favicon.ico
├── fonts
│ ├── MaterialIcons-Regular.4674f8d.eot
│ ├── MaterialIcons-Regular.5e7382c.ttf
│ ├── MaterialIcons-Regular.83bebaf.woff
│ ├── MaterialIcons-Regular.cff684e.woff2
│ ├── roboto-condensed-v16-latin-700.38d343e.woff2
│ ├── roboto-condensed-v16-latin-700.3f5e8f8.woff
│ ├── roboto-condensed-v16-latin-regular.9c571b9.woff2
│ └── roboto-condensed-v16-latin-regular.af8dac2.woff
├── index.html
├── photos
│ ├── B01.png
│ ├── B02.png
│ ├── B03.png
│ ├── B04.png
│ └── B05.png
├── testfiles
│ ├── config v1.js
│ ├── config_default.js
│ └── data v1.js
└── translate.js
├── layouts
├── README.md
└── default.vue
├── middleware
└── README.md
├── nuxt 2.4 update if problems.txt
├── nuxt.config.generate.js
├── nuxt.config.js
├── orgchart.zip
├── package-lock.json
├── package.json
├── pages
├── README.md
└── index.vue
├── plugins
├── AsyncComputed.js
├── HelpFunctions.js
├── README.md
└── vueMatertialIcons.js
├── static
├── README.md
├── config.js
├── data.js
├── favicon.ico
├── photos
│ ├── B01.png
│ ├── B02.png
│ ├── B03.png
│ ├── B04.png
│ └── B05.png
├── testfiles
│ ├── config v1.js
│ ├── config_default.js
│ └── data v1.js
└── translate.js
├── store
├── README.md
└── index.js
└── vendor.yml
/.editorconfig:
--------------------------------------------------------------------------------
1 | # editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | [*.md]
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: {
4 | browser: true,
5 | node: true
6 | },
7 | parserOptions: {
8 | parser: 'babel-eslint'
9 | },
10 | extends: ['plugin:vue/recommended', 'plugin:prettier/recommended'],
11 | plugins: ['vue', 'prettier'],
12 | // add your custom rules here
13 | rules: {}
14 | }
15 |
--------------------------------------------------------------------------------
/.eslintrc1.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true
4 | },
5 | "extends": "eslint:recommended",
6 | "parserOptions": {
7 | "ecmaVersion": 5
8 | },
9 | "rules": {
10 | "indent": [
11 | "error",
12 | "tab"
13 | ],
14 | "linebreak-style": [
15 | "error",
16 | "windows"
17 | ],
18 | "quotes": [
19 | "error",
20 | "double"
21 | ],
22 | "semi": [
23 | "error",
24 | "never"
25 | ]
26 | }
27 | }
--------------------------------------------------------------------------------
/.github/workflows/codeql-analysis.yml:
--------------------------------------------------------------------------------
1 | # For most projects, this workflow file will not need changing; you simply need
2 | # to commit it to your repository.
3 | #
4 | # You may wish to alter this file to override the set of languages analyzed,
5 | # or to provide custom queries or build logic.
6 | #
7 | # ******** NOTE ********
8 | # We have attempted to detect the languages in your repository. Please check
9 | # the `language` matrix defined below to confirm you have the correct set of
10 | # supported CodeQL languages.
11 | #
12 | name: "CodeQL"
13 |
14 | on:
15 | push:
16 | branches: [ master ]
17 | pull_request:
18 | # The branches below must be a subset of the branches above
19 | branches: [ master ]
20 | schedule:
21 | - cron: '31 15 * * 1'
22 |
23 | jobs:
24 | analyze:
25 | name: Analyze
26 | runs-on: ubuntu-latest
27 |
28 | strategy:
29 | fail-fast: false
30 | matrix:
31 | language: [ 'javascript' ]
32 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
33 | # Learn more:
34 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
35 |
36 | steps:
37 | - name: Checkout repository
38 | uses: actions/checkout@v2
39 |
40 | # Initializes the CodeQL tools for scanning.
41 | - name: Initialize CodeQL
42 | uses: github/codeql-action/init@v1
43 | with:
44 | languages: ${{ matrix.language }}
45 | # If you wish to specify custom queries, you can do so here or in a config file.
46 | # By default, queries listed here will override any specified in a config file.
47 | # Prefix the list here with "+" to use these queries and those in the config file.
48 | # queries: ./path/to/local/query, your-org/your-repo/queries@main
49 |
50 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
51 | # If this step fails, then you should remove it and run the build manually (see below)
52 | - name: Autobuild
53 | uses: github/codeql-action/autobuild@v1
54 |
55 | # ℹ️ Command-line programs to run using the OS shell.
56 | # 📚 https://git.io/JvXDl
57 |
58 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
59 | # and modify them (or add more) to build your code if your project
60 | # uses a compiled language
61 |
62 | #- run: |
63 | # make bootstrap
64 | # make release
65 |
66 | - name: Perform CodeQL Analysis
67 | uses: github/codeql-action/analyze@v1
68 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Created by .ignore support plugin (hsz.mobi)
2 | ### Node template
3 | # Logs
4 | logs
5 | *.log
6 | npm-debug.log*
7 | yarn-debug.log*
8 | yarn-error.log*
9 |
10 | # Runtime data
11 | pids
12 | *.pid
13 | *.seed
14 | *.pid.lock
15 |
16 | # Directory for instrumented libs generated by jscoverage/JSCover
17 | lib-cov
18 |
19 | # Coverage directory used by tools like istanbul
20 | coverage
21 |
22 | # nyc test coverage
23 | .nyc_output
24 |
25 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
26 | .grunt
27 |
28 | # Bower dependency directory (https://bower.io/)
29 | bower_components
30 |
31 | # node-waf configuration
32 | .lock-wscript
33 |
34 | # Compiled binary addons (https://nodejs.org/api/addons.html)
35 | build/Release
36 |
37 | # Dependency directories
38 | node_modules/
39 | jspm_packages/
40 |
41 | # TypeScript v1 declaration files
42 | typings/
43 |
44 | # Optional npm cache directory
45 | .npm
46 |
47 | # Optional eslint cache
48 | .eslintcache
49 |
50 | # Optional REPL history
51 | .node_repl_history
52 |
53 | # Output of 'npm pack'
54 | *.tgz
55 |
56 | # Yarn Integrity file
57 | .yarn-integrity
58 |
59 | # dotenv environment variables file
60 | .env
61 |
62 | # parcel-bundler cache (https://parceljs.org/)
63 | .cache
64 |
65 | # next.js build output
66 | .next
67 |
68 | # nuxt.js build output
69 | .nuxt
70 |
71 | # Nuxt generate
72 | dist
73 |
74 | # vuepress build output
75 | .vuepress/dist
76 |
77 | # Serverless directories
78 | .serverless
79 |
80 | # IDE
81 | .idea
82 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "semi": false,
3 | "singleQuote": true,
4 | "printWidth": 70,
5 | "endOfLine": "auto"
6 | }
7 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "eslint.alwaysShowStatus": true,
3 | "eslint.autoFixOnSave": true,
4 | "eslint.validate": [
5 | "javascript", {
6 | "language": "vue",
7 | "autoFix": true
8 | }
9 | ],
10 | "files.exclude": {
11 | "**/.git": false
12 | },
13 | "editor.codeActionsOnSave": {
14 | "source.fixAll.eslint": true
15 | },
16 | "editor.formatOnSave": true
17 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 Michael Hoogkamer
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # vueOrgChart
2 |
3 | > Organization chart:
4 | > A complete solution to generate and publish an orgchart without the need of a webserver and database
5 | > (c) Michael Hoogkamer
6 |
7 | Here is the online [Demo](https://hoogkamer.github.io/vue-org-chart/)
8 |
9 | For more information see the [Website](https://freeorgchart.netlify.app/)
10 |
11 | **Do you want to show your (Agile) teams instead of an orgchart? Try: [Teamviewer](https://github.com/Hoogkamer/TeamViewer) open source.**
12 |
13 | ## Build Setup
14 |
15 | This is only needed if you want to build/change your own version. If you want to use it without modification, open \doc\index.html. See also \doc\config.js. For more info see the [Website](https://freeorgchart.netlify.app/)
16 |
17 | _The config.js, data.js and photos folder used for development are in the \static folder_
18 |
19 | ```bash
20 | # install dependencies
21 | $ npm install
22 |
23 | # serve with hot reload at localhost:3000
24 | $ npm run dev
25 |
26 |
27 | # build for production and launch server
28 | $ npm run build
29 | $ npm start
30 |
31 | # generate static project
32 | $ npm run generate
33 | static output will be place in \dist folder, copy this to any location
34 | ```
35 |
36 | Use Node 16
37 |
--------------------------------------------------------------------------------
/assets/README.md:
--------------------------------------------------------------------------------
1 | # ASSETS
2 |
3 | **This directory is not required, you can delete it if you don't want to use it.**
4 |
5 | This directory contains your un-compiled assets such as LESS, SASS, or JavaScript.
6 |
7 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#webpacked).
8 |
--------------------------------------------------------------------------------
/assets/css/fonts/roboto-condensed-v16-latin-700.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/assets/css/fonts/roboto-condensed-v16-latin-700.woff
--------------------------------------------------------------------------------
/assets/css/fonts/roboto-condensed-v16-latin-700.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/assets/css/fonts/roboto-condensed-v16-latin-700.woff2
--------------------------------------------------------------------------------
/assets/css/fonts/roboto-condensed-v16-latin-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/assets/css/fonts/roboto-condensed-v16-latin-regular.woff
--------------------------------------------------------------------------------
/assets/css/fonts/roboto-condensed-v16-latin-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/assets/css/fonts/roboto-condensed-v16-latin-regular.woff2
--------------------------------------------------------------------------------
/assets/css/main.css:
--------------------------------------------------------------------------------
1 | /* roboto-condensed-regular - latin */
2 | @font-face {
3 | font-family: 'Roboto Condensed';
4 | font-style: normal;
5 | font-weight: 400;
6 | src: local('Roboto Condensed'), local('RobotoCondensed-Regular'),
7 | url('fonts/roboto-condensed-v16-latin-regular.woff2')
8 | format('woff2'),
9 | /* Chrome 26+, Opera 23+, Firefox 39+ */
10 | url('fonts/roboto-condensed-v16-latin-regular.woff')
11 | format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
12 | }
13 | /* roboto-condensed-700 - latin */
14 | @font-face {
15 | font-family: 'Roboto Condensed';
16 | font-style: normal;
17 | font-weight: 700;
18 | src: local('Roboto Condensed Bold'), local('RobotoCondensed-Bold'),
19 | url('fonts/roboto-condensed-v16-latin-700.woff2') format('woff2'),
20 | /* Chrome 26+, Opera 23+, Firefox 39+ */
21 | url('fonts/roboto-condensed-v16-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
22 | }
23 |
24 | * {
25 | font-family: 'Roboto Condensed', sans-serif;
26 | box-sizing: border-box;
27 | padding: 0px;
28 | }
29 |
--------------------------------------------------------------------------------
/assets/data/OrgStructure.json:
--------------------------------------------------------------------------------
1 | [
2 | {"id":"1","name":"Software BV","parentId":""},
3 | {"id":"2","name":"Office","parentId":"1", "isStaff":true},
4 | {"id":"3","name":"Communication","parentId":"1", "isStaff":true},
5 | {"id":"4","name":"Strategy & Sustainability","parentId":"1", "isStaff": true},
6 | {"id":"5","name":"Desktop Development","parentId":"1"},
7 | {"id":"6","name":"Mobile Development","parentId":"1"},
8 | {"id":"7","name":"Web Development","parentId":"1"},
9 | {"id":"9","name":"Finance","parentId":"1"},
10 | {"id":"10","name":"Risk Management","parentId":"1"},
11 | {"id":"11","name":"Innovation & Technology","parentId":"1"},
12 | {"id":"12","name":"Human Resources","parentId":"1"},
13 | {"id": "5_1", "name":"Business customers", "parentId":"5"},
14 | {"id": "5_1_0", "name":"Business Office", "parentId":"5_1", "isStaff": true},
15 | {"id": "5_1_1", "name":"Front end team", "parentId":"5_1", "isStaff": false},
16 | {"id": "5_1_2", "name":"Back end team", "parentId":"5_1"},
17 | {"id": "5_1_3", "name":"Api team", "parentId":"5_1"},
18 | {"id": "5_2", "name":"Private Customer", "parentId":"5"},
19 | {"id": "6_1", "name":"Android", "parentId":"6"},
20 | {"id": "6_2", "name":"IOS", "parentId":"6"},
21 | {"id": "6_3", "name":"Other", "parentId":"6"},
22 | {"id": "7_1", "name":"IE troubleshooters", "parentId":"7"},
23 | {"id": "7_2", "name":"Javascript kiddies", "parentId":"7"},
24 | {"id": "7_3", "name":"Java masters", "parentId":"7"},
25 | {"id": "7_4", "name":"PHP people", "parentId":"7"},
26 | {"id": "9_1", "name":"Payments", "parentId":"9"},
27 | {"id": "9_2", "name":"Invoices", "parentId":"9"},
28 | {"id": "9_3", "name":"Incasso", "parentId":"9"},
29 | {"id": "10_1", "name":"Central Risk Management", "parentId":"10"},
30 | {"id": "10_6", "name":"Operational Risk Management & Control", "parentId":"10"},
31 | {"id": "11_1", "name":"Innovation", "parentId":"11"},
32 | {"id": "11_2", "name":"Technology", "parentId":"11"},
33 | {"id": "12_1", "name":"Transformation Team", "parentId":"12"},
34 | {"id": "12_2", "name":"Branding & Communications", "parentId":"12"}
35 | ]
--------------------------------------------------------------------------------
/assets/img/Screenshot1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/assets/img/Screenshot1.PNG
--------------------------------------------------------------------------------
/assets/img/Screenshot11.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/assets/img/Screenshot11.PNG
--------------------------------------------------------------------------------
/assets/img/down.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
79 |
--------------------------------------------------------------------------------
/assets/img/gh.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/img/profile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/assets/img/profile.png
--------------------------------------------------------------------------------
/components/DepartmentDetails.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | .property
4 | span.label {{uiNames.sidebar.departmentName}}
5 | br
6 | input.name(v-if='editMode' :class="{error:!activeDepartment_name}" v-model="activeDepartment_name")
7 | span(v-else).text {{activeDepartment_name}}
8 |
9 | .property
10 | span.label {{uiNames.sidebar.departmentManager}}
11 | i.material-icons.edit(v-if='editMode' v-on:click='personPicker="manager"') edit
12 | br
13 | span.text(v-if='activeDepartment.manager.name') {{activeDepartment.manager.name}}
14 | span.untext(v-else) No manager
15 | .property
16 | span.label {{uiNames.sidebar.departmentDescription}}
17 | br
18 | textarea.description(v-if='editMode' v-model="activeDepartment_description")
19 | span(v-else v-html="activeDepartment_description").text
20 |
21 | .property(v-for="field in activeDepartment.dataFields" v-if="field.value")
22 | span.label {{field.name}}
23 | br
24 | template(v-if='editMode')
25 | // todo edit extra properties
26 | templage(v-else)
27 | template(v-if='field.type==="url"')
28 | a(:href="field.value" target="_blank") Link
29 | template(v-else)
30 | span.text {{field.value}}
31 |
32 | .property
33 | template(v-if='!editMode')
34 | span.label {{uiNames.sidebar.departmentType}}
35 | br
36 | span(v-if='activeDepartment_isStaff') {{uiNames.sidebar.departmentTypeStaff}}
37 | span(v-else) {{uiNames.sidebar.departmentTypeNormal}}
38 | template(v-else)
39 | span.label Staff department:
40 | input.isstaff(type='checkbox' v-model="activeDepartment_isStaff" :disabled="!editMode")
41 | .property
42 | span.label {{uiNames.sidebar.departmentHierarchy}}
43 | ul
44 | li.clickable(v-for='(parent, pnr) in parents' v-on:click="setActiveDepartment(parent)")
45 | span(v-for="n in pnr")  
46 | i(v-if="pnr !==0").material-icons.sub subdirectory_arrow_right
47 | span {{parent.name}}
48 | li.clickable(v-on:click="setActiveDepartment(activeDepartment)")
49 | span(v-for="n in parents.length")  
50 | i(v-if="parents.length").material-icons.sub subdirectory_arrow_right
51 | span.this-department {{activeDepartment.name}}
52 | li.clickable(v-for='child in activeDepartment.children' v-on:click="setActiveDepartment(child)")
53 | span(v-for="n in parents.length+5")  
54 | span {{child.name}}
55 | img.profile(v-if='activeDepartment.manager.photo' :src='config.photoUrl.prefix+activeDepartment.manager.photo+config.photoUrl.suffix' v-on:click='visitProfile(activeDepartment.manager)' title='Goto profile')
56 | .material-icons.profile.nophoto(v-else v-on:click='visitProfile(activeDepartment.manager)' title='Goto profile') face
57 | person-picker(v-if='personPicker' type='manager' v-on:close='personPicker=null')
58 |
59 |
60 |
137 |
138 |
210 |
--------------------------------------------------------------------------------
/components/DeptBox copy.vue:
--------------------------------------------------------------------------------
1 |
2 | div(v-on:mouseenter="mouseOverBox(true)" v-on:mouseleave="mouseOverBox(false)")
3 | template(v-if="departmentData")
4 | .department( :id="'ID_'+ departmentData.id" :class="[type, active, managerPhoto]" :style="{ height: config.boxheight + 'px', width: config.boxwidth + 'px' }" @click="setActiveDepartment(departmentData, $event)" @touchend="setActiveDepartment(departmentData, $event)" v-on:contextmenu.prevent="showCtxMenu(departmentData, $event)")
5 |
6 | .level_indicator(:style="{backgroundColor:config.levelColors[level-1]||'#FFFFFF', width: config.boxwidth -80 + 'px' }")
7 |
8 |
9 |
10 | template(v-if="!managerPhotoView")
11 |
12 | template(v-if="managerNameView")
13 | .name1(v-html="departmentData.name")
14 | .name_manager(v-if="managerNameView") {{departmentData.manager.name}}
15 | template(v-else)
16 | .name2(v-html="departmentData.name")
17 |
18 | // layout of department box WITH manager photo
19 | template(v-else)
20 | table
21 | tr
22 | td
23 | img.profile(:src='config.photoUrl.prefix+departmentData.manager.photo+config.photoUrl.suffix' v-if="departmentData.manager.photo")
24 | .material-icons.nophoto(v-else) face
25 | td
26 | div.textdiv
27 | .name(v-html="departmentData.name")
28 | .name_manager(v-if="managerNameView") {{departmentData.manager.name}}
29 |
30 | template(v-if="departmentData.children.length")
31 | i.material-icons.arrow.down(v-if='!departmentData.showChildren' @click.prevent="doShowChildren(true)" @touchend.prevent="doShowChildren(true)") arrow_drop_down
32 | i.material-icons.arrow.up(v-if='departmentData.showChildren' @click.prevent="doShowChildren(false)" @touchend.prevent="doShowChildren(false)") arrow_drop_up
33 | template(v-if="showNrDepartments")
34 | div.hidden_dept.down(v-if='!departmentData.showChildren' @click.prevent="doShowChildren(true)" @touchend.prevent="doShowChildren(true)" title='Nr of subdepartments') {{departmentData.children.length}}
35 | div.hidden_dept.up(v-if='departmentData.showChildren' @click.prevent="doShowChildren(false)" @touchend.prevent="doShowChildren(false)" title='Nr of subdepartments') {{departmentData.children.length}}
36 | template(v-if="showNrPeople")
37 | div.ppl_count(v-if='departmentData.employees.length' title='Nr of people in department') {{departmentData.employees.length}}
38 |
39 | i.material-icons.view_button(v-if="displaySiblingIcon" v-on:click="showViewMenu(departmentData, $event)" title="Show/hide parents") visibility
40 | i.material-icons.hidden_parents(v-if="hiddenParents" v-on:click="setHideParents(false)" title="Show parents") more_vert
41 | template(v-if="!departmentData")
42 | .department.invisible(v-if='!managerPhotoView' :class="[type]")
43 | .department.manager_photo.invisible(v-else :class="[type]")
44 |
45 |
46 |
47 |
161 |
321 |
--------------------------------------------------------------------------------
/components/DeptBox.vue:
--------------------------------------------------------------------------------
1 |
2 | div()
3 | template(v-if="departmentData")
4 | i.material-icons.hidden_parents(v-if="hiddenParents" v-on:click="setHideParents(false)" title="Show parents") more_vert
5 | .department
6 | .col( :id="'ID_'+ departmentData.id" :class="[type, active, managerPhoto]" @click="setActiveDepartment(departmentData, $event)" @touchend="setActiveDepartment(departmentData, $event)" v-on:contextmenu.prevent="showCtxMenu(departmentData, $event)" v-on:mouseenter="mouseOverBox(true)" v-on:mouseleave="mouseOverBox(false)")
7 | i.material-icons.view_button(v-if="displaySiblingIcon" v-on:click="showViewMenu(departmentData, $event)" title="Show/hide parents") visibility
8 | table
9 | tr
10 | td.ppl_count0
11 | .ppl_count(v-if="showNrPeople")
12 | .ppl_count_nr(v-if='departmentData.employees.length' :title= "departmentData.employees.length + (departmentData.employees.length===1? ' person in this department': ' people in this department')") {{departmentData.employees.length}}
13 | td(v-if='managerPhotoView')
14 | img.profile(:src='config.photoUrl.prefix+departmentData.manager.photo+config.photoUrl.suffix' v-if="departmentData.manager.photo")
15 | .material-icons.nophoto(v-else) face
16 | td
17 | .level_indicator(:style="{backgroundColor:config.levelColors[level-1]||'#FFFFFF'}")
18 | div.textdiv(:style="{ height: config.boxHeight + 'px', width: config.boxWidth + 'px' }")
19 | .name(v-html="departmentData.name")
20 | .name_manager(v-if="managerNameView") {{departmentData.manager.name}}
21 | td.drill0
22 | .drill
23 | template(v-if="departmentData.children.length")
24 | i.material-icons.arrow.down(v-if='!departmentData.showChildren' @click.prevent="doShowChildren(true)" @touchend.prevent="doShowChildren(true)") arrow_drop_down
25 | i.material-icons.arrow.up(v-if='departmentData.showChildren' @click.prevent="doShowChildren(false)" @touchend.prevent="doShowChildren(false)") arrow_drop_up
26 | template(v-if="showNrDepartments")
27 | div.hidden_dept.down(v-if='!departmentData.showChildren' @click.prevent="doShowChildren(true)" @touchend.prevent="doShowChildren(true)" :title="departmentData.children.length + ' subdepartment' + (departmentData.children.length===1?'':'s')") {{departmentData.children.length}}
28 | div.hidden_dept.up(v-if='departmentData.showChildren' @click.prevent="doShowChildren(false)" @touchend.prevent="doShowChildren(false)" :title="departmentData.children.length + ' subdepartment' + (departmentData.children.length===1?'':'s')") {{departmentData.children.length}}
29 |
30 |
31 |
32 |
33 |
34 | template(v-if="!departmentData")
35 | .department.invisible(v-if='!managerPhotoView' :class="[type]")
36 | .department.manager_photo.invisible(v-else :class="[type]")
37 |
38 |
39 |
40 |
154 |
325 |
--------------------------------------------------------------------------------
/components/DrawLines.vue:
--------------------------------------------------------------------------------
1 |
2 | svg.graph(id='svg')
3 | path(v-for="line in lines" :d="line.d" style="stroke:#b6b4b4;stroke-width:2" fill="transparent")
4 |
5 |
6 |
16 |
26 |
--------------------------------------------------------------------------------
/components/EditConfig.vue:
--------------------------------------------------------------------------------
1 |
2 | #config_container
3 | #config
4 | h3 Configure
5 | input(type='checkbox', v-model='showHelp')
6 | span Show explanations of the options in this screen
7 |
8 | .sectiontitle Title bar settings
9 | table.tab
10 | tr
11 | td.n Title
12 | td.i
13 | input(v-model='pageTitle')
14 | tr(v-if='showHelp')
15 | td.help(colspan=2) Sets the header title
16 | tr
17 | td.n Title bar color
18 | td.i
19 | input(v-model='pageTitleColor')
20 | tr(v-if='showHelp')
21 | td.help(colspan=2) Sets the header color (#FF0000 is red for example)
22 | tr
23 | td.n Information text
24 | td.i
25 | textarea(v-model='informationText')
26 | tr(v-if='showHelp')
27 | td.help(colspan=2) Sets text to display when clicked on the (i) button (you can use HTML). Leave empty if not needed
28 | tr
29 | td.n Enable screencapture
30 | td.c
31 | input(type='checkbox', v-model='enableScreenCapture')
32 | tr(v-if='showHelp')
33 | td.help(colspan=2) This shows the icon to make an image of the graph to save. This does not work when you are on a local folder, so disable this option then
34 | tr
35 | td.n Enable user settings
36 | td.c
37 | input(type='checkbox', v-model='enableUserSettings')
38 | tr(v-if='showHelp')
39 | td.help(colspan=2) This shows the icon for the user to change the default display settings (see start up settings)
40 | tr
41 | td.n Show link to User Manual
42 | td.c
43 | input(type='checkbox', v-model='showUserManual')
44 | tr(v-if='showHelp')
45 | td.help(colspan=2) This enables the link to the user manual on the external website, and also a link to the GitHub project. Which you will see under the (i) icon at the top-right. If you do not want this, disable this option.
46 | tr
47 | td.n Edit command
48 | td.i
49 | input(v-model='editCommand')
50 | tr(v-if='showHelp')
51 | td.help(colspan=2) The command to type in the search box to switch to edit mode
52 |
53 | .sectiontitle Links settings
54 | table.tab
55 | tr
56 | td.n Photo URL prefix
57 | td.i
58 | input(v-model='photoUrlP')
59 | tr
60 | td.n Photo URL suffix
61 | td.i
62 | input(v-model='photoUrlS')
63 | tr(v-if='showHelp')
64 | td.help(colspan=2) The position where to get the photo's. For these locations it is fetched from "prefix" + photo + "suffix". So if you have photo P0001, it will be fetched from "photos/P0001.png". If you have an api or other locations which delivers photo's based on the photo field you can change that here.
65 |
66 | tr
67 | td.n Link URL prefix
68 | td.i
69 | input(v-model='linkUrlP')
70 | tr
71 | td.n Link URL suffix
72 | td.i
73 | input(v-model='linkUrlS')
74 | tr(v-if='showHelp')
75 | td.help(colspan=2) It will open a new tab to navigate to that page when clicked in the sidescreen on a person. If you have an api which shows a user profile page you can enter the location here. Keep both empty if you want to see the profile information from this application (default)
76 |
77 | .sectiontitle Department boxes
78 | table.tab
79 | tr
80 | td.n Level colors
81 | td.i
82 | input(v-model='levelColors')
83 | tr(v-if='showHelp')
84 | td.help(colspan=2) The colors of each level in the orgchart (specify comma separated)
85 | table.tab
86 | tr
87 | td.n Box width
88 | td.i
89 | input(v-model='boxWidth')
90 | tr
91 | td.n Box height
92 | td.i
93 | input(v-model='boxHeight')
94 |
95 | tr(v-if='showHelp')
96 | td.help(colspan=2) The height and width of the department boxes in the graph. Adjust if department names or people names are too long/short to properly fit
97 |
98 | .sectiontitle Person fields
99 | .help(v-if='showHelp') Add, remove, rename or move the fields of a person (Name, Employee ID and Function cannot be changed)
100 |
101 | table.tab
102 | tr
103 | td Name
104 | td (fixed field)
105 | tr
106 | td Employee ID
107 | td (fixed field)
108 | tr
109 | td Function
110 | td (fixed field)
111 |
112 | table.tab
113 | tr(v-for='(prop, i) in newProperties')
114 | td(v-bind:class='{ prop_deleted: prop.deleted }')
115 | input(
116 | type='text',
117 | v-bind:class='{ prop_deleted: prop.deleted }',
118 | v-model='prop.name'
119 | )
120 | td
121 | i.material-icons.move_icon(
122 | v-if='i !== 0',
123 | title='Move up',
124 | @click='moveProp(prop, -1)'
125 | ) expand_less
126 | td
127 | i.material-icons.move_icon(
128 | v-if='i !== newProperties.length - 1',
129 | title='Move down',
130 | @click='moveProp(prop, 1)'
131 | ) expand_more
132 | td
133 | select(v-model='prop.type')
134 | option text
135 | option url
136 | option email
137 | td
138 | button(v-if='prop.deleted', @click='prop.deleted = false') Undelete
139 | button(v-else, @click='prop.deleted = true') Delete
140 | button(@click='addProperty()') Add property
141 | button(@click='reset()') Reset
142 |
143 |
144 | .sectiontitle Startup settings
145 |
146 | table.tab
147 | tr
148 | td.n Show manager photo
149 | td.c
150 | input(type='checkbox', v-model='viewPhoto')
151 | tr
152 | td.n Show manager name
153 | td.c
154 | input(type='checkbox', v-model='viewName')
155 | tr
156 | td.n Columnview
157 | td.c
158 | input(type='checkbox', v-model='viewColumn')
159 | tr
160 | td.n Staff columnview
161 | td.c
162 | input(type='checkbox', v-model='viewStaffColumn')
163 | tr
164 | td.n Show Nr of departments
165 | td.c
166 | input(type='checkbox', v-model='viewNrDepartments')
167 | tr
168 | td.n Show Nr of people
169 | td.c
170 | input(type='checkbox', v-model='viewNrPeople')
171 |
172 | tr(v-if='showHelp')
173 | td.help(colspan=2) Sets the inital options. The user can change them in the menu bar, if 'Enable user settings' is enabled.
174 |
175 | div
176 | button.bt(@click='generate()') Generate config
177 | button.bt(@click='close()') close
178 |
179 |
180 |
512 |
695 |
--------------------------------------------------------------------------------
/components/EditMenu.vue:
--------------------------------------------------------------------------------
1 |
2 | #edit_menu
3 | div.bold {{activeDepartment.name}}
4 | div.noclick ---------------------------------------
5 | ul(v-if='moveDepartment')
6 | li(v-on:click="doMoveTo()") Paste (move under here)
7 | li(v-on:click="cancelMoveTo()") Cancel move
8 | ul(v-else)
9 | li(v-on:click="addDept()") Add department
10 | li(v-on:click="moveTo()") Cut (move to...)
11 | li.noclick ---------------------------------------
12 | li(v-on:click="cancel()") Cancel
13 | li.noclick ---------------------------------------
14 | li.delete(v-on:click="removeDept()") Delete
15 |
16 |
17 |
83 |
125 |
--------------------------------------------------------------------------------
/components/EmployeeList.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | //manager
4 | .assignment(v-on:click='visitProfile(activeDepartment.manager)' title='Goto profile')
5 | table
6 | tr
7 | td
8 | img.photo(v-if='photoURL(activeDepartment.manager)' :src='photoURL(activeDepartment.manager)' @error="markPhotoNotFound(activeDepartment.manager)")
9 | .material-icons.nophoto(v-else) face
10 | td
11 | .name
12 | span {{activeDepartment.manager.name}}
13 | .manager_role {{uiNames.sidebar.managerOfDepartment}}
14 | .hspace
15 | .nopeople(v-if='activeDepartment.employees.length ===0')
16 | span No employees
17 |
18 | template(v-else)
19 | //employees
20 | .assignment(v-for='(person, p_idx) in activeDepartment.employees' v-on:click='visitProfile(person.person)' title='Goto profile')
21 | table
22 | tr
23 | td
24 | img.photo(v-if='photoURL(person.person)' :src='photoURL(person.person)' @error="markPhotoNotFound(person)")
25 | .material-icons.nophoto(v-else) face
26 | td
27 | .name
28 | span {{person.person.name}}
29 | .role(v-if='!editMode') {{person.role}}
30 | .role(v-else)
31 | input(:value="person.role" @input="updateThisRole(person, $event)" v-on:click.stop title='Edit role')
32 | template(v-if='editMode')
33 | i.material-icons.delete(title='remove from department' v-on:click.stop='removeDeptAssignment(person)') delete
34 | button.btn(v-if='editMode' v-on:click='personPicker="person"') Add person
35 | person-picker(v-if='personPicker' :type='personPicker' v-on:close='personPicker=null')
36 |
37 |
38 |
99 |
100 |
175 |
--------------------------------------------------------------------------------
/components/FileMenu.vue:
--------------------------------------------------------------------------------
1 |
2 | .file(v-on:click='editMenuOpen = !editMenuOpen')
3 | i.material-icons.screenshot(v-on:click="" title='Load/Save/Config') save
4 | .file_menu(v-if='editMenuOpen')
5 | ul
6 | li
7 | label.file_select(v-on:click="editMenuOpen=!editMenuOpen" @click="uploadfile") Import excel
8 | // input(ref='fileinput1' type="file" @change="importData1")
9 | li(v-on:click="doExportXls") Export excel
10 | li(v-on:click="generateInputFile") Generate inputfile
11 | li(v-on:click="editConfig") Configure options
12 |
13 |
14 |
15 |
329 |
330 |
381 |
--------------------------------------------------------------------------------
/components/OptionsMenu.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | .file(v-on:click='editMenuOpen = !editMenuOpen')
4 | i.material-icons.settings(v-on:click="" title='Set options') settings
5 | .file_menu(v-if='editMenuOpen')
6 | ul
7 | li
8 | input(type="checkbox" id="checkbox" v-model="columnView" )
9 | label(for="checkbox") Column view
10 | li
11 | span    
12 | input(type="checkbox" id="checkbox3" v-model="columnView_noStaff")
13 | label(for="checkbox3") Exclude staff dept
14 | li
15 | input(type="checkbox" id="checkbox1" v-model="managerNameView")
16 | label(for="checkbox1") Show manager name
17 | li
18 | input(type="checkbox" id="checkbox4" v-model="managerPhotoView")
19 | label(for="checkbox4") Show manager photo
20 | li
21 | input(type="checkbox" id="checkbox5" v-model="showNrDepartments")
22 | label(for="checkbox5") Show nr of subdepartments
23 | li
24 | input(type="checkbox" id="checkbox6" v-model="showNrPeople")
25 | label(for="checkbox6") Show nr of people in dept.
26 |
27 |
28 |
29 |
30 |
126 |
127 |
174 |
--------------------------------------------------------------------------------
/components/OrgChart.vue:
--------------------------------------------------------------------------------
1 |
2 | #chart
3 | .chart_container
4 | show-dept(v-if="chart" :parent="chart" :level="1")
5 | draw-lines(v-if="chart")
6 | view-menu(v-if="showViewMenu")
7 |
8 |
9 |
71 |
106 |
--------------------------------------------------------------------------------
/components/PageHeader.vue:
--------------------------------------------------------------------------------
1 |
2 | .header(:style='{ backgroundColor: config.title.color }') {{ config.title.text }}
3 | .edit_indicator(
4 | v-if='editMode',
5 | v-on:click='$store.commit("setEditMode", false)'
6 | ) Click to leave editmode
7 | search-box
8 | .menu
9 | file-menu(v-if='editMode', @editconfig='editConfig = true')
10 | options-menu(v-if='config.enableUserSettings')
11 | .home1
12 | a(href='/')
13 | i.material-icons.home(v-on:click='capture', title='Home') home
14 | .screenshot1(v-if='config.enableScreenCapture')
15 | i.material-icons.screenshot(
16 | v-on:click='capture',
17 | title='Save as image'
18 | ) photo_camera
19 | .info(v-if='config.information')
20 | i.material-icons.info_icon(
21 | v-on:click='infoOpen = !infoOpen',
22 | title='Contact and help'
23 | ) info
24 | .info-text(v-if='infoOpen')
25 | i.material-icons.info-close(v-on:click='infoOpen = false') close
26 | .i-text(v-html='config.information')
27 | .updated_info Updated on: {{ updatedOn }}
28 | div(v-if='config.showUserManual')
29 | hr
30 | a(
31 | href='https://freeorgchart.netlify.app/#faq',
32 | target='_blank'
33 | )
34 | .i-github
35 | .i-github-text User manual
36 | a(
37 | href='https://github.com/Hoogkamer/vue-org-chart',
38 | target='_blank'
39 | )
40 | img.gh(
41 | src='~/assets/img/gh.svg',
42 | title='Go to Github project page'
43 | )
44 | edit-config(v-if='editConfig', @close='editConfig = false')
45 |
46 |
47 |
120 |
121 |
233 |
--------------------------------------------------------------------------------
/components/PersonPicker.vue:
--------------------------------------------------------------------------------
1 |
2 | #person_picker
3 | i.material-icons.close(v-on:click='close') close
4 | .vspace
5 | .nextline Search existing person
6 | input.search_input(v-model='searchField' placeholder='Search...')
7 | #search_results(v-if="searchField.length")
8 | ul
9 | li(v-if="searchresults.length" v-for="result in searchresults" v-on:click="selectPerson(result)") {{result.name}}
10 | .vspace
11 | .nextline or
12 | .addnew
13 | button.btn(@click='registerNew()') Add new person
14 |
15 |
16 |
17 |
90 |
174 |
--------------------------------------------------------------------------------
/components/README.md:
--------------------------------------------------------------------------------
1 | # COMPONENTS
2 |
3 | **This directory is not required, you can delete it if you don't want to use it.**
4 |
5 | The components directory contains your Vue.js Components.
6 |
7 | _Nuxt.js doesn't supercharge these components._
8 |
--------------------------------------------------------------------------------
/components/SearchBox.vue:
--------------------------------------------------------------------------------
1 |
2 | #search_div
3 | input.search_input(v-model='searchField' placeholder='Search department or person...')
4 | #search_results(v-if="searchField.length")
5 | ul
6 | li(v-if="searchresults.length" v-for="result in searchresults" v-on:click="findDept(result)")
7 | .name {{result.name}}
8 | .parent(v-if="result.context") {{result.context}}
9 |
10 |
11 |
87 |
141 |
--------------------------------------------------------------------------------
/components/ShowDept.vue:
--------------------------------------------------------------------------------
1 |
2 | .container
3 | table
4 | template(v-if="!staffChildren.length")
5 | tr
6 | td
7 | dept-box(:department-data="parent" :level="level" type='normal')
8 | template(v-if="columnView && (!parent.parent || parent.parent.showChildren) && !parent.showChildren")
9 | table(v-if="!(parent.isStaff && columnView_noStaff)")
10 | tr( v-for="child in parent.children")
11 | td
12 | dept-box(:department-data="child" :level="level+1" type='column')
13 | template(v-else)
14 | tr(rowspan="2")
15 | td
16 | td.dept
17 | dept-box(:department-data="parent" :level="level" type='normal')
18 | template(v-if="columnView && (!parent.parent || parent.parent.showChildren) && !parent.showChildren")
19 | table(v-if="!(parent.isStaff && columnView_noStaff)")
20 | tr( v-for="child in parent.children")
21 | td
22 | dept-box(:department-data="child" :level="level+1" type='column')
23 |
24 | td
25 | tr(v-if="parent.showChildren")
26 | td
27 | div.staff-left
28 | table
29 | tr(v-for="staff in staffChildren")
30 | td
31 | show-dept(:parent="staff.left" :level="level+1")
32 | td.dept
33 | td
34 | div.staff-right
35 | table
36 | tr(v-for="staff in staffChildren")
37 | td
38 | show-dept(v-if="staff.right" :parent="staff.right" :level="level+1")
39 | table.tabchildren
40 | tr(v-if="parent.showChildren")
41 | td.tabchild(v-for="child in hierarchyChildren")
42 | show-dept(:parent="child" :level="level+1")
43 |
44 |
45 |
46 |
102 |
166 |
--------------------------------------------------------------------------------
/components/ShowPerson.vue:
--------------------------------------------------------------------------------
1 |
2 | #person_details_container
3 | #person_details
4 | i.material-icons.close(@click='setShowPerson(null)') close
5 | .personname(v-if="showPerson.name") {{showPerson.name}}
6 | .personname(v-else) Add new employee
7 | .content
8 | .photo
9 | img.im(v-if="photoUrl" :src='photoUrl' @error="markPhotoNotFound(showPerson)")
10 | .material-icons.nophoto(v-else) face
11 | template(v-if='editMode')
12 | span.prop Photo id
13 | input.val1(v-model='employeePhoto')
14 | .details
15 | table.tab
16 | template(v-if='config.linkUrl')
17 | tr
18 | td(colspan="2").btn
19 | button(@click='gotoExtProfile(showPerson)') Open profile information
20 | template(v-else)
21 | tr
22 | template(v-if='!editMode')
23 | td.prop {{uiNames.person.name}}
24 | td.val {{employeeName}}
25 | template(v-else)
26 | td.prop.must {{uiNames.person.name}}*
27 | td.val
28 | input.val1(v-model='employeeName')
29 | tr
30 | template(v-if='!editMode')
31 | td.prop {{uiNames.person.id}}
32 | td.val {{employeeID}}
33 | template(v-else)
34 | td.prop.must {{uiNames.person.id}}*
35 | td.val
36 | input.val1(v-model='employeeID')
37 | tr
38 | td.prop {{uiNames.person.function}}
39 | td.val(v-if='!editMode') {{employeeFunctionName}}
40 | td.val(v-else)
41 | input.val1(v-model='employeeFunctionName')
42 |
43 | tr(v-for="prop in config.personProperties")
44 | td.prop {{prop.name}}
45 | td
46 | template(v-if='!editMode')
47 | a(v-if='prop.type=="url"' :href="getPropName(prop)" target="_blank") {{getPropName(prop)}}
48 | a(v-else-if='prop.type=="email"' :href = '"mailto: "+ getPropName(prop)') {{getPropName(prop)}}
49 | span(v-else) {{getPropName(prop)}}
50 | template(v-else)
51 | input(type="text" :value="getPropName(prop)" @input="setPropName(prop, $event.target.value)")
52 |
53 |
54 | tr(v-if="!showPerson.new")
55 | td.prop {{uiNames.person.departments}}
56 | td.val
57 | .dep(v-for='assignment in personAssignments' @click='gotoDepartment(assignment.department)')
58 | span {{assignment.department.name}}
59 | span.role {{assignment.role}}
60 | div
61 | button.btn1(v-if="showPerson.new" @click='addEmployee(showPerson)' :disabled='!employeeID || !employeeName') ADD
62 | button.btn2(v-if="editMode" @click='deleteEmployee1(showPerson)' title='Removes the user from all departments and completely deletes the user') Delete this user
63 |
64 |
65 |
66 |
199 |
336 |
--------------------------------------------------------------------------------
/components/SideScreen.vue:
--------------------------------------------------------------------------------
1 |
2 | .side-screen(v-if="showSideScreen")
3 | button.right(v-on:click="$store.commit('closeSideScreen')")
4 | i.material-icons.arrow keyboard_arrow_left
5 | template(v-if="activeDepartment")
6 | .title {{activeDepartment.name}}
7 | .tabs
8 | button.tab(:class='{active:activeTab===1}' v-on:click='activeTab=1') {{uiNames.sidebar.detailTabName}}
9 | button.tab(:class='{active:activeTab===2}' v-on:click='activeTab=2') {{uiNames.sidebar.peopleTabName}}
10 | department-details(v-if="activeTab===1")
11 | employee-list(v-if='activeTab===2')
12 |
13 | .noside-screen(v-else)
14 | button.right(v-on:click="$store.commit('openSideScreen')")
15 | i.material-icons.arrow keyboard_arrow_right
16 |
17 |
18 |
47 |
48 |
129 |
--------------------------------------------------------------------------------
/components/ViewMenu.vue:
--------------------------------------------------------------------------------
1 |
2 | #view_menu
3 | ul
4 | li(v-if="activeDepartment.showParents" v-on:click="hideParents(true)") Hide parents
5 | li(v-else v-on:click="hideParents(false)") Show parents
6 | // disable hide siblings options, because too confusing
7 | li( v-if="false" v-on:click="hideSiblings()") Toggle siblings
8 | li(v-on:click="onlyParents()") Toggle only parents
9 |
10 |
11 |
53 |
82 |
--------------------------------------------------------------------------------
/deploy_linux.bat:
--------------------------------------------------------------------------------
1 | npm run generate
2 | rm -r docs
3 | cp -r dist docs
4 |
5 | # bug in nuxt https://github.com/nuxt/nuxt.js/issues/8906
6 | # replace absolute paths by relative paths
7 |
8 | sed -i 's/e.p+"fonts/".\/fonts/g' docs/*.js
9 | sed -i 's/n.p+"fonts/".\/fonts/g' docs/*.js
10 | sed -i 's/src="\//src=".\//g' docs/index.html
11 |
12 | rm orgchart.zip
13 | zip -r orgchart.zip docs
14 | git add *
15 | git commit -am "update"
16 | git push
--------------------------------------------------------------------------------
/docs/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/docs/.nojekyll
--------------------------------------------------------------------------------
/docs/200.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Organization chart
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/docs/LICENSES:
--------------------------------------------------------------------------------
1 | /*!
2 | * The buffer module from node.js, for the browser.
3 | *
4 | * @author Feross Aboukhadijeh
5 | * @license MIT
6 | */
7 |
8 | /*!
9 | * html2canvas 1.4.1
10 | * Copyright (c) 2022 Niklas von Hertzen
11 | * Released under MIT License
12 | */
13 |
14 | /*! *****************************************************************************
15 | Copyright (c) Microsoft Corporation.
16 |
17 | Permission to use, copy, modify, and/or distribute this software for any
18 | purpose with or without fee is hereby granted.
19 |
20 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
21 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
22 | AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
23 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
24 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
25 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
26 | PERFORMANCE OF THIS SOFTWARE.
27 | ***************************************************************************** */
28 |
29 | /*! cpexcel.js (C) 2013-present SheetJS -- http://sheetjs.com */
30 |
31 | /*! cputils.js (C) 2013-present SheetJS -- http://sheetjs.com */
32 |
33 | /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */
34 |
35 | /*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
36 |
37 |
38 | /*!
39 | * vue-client-only v0.0.0-semantic-release
40 | * (c) 2021-present egoist <0x142857@gmail.com>
41 | * Released under the MIT License.
42 | */
43 |
44 | /*!
45 | * vue-no-ssr v1.1.1
46 | * (c) 2018-present egoist <0x142857@gmail.com>
47 | * Released under the MIT License.
48 | */
49 |
50 | /**
51 | * @license
52 | * Lodash
53 | * Copyright OpenJS Foundation and other contributors
54 | * Released under MIT license
55 | * Based on Underscore.js 1.8.3
56 | * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
57 | */
58 |
59 |
60 | /*!
61 | * Vue.js v2.7.14
62 | * (c) 2014-2022 Evan You
63 | * Released under the MIT License.
64 | */
65 |
66 | /*!
67 | * vuex v3.6.2
68 | * (c) 2021 Evan You
69 | * @license MIT
70 | */
71 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | # STATIC
2 |
3 | **This directory is not required, you can delete it if you don't want to use it.**
4 |
5 | This directory contains your static files.
6 | Each file inside this directory is mapped to `/`.
7 |
8 | Example: `/static/robots.txt` is mapped as `/robots.txt`.
9 |
10 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#static).
11 |
--------------------------------------------------------------------------------
/docs/config.js:
--------------------------------------------------------------------------------
1 | var CONFIG = {"enableUserSettings":true,"showUserManual":true,"title":{"color":"#05668d","text":"Interactive organization chart"},"information":"Do you see something wrong? Please drop a mail to someone@example.com","photoUrl":{"prefix":"photos/","suffix":".png"},"startView":{"photos":true,"names":true,"columnview":true,"staffColumnview":false,"showNrDepartments":true,"showNrPeople":true},"enableScreenCapture":true,"levelColors":["#0c058d","#05668d","#8d6e05","#8d2305","#cfb303"],"editCommand":"_edit","dataFields":[{"name":"Location","type":"text"}],"personProperties":[{"name":"Phone","type":"text","order":0},{"name":"Email","type":"email","order":1},{"name":"Homepage","type":"url","order":2},{"name":"Country","type":"text","order":3},{"name":"City","type":"text","order":4},{"name":"Street","type":"text","order":5}]}
--------------------------------------------------------------------------------
/docs/data.js:
--------------------------------------------------------------------------------
1 | var INPUT_DATA={"api_version":"2.0","chart":{"id":"1","name":"Software BV","description":"","parent_id":"","staff_department":"N","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"2","name":"Office","description":"","parent_id":"1","staff_department":"Y","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":true},{"id":"3","name":"Communication","description":"","parent_id":"1","staff_department":"Y","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"2b5f3900-b816-b42a-f272-b9ae0ca0ab83","name":"comteam1","description":"","parent_id":"3","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"4","name":"Strategy & Sustainability","description":"","parent_id":"1","staff_department":"Y","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5","name":"Desktop Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"5_1","name":"Business customers","description":"","parent_id":"5","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"5_1_0","name":"Business Office","description":"","parent_id":"5_1","staff_department":"Y","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_1","name":"Front end team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_2","name":"Back end team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_3","name":"Api team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"5_2","name":"Private Customer","description":"","parent_id":"5","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"6","name":"Mobile Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"6_1","name":"Android","description":"","parent_id":"6","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"6_2","name":"IOS","description":"The IOS department creates and maintains applications for Apple phones and tablets","parent_id":"6","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"7","name":"Web Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"7_1","name":"IE troubleshooters","description":"","parent_id":"7","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_2","name":"Javascript kiddies","description":"","parent_id":"7","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_3","name":"Java masters","description":"","parent_id":"7","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_4","name":"PHP people","description":"","parent_id":"7","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"9","name":"Finance","description":"","parent_id":"1","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"9_1","name":"Payments","description":"","parent_id":"9","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"9_2","name":"Invoices","description":"","parent_id":"9","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"9_3","name":"Incasso","description":"","parent_id":"9","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"6_3","name":"Other","description":"","parent_id":"9","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"e6d71ac8-39c2-c334-4323-0688c96311f1","name":"new department type","description":"","parent_id":"6_3","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"09a54438-5ef2-2295-b019-b18b922ed741","name":"subsub","description":"","parent_id":"e6d71ac8-39c2-c334-4323-0688c96311f1","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"50a97250-a02f-20de-4749-89103c1e40e6","name":"safsf","description":"","parent_id":"e6d71ac8-39c2-c334-4323-0688c96311f1","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false}],"showChildren":false}],"showChildren":false},{"id":"10","name":"Risk Management","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"10_1","name":"Central Risk Management","description":"","parent_id":"10","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"10_6","name":"Operational Risk Management & Control","description":"","parent_id":"10","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"11","name":"Innovation & Technology","description":"","parent_id":"1","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"11_1","name":"Innovation","description":"","parent_id":"11","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"11_2","name":"Technology","description":"","parent_id":"11","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"12","name":"Human Resources","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"12_1","name":"Transformation Team","description":"","parent_id":"12","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"12_2","name":"Branding & Communications","description":"","parent_id":"12","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false}],"showChildren":true},"people":[{"id":"B01","name":"Big Boss","photo":"B01","functionName":"chief executive officer","fields":{"Email":"bigbos@someaddress.nl","Phone":"0345-394930203","Homepage":"nu.nl","Country":"Netherlands","City":"Amsterdam","Street":"Kalverstraat 1"}},{"id":"B03","name":"Mo Ney","photo":"B03","functionName":"CFO","fields":{"Email":"","Phone":"0345-394930204","Homepage":"linkedin.com","Country":"Netherlands","City":"Amsterdam","Street":"Vijzelstraat 143a"}},{"id":"B02","name":"S. Talker","photo":"B02","functionName":"HR","fields":{"Email":"","Phone":"0345-394930205","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Amsterdam","Street":"Molenstraat 6"}},{"id":"df","name":"Big Boss1","photo":"","functionName":"","fields":{"Email":"","Phone":"0345-394930206","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Amsterdam","Street":"Kerkwerg 15"}},{"id":"B05","name":"Mr x","photo":"B05","functionName":"","fields":{"Email":"MRX@somecomplany.mail","Phone":"0345-394930207","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Utrecht","Street":"Dorpstraat 9"}},{"id":"B04","name":"Mr y","photo":"B04","functionName":"CIO","fields":{"Email":"","Phone":"0345-394930208","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Utrecht","Street":"Stationslaan 88"}},{"id":"44","name":"michael","photo":"","functionName":"","fields":{"Email":"","Phone":"0345-394930209","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Utrecht","Street":"Het verdun 5"}},{"name":"asdfasdf","id":"asdfasdf","manager":true,"photo":"","functionName":"","fields":{"Email":"","Phone":"","Homepage":"","Country":"","City":"","Street":""}},{"name":"asdfasdfasd","id":"fasddfasdf","manager":true,"photo":"","functionName":"","fields":{"Email":"","Phone":"","Homepage":"","Country":"","City":"","Street":""}},{"name":"jantje","id":"al;skdj;lasdjf","manager":false,"photo":"","functionName":"","fields":{"Email":"","Phone":"","Homepage":"","Country":"","City":"","Street":""}},{"name":"mrnew","id":"mrnew","photo":"","functionName":"","fields":{"Email":"","Phone":"","Homepage":"","Country":"","City":"","Street":""}}],"assignments":[{"department_id":"6_2","id":0,"person_id":"B01","role":"strategy consultanting"},{"department_id":"6_2","id":1,"person_id":"B03","role":"scrum master"},{"department_id":"6_2","id":4,"person_id":"B05","role":"ux/ui designer"},{"department_id":"6_2","id":5,"person_id":"B04","role":"new tester"},{"department_id":"6_2","id":6,"person_id":"44","role":"tester"},{"department_id":"5","id":9,"person_id":"al;skdj;lasdjf","role":""},{"department_id":"6_2","id":10,"person_id":"mrnew","role":"new job"}]};var UPDATED_ON="13-09-2020"
--------------------------------------------------------------------------------
/docs/e8cd43a.js:
--------------------------------------------------------------------------------
1 | !function(e){function r(data){for(var r,n,l=data[0],f=data[1],d=data[2],i=0,h=[];i
2 |
3 |
4 | Organization chart
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/docs/photos/B01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/docs/photos/B01.png
--------------------------------------------------------------------------------
/docs/photos/B02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/docs/photos/B02.png
--------------------------------------------------------------------------------
/docs/photos/B03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/docs/photos/B03.png
--------------------------------------------------------------------------------
/docs/photos/B04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/docs/photos/B04.png
--------------------------------------------------------------------------------
/docs/photos/B05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/docs/photos/B05.png
--------------------------------------------------------------------------------
/docs/testfiles/config v1.js:
--------------------------------------------------------------------------------
1 | var CONFIG = {"title":{"color":"#05668d","text":"Interactive organization chart"},"information":"Do you see something wrong? Please drop a mail to someone@example.com","photoUrl":{"prefix":"photos/","suffix":".png"},"startView":{"photos":true,"names":true,"columnview":true,"staffColumnview":false,"showNrDepartments":true,"showNrPeople":true},"enableScreenCapture":true,"levelColors":["#0c058d","#05668d","#8d6e05","#8d2305","#cfb303"],"editCommand":"_edit","dataFields":[{"name":"Location","type":"text"}]}
--------------------------------------------------------------------------------
/docs/testfiles/config_default.js:
--------------------------------------------------------------------------------
1 | var CONFIG = {
2 | // You can set the header color and title,
3 | title: {
4 | color: '#05668d',
5 | text: 'Interactive organization chart'
6 | },
7 |
8 | // provide text to display when clicked on the (i) button (you can use HTML). Leave empty if not needed
9 | information:
10 | 'Do you see something wrong? Please drop a mail to someone@example.com',
11 |
12 | // The position where to get the photo's
13 | // For these locations it is fetched from "prefix" + photo + "suffix".
14 | // So if you have photo P0001, it will be fetched from "photos/P0001.png".
15 | // If you have an api or other locations which delivers photo's based on the photo field you can change that here.
16 | photoUrl: {
17 | prefix: 'photos/',
18 | suffix: '.png'
19 | },
20 |
21 | // It will open a new tab to navigate to that page when clicked in the sidescreen on a person.
22 | // If you have an api which shows a user profile page you can enter the location here.
23 | // Don't specify this object if you want to see the profile information from this application (default)
24 | //linkUrl: {
25 | // prefix: 'photos/',
26 | // suffix: '.png'
27 | //},
28 |
29 | // Sets the inital options (the user can change them in the menu bar)
30 | startView: {
31 | photos: true,
32 | names: true,
33 | columnview: true,
34 | staffColumnview: false,
35 | showNrDepartments: true,
36 | showNrPeople: true
37 | },
38 |
39 | //This shows the icon to make an image of the graph to save.
40 | //This does not work when you are on a local folder, so disable this option then
41 | enableScreenCapture: true,
42 |
43 | //The colors of each level in the orgchart
44 | levelColors: [
45 | '#0c058d',
46 | '#05668d',
47 | '#8d6e05',
48 | '#8d2305',
49 | '#cfb303'
50 | ],
51 |
52 | // the command to type in the searchbar to switch to edit mode
53 | editCommand: '_edit',
54 | dataFields: [{ name: 'Location', type: 'text' }]
55 | }
56 |
--------------------------------------------------------------------------------
/docs/testfiles/data v1.js:
--------------------------------------------------------------------------------
1 | var INPUT_DATA={"api_version":"1.0","chart":{"id":"1","name":"Software BV","description":"","parent_id":"","staff_department":"N","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"2","name":"Office","description":"","parent_id":"1","staff_department":"Y","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"01268004-f249-5d93-41e4-c23947f11a62","name":"team 0","description":"","parent_id":"2","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"a798e6cf-0b58-067e-44ef-237f3b3b253a","name":"team 1","description":"","parent_id":"2","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"3","name":"Communication","description":"","parent_id":"1","staff_department":"Y","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"2b5f3900-b816-b42a-f272-b9ae0ca0ab83","name":"comteam1","description":"","parent_id":"3","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"4","name":"Strategy & Sustainability","description":"","parent_id":"1","staff_department":"Y","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5","name":"Desktop Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"5_1","name":"Business customers","description":"","parent_id":"5","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"5_1_0","name":"Business Office","description":"","parent_id":"5_1","staff_department":"Y","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_1","name":"Front end team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_2","name":"Back end team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_3","name":"Api team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"5_2","name":"Private Customer","description":"","parent_id":"5","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"6","name":"Mobile Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"6_1","name":"Android","description":"","parent_id":"6","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"6_2","name":"IOS","description":"The IOS department creates and maintains applications for Apple phones and tablets","parent_id":"6","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":true},{"id":"7","name":"Web Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"7_1","name":"IE troubleshooters","description":"","parent_id":"7","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_2","name":"Javascript kiddies","description":"","parent_id":"7","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_3","name":"Java masters","description":"","parent_id":"7","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_4","name":"PHP people","description":"","parent_id":"7","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"9","name":"Finance","description":"","parent_id":"1","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"9_1","name":"Payments","description":"","parent_id":"9","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"9_2","name":"Invoices","description":"","parent_id":"9","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"9_3","name":"Incasso","description":"","parent_id":"9","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"6_3","name":"Other","description":"","parent_id":"9","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"e6d71ac8-39c2-c334-4323-0688c96311f1","name":"new department type","description":"","parent_id":"6_3","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"09a54438-5ef2-2295-b019-b18b922ed741","name":"subsub","description":"","parent_id":"e6d71ac8-39c2-c334-4323-0688c96311f1","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"50a97250-a02f-20de-4749-89103c1e40e6","name":"safsf","description":"","parent_id":"e6d71ac8-39c2-c334-4323-0688c96311f1","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false}],"showChildren":false}],"showChildren":false},{"id":"10","name":"Risk Management","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"10_1","name":"Central Risk Management","description":"","parent_id":"10","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"10_6","name":"Operational Risk Management & Control","description":"","parent_id":"10","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"11","name":"Innovation & Technology","description":"","parent_id":"1","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"11_1","name":"Innovation","description":"","parent_id":"11","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"11_2","name":"Technology","description":"","parent_id":"11","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"12","name":"Human Resources","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"12_1","name":"Transformation Team","description":"","parent_id":"12","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"12_2","name":"Branding & Communications","description":"","parent_id":"12","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false}],"showChildren":true},"people":[{"id":"B01","name":"Big Boss","photo":"B01","main_role":"","function":"a","homepage":"nu.nl","street":"Kalverstraat 1","email":"bigbos@someaddress.nl","phone":"0345-394930203","country":"Netherlands","city":"Amsterdam","functionName":"chief executive officer"},{"id":"B03","name":"Mo Ney","photo":"B03","main_role":"","function":"","homepage":"linkedin.com","street":"Vijzelstraat 143a","email":"","phone":"0345-394930204","country":"Netherlands","city":"Amsterdam","functionName":"CFO"},{"id":"B02","name":"S. Talker","photo":"B02","main_role":"","function":"","homepage":"https://www.linkedin.com/company/philips/","street":"Molenstraat 6","email":"","phone":"0345-394930205","country":"Netherlands","city":"Amsterdam","functionName":"HR"},{"id":"df","name":"Big Boss1","photo":"","main_role":"","function":"","homepage":"https://www.linkedin.com/company/philips/","street":"Kerkwerg 15","email":"","phone":"0345-394930206","country":"Netherlands","city":"Amsterdam","functionName":""},{"id":"B05","name":"Mr x","photo":"B05","main_role":"","function":"","homepage":"https://www.linkedin.com/company/philips/","street":"Dorpstraat 9","email":"MRX@somecomplany.mail","phone":"0345-394930207","country":"Netherlands","city":"Utrecht","functionName":""},{"id":"B04","name":"Mr y","photo":"B04","main_role":"","function":"","homepage":"https://www.linkedin.com/company/philips/","street":"Stationslaan 88","email":"","phone":"0345-394930208","country":"Netherlands","city":"Utrecht","functionName":"CIO"},{"id":"44","name":"michael","photo":"","main_role":"","function":"web","homepage":"https://www.linkedin.com/company/philips/","street":"Het verdun 5","email":"","phone":"0345-394930209","country":"Netherlands","city":"Utrecht","functionName":""},{"name":"asdfasdf","id":"asdfasdf","manager":true,"photo":"","email":"","phone":"","country":"","city":"","street":"","functionName":"","homepage":""},{"name":"asdfasdfasd","id":"fasddfasdf","manager":true,"photo":"","email":"","phone":"","country":"","city":"","street":"","functionName":"","homepage":""},{"name":"jantje","id":"al;skdj;lasdjf","manager":false,"photo":"","email":"","phone":"","country":"","city":"","street":"","functionName":"","homepage":""},{"name":"mrnew","id":"mrnew","photo":"","email":"","phone":"","country":"","city":"","street":"","functionName":"","homepage":""}],"assignments":[{"department_id":"6_2","id":0,"person_id":"B01","role":"strategy consultanting"},{"department_id":"6_2","id":1,"person_id":"B03","role":"scrum master"},{"department_id":"6_2","id":4,"person_id":"B05","role":"ux/ui designer"},{"department_id":"6_2","id":5,"person_id":"B04","role":"new tester"},{"department_id":"6_2","id":6,"person_id":"44","role":"tester"},{"department_id":"5","id":9,"person_id":"al;skdj;lasdjf","role":""},{"department_id":"6_2","id":10,"person_id":"mrnew","role":"new job"}]};var UPDATED_ON="28-07-2020"
--------------------------------------------------------------------------------
/docs/translate.js:
--------------------------------------------------------------------------------
1 | var UINAMES = {
2 | person: {
3 | name: 'Name',
4 | function: 'Function',
5 | id: 'Employee ID',
6 | departments: 'Departments'
7 | },
8 | sidebar: {
9 | detailTabName: 'Details',
10 | peopleTabName: 'People',
11 | departmentName: 'Name',
12 | departmentManager: 'Manager',
13 | departmentDescription: 'Description',
14 | departmentType: 'Department type',
15 | departmentHierarchy: 'Hierarchy',
16 | departmentTypeStaff: 'Staff department',
17 | departmentTypeNormal: 'Normal department',
18 | managerOfDepartment: 'Manager of department'
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/layouts/README.md:
--------------------------------------------------------------------------------
1 | # LAYOUTS
2 |
3 | **This directory is not required, you can delete it if you don't want to use it.**
4 |
5 | This directory contains your Application Layouts.
6 |
7 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/views#layouts).
8 |
--------------------------------------------------------------------------------
/layouts/default.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
56 |
--------------------------------------------------------------------------------
/middleware/README.md:
--------------------------------------------------------------------------------
1 | # MIDDLEWARE
2 |
3 | **This directory is not required, you can delete it if you don't want to use it.**
4 |
5 | This directory contains your application middleware.
6 | The middleware lets you define custom function to be ran before rendering a page or a group of pages (layouts).
7 |
8 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing#middleware).
9 |
--------------------------------------------------------------------------------
/nuxt 2.4 update if problems.txt:
--------------------------------------------------------------------------------
1 | rm -rf node_modules package-lock.json
2 | # you may or may not need to do a full npm cache clean - I did in my case
3 | npm cache clean --force
4 | npm install webpack@4.28.4 --save-dev --save-exact
5 | npm install acorn-dynamic-import@4.0.0 --save-dev
6 | npm install acorn@6.0.5 --save-dev
7 | npm i
8 | npm update acorn --depth 20
9 | npm dedupe
--------------------------------------------------------------------------------
/nuxt.config.generate.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | ...require('./nuxt.config'),
3 | ...{
4 | build: {
5 | publicPath: '.'
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/nuxt.config.js:
--------------------------------------------------------------------------------
1 | const pkg = require('./package')
2 |
3 | module.exports = {
4 | target: 'static',
5 | ssr: false,
6 | // change router for github pages
7 | router: { mode: 'hash' },
8 | /*
9 | ** Headers of the page
10 | */
11 |
12 | head: {
13 | title: 'Organization chart',
14 | meta: [
15 | { charset: 'utf-8' },
16 | {
17 | name: 'viewport',
18 | content: 'width=device-width, initial-scale=1'
19 | },
20 | {
21 | hid: 'description',
22 | name: 'description',
23 | content: 'Free Organization Chart generator and viewer'
24 | },
25 | {
26 | hid: 'keywords',
27 | name: 'keywords',
28 | content:
29 | 'vuejs, nuxt, javascript, orgchart, organization, open-source'
30 | },
31 | {
32 | name: 'google-site-verification',
33 | content: 'faMBWsCcw7RZQp1wVNh-Hgy7aQ8D2KMMNpwg0LKtsu4'
34 | }
35 | ],
36 | script: [
37 | {
38 | src: 'data.js'
39 | },
40 | { src: 'config.js' },
41 | { src: 'translate.js' }
42 | ],
43 | link: [
44 | { rel: 'icon', type: 'image/x-icon', href: './favicon.ico' }
45 | ]
46 | },
47 |
48 | /*
49 | ** Customize the progress-bar color
50 | */
51 | loading: { color: '#fff' },
52 |
53 | loadingIndicator: {
54 | name: 'circle',
55 | color: '#05668d',
56 | background: 'white'
57 | },
58 | /*
59 | ** Global CSS
60 | */
61 | css: ['~/assets/css/main.css'],
62 |
63 | /*
64 | ** Plugins to load before mounting the App
65 | */
66 | plugins: ['~/plugins/AsyncComputed'],
67 |
68 | /*
69 | ** Nuxt.js modules
70 | */
71 |
72 | modules: ['nuxt-material-design-icons'],
73 |
74 | /*
75 | ** Build configuration
76 | */
77 | build: {},
78 | builder: {
79 | /*
80 | ** You can extend webpack config here
81 | */
82 |
83 | plugins: [],
84 | extend(config, ctx) {
85 | // Run ESLint on save
86 | if (ctx.isDev && ctx.isClient) {
87 | config.module.rules.push({
88 | enforce: 'pre',
89 | test: /\.(js|vue)$/,
90 | loader: 'eslint-loader',
91 | exclude: /(node_modules)/
92 | })
93 | }
94 | }
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/orgchart.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/orgchart.zip
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vueOrgChart",
3 | "version": "1.0.0",
4 | "description": "Organization chart",
5 | "author": "Michael Hoogkamer",
6 | "private": true,
7 | "scripts": {
8 | "dev": "nuxt",
9 | "build": "nuxt build",
10 | "start": "nuxt start",
11 | "generate": "nuxt generate -c nuxt.config.generate.js",
12 | "lint": "eslint --ext .js,.vue --ignore-path .gitignore .",
13 | "precommit": "npm run lint",
14 | "build:gh-pages": "cross-env DEPLOY_ENV=GH_PAGES nuxt build",
15 | "generate:gh-pages": "cross-env DEPLOY_ENV=GH_PAGES nuxt generate"
16 | },
17 | "dependencies": {
18 | "array-from-polyfill": "^1.0.1",
19 | "eventsource": "^1.1.2",
20 | "file-saver": "^2.0.0",
21 | "html2canvas": "^1.0.0-alpha.12",
22 | "lodash": "^4.17.19",
23 | "nodemon": "^2.0.4",
24 | "nuxt": "^2.15.7",
25 | "nuxt-material-design-icons": "^1.0.4",
26 | "panzoom": "^7.1.2",
27 | "pug": "^3.0.1",
28 | "pug-plain-loader": "^1.0.0",
29 | "vue-async-computed": "^3.5.2",
30 | "xlsx": "^0.17.0"
31 | },
32 | "devDependencies": {
33 | "acorn": "^6.4.1",
34 | "acorn-dynamic-import": "^4.0.0",
35 | "babel-eslint": "^8.2.1",
36 | "cross-env": "^5.2.0",
37 | "eslint": "^5.16.0",
38 | "eslint-config-prettier": "^3.6.0",
39 | "eslint-loader": "^2.1.2",
40 | "eslint-plugin-prettier": "2.6.2",
41 | "eslint-plugin-vue": "^6.2.2",
42 | "prettier": "1.14.3",
43 | "webpack": "^4.42.1"
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/pages/README.md:
--------------------------------------------------------------------------------
1 | # PAGES
2 |
3 | This directory contains your Application Views and Routes.
4 | The framework reads all the `*.vue` files inside this directory and create the router of your application.
5 |
6 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/routing).
7 |
--------------------------------------------------------------------------------
/pages/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .p-container(v-on:mousemove.selve="onMouseMove")
3 | page-header
4 | .container1(id='xparent')
5 | org-chart(v-if="chart")
6 |
7 | edit-menu(v-if="showEditMenu")
8 | #move_dept(v-if="moveDepartment" :style="{ left: page.left + 'px', top: page.top + 'px' }")
9 | div {{moveDepartment.name}}
10 | i.material-icons.arrow.down(v-if='moveDepartment.children.length') arrow_drop_down
11 | side-screen(v-if='chart')
12 | show-person(v-if='showPerson')
13 |
14 |
15 |
123 |
124 |
157 |
--------------------------------------------------------------------------------
/plugins/AsyncComputed.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import AsyncComputed from 'vue-async-computed'
3 | import 'array-from-polyfill'
4 |
5 | Vue.use(AsyncComputed)
6 |
--------------------------------------------------------------------------------
/plugins/HelpFunctions.js:
--------------------------------------------------------------------------------
1 | export function createTree(array, parent, nextparent, tree) {
2 | tree = typeof tree !== 'undefined' ? tree : []
3 | parent = typeof parent !== 'undefined' ? parent : { id: '' }
4 | var children = array.filter(child => child.parentId === parent.id)
5 | if (!parent.id) {
6 | tree = children
7 | } else {
8 | parent['children'] = children
9 | parent['parent'] = nextparent.id ? nextparent : null
10 | parent['showChildren'] = false
11 | }
12 | if (children.length) {
13 | children.forEach(function(child) {
14 | createTree(array, child, parent)
15 | })
16 | }
17 | return tree
18 | }
19 |
--------------------------------------------------------------------------------
/plugins/README.md:
--------------------------------------------------------------------------------
1 | # PLUGINS
2 |
3 | **This directory is not required, you can delete it if you don't want to use it.**
4 |
5 | This directory contains your Javascript plugins that you want to run before mounting the root Vue.js application.
6 |
7 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/plugins).
8 |
--------------------------------------------------------------------------------
/plugins/vueMatertialIcons.js:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/plugins/vueMatertialIcons.js
--------------------------------------------------------------------------------
/static/README.md:
--------------------------------------------------------------------------------
1 | # STATIC
2 |
3 | **This directory is not required, you can delete it if you don't want to use it.**
4 |
5 | This directory contains your static files.
6 | Each file inside this directory is mapped to `/`.
7 |
8 | Example: `/static/robots.txt` is mapped as `/robots.txt`.
9 |
10 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/assets#static).
11 |
--------------------------------------------------------------------------------
/static/config.js:
--------------------------------------------------------------------------------
1 | var CONFIG = {"enableUserSettings":true,"showUserManual":true,"title":{"color":"#05668d","text":"Interactive organization chart"},"information":"Do you see something wrong? Please drop a mail to someone@example.com","photoUrl":{"prefix":"photos/","suffix":".png"},"startView":{"photos":true,"names":true,"columnview":true,"staffColumnview":false,"showNrDepartments":true,"showNrPeople":true},"enableScreenCapture":true,"levelColors":["#0c058d","#05668d","#8d6e05","#8d2305","#cfb303"],"editCommand":"_edit","dataFields":[{"name":"Location","type":"text"}],"personProperties":[{"name":"Phone","type":"text","order":0},{"name":"Email","type":"email","order":1},{"name":"Homepage","type":"url","order":2},{"name":"Country","type":"text","order":3},{"name":"City","type":"text","order":4},{"name":"Street","type":"text","order":5}]}
--------------------------------------------------------------------------------
/static/data.js:
--------------------------------------------------------------------------------
1 | var INPUT_DATA={"api_version":"2.0","chart":{"id":"1","name":"Software BV","description":"","parent_id":"","staff_department":"N","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"2","name":"Office","description":"","parent_id":"1","staff_department":"Y","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":true},{"id":"3","name":"Communication","description":"","parent_id":"1","staff_department":"Y","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"2b5f3900-b816-b42a-f272-b9ae0ca0ab83","name":"comteam1","description":"","parent_id":"3","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"4","name":"Strategy & Sustainability","description":"","parent_id":"1","staff_department":"Y","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5","name":"Desktop Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"5_1","name":"Business customers","description":"","parent_id":"5","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"5_1_0","name":"Business Office","description":"","parent_id":"5_1","staff_department":"Y","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_1","name":"Front end team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_2","name":"Back end team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_3","name":"Api team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"5_2","name":"Private Customer","description":"","parent_id":"5","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"6","name":"Mobile Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"6_1","name":"Android","description":"","parent_id":"6","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"6_2","name":"IOS","description":"The IOS department creates and maintains applications for Apple phones and tablets","parent_id":"6","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"7","name":"Web Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"7_1","name":"IE troubleshooters","description":"","parent_id":"7","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_2","name":"Javascript kiddies","description":"","parent_id":"7","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_3","name":"Java masters","description":"","parent_id":"7","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_4","name":"PHP people","description":"","parent_id":"7","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"9","name":"Finance","description":"","parent_id":"1","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"9_1","name":"Payments","description":"","parent_id":"9","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"9_2","name":"Invoices","description":"","parent_id":"9","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"9_3","name":"Incasso","description":"","parent_id":"9","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"6_3","name":"Other","description":"","parent_id":"9","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"e6d71ac8-39c2-c334-4323-0688c96311f1","name":"new department type","description":"","parent_id":"6_3","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"09a54438-5ef2-2295-b019-b18b922ed741","name":"subsub","description":"","parent_id":"e6d71ac8-39c2-c334-4323-0688c96311f1","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"50a97250-a02f-20de-4749-89103c1e40e6","name":"safsf","description":"","parent_id":"e6d71ac8-39c2-c334-4323-0688c96311f1","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false}],"showChildren":false}],"showChildren":false},{"id":"10","name":"Risk Management","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"10_1","name":"Central Risk Management","description":"","parent_id":"10","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"10_6","name":"Operational Risk Management & Control","description":"","parent_id":"10","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"11","name":"Innovation & Technology","description":"","parent_id":"1","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"11_1","name":"Innovation","description":"","parent_id":"11","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"11_2","name":"Technology","description":"","parent_id":"11","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"12","name":"Human Resources","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"12_1","name":"Transformation Team","description":"","parent_id":"12","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"12_2","name":"Branding & Communications","description":"","parent_id":"12","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false}],"showChildren":true},"people":[{"id":"B01","name":"Big Boss","photo":"B01","functionName":"chief executive officer","fields":{"Email":"bigbos@someaddress.nl","Phone":"0345-394930203","Homepage":"nu.nl","Country":"Netherlands","City":"Amsterdam","Street":"Kalverstraat 1"}},{"id":"B03","name":"Mo Ney","photo":"B03","functionName":"CFO","fields":{"Email":"","Phone":"0345-394930204","Homepage":"linkedin.com","Country":"Netherlands","City":"Amsterdam","Street":"Vijzelstraat 143a"}},{"id":"B02","name":"S. Talker","photo":"B02","functionName":"HR","fields":{"Email":"","Phone":"0345-394930205","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Amsterdam","Street":"Molenstraat 6"}},{"id":"df","name":"Big Boss1","photo":"","functionName":"","fields":{"Email":"","Phone":"0345-394930206","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Amsterdam","Street":"Kerkwerg 15"}},{"id":"B05","name":"Mr x","photo":"B05","functionName":"","fields":{"Email":"MRX@somecomplany.mail","Phone":"0345-394930207","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Utrecht","Street":"Dorpstraat 9"}},{"id":"B04","name":"Mr y","photo":"B04","functionName":"CIO","fields":{"Email":"","Phone":"0345-394930208","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Utrecht","Street":"Stationslaan 88"}},{"id":"44","name":"michael","photo":"","functionName":"","fields":{"Email":"","Phone":"0345-394930209","Homepage":"https://www.linkedin.com/company/philips/","Country":"Netherlands","City":"Utrecht","Street":"Het verdun 5"}},{"name":"asdfasdf","id":"asdfasdf","manager":true,"photo":"","functionName":"","fields":{"Email":"","Phone":"","Homepage":"","Country":"","City":"","Street":""}},{"name":"asdfasdfasd","id":"fasddfasdf","manager":true,"photo":"","functionName":"","fields":{"Email":"","Phone":"","Homepage":"","Country":"","City":"","Street":""}},{"name":"jantje","id":"al;skdj;lasdjf","manager":false,"photo":"","functionName":"","fields":{"Email":"","Phone":"","Homepage":"","Country":"","City":"","Street":""}},{"name":"mrnew","id":"mrnew","photo":"","functionName":"","fields":{"Email":"","Phone":"","Homepage":"","Country":"","City":"","Street":""}}],"assignments":[{"department_id":"6_2","id":0,"person_id":"B01","role":"strategy consultanting"},{"department_id":"6_2","id":1,"person_id":"B03","role":"scrum master"},{"department_id":"6_2","id":4,"person_id":"B05","role":"ux/ui designer"},{"department_id":"6_2","id":5,"person_id":"B04","role":"new tester"},{"department_id":"6_2","id":6,"person_id":"44","role":"tester"},{"department_id":"5","id":9,"person_id":"al;skdj;lasdjf","role":""},{"department_id":"6_2","id":10,"person_id":"mrnew","role":"new job"}]};var UPDATED_ON="13-09-2020"
--------------------------------------------------------------------------------
/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/static/favicon.ico
--------------------------------------------------------------------------------
/static/photos/B01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/static/photos/B01.png
--------------------------------------------------------------------------------
/static/photos/B02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/static/photos/B02.png
--------------------------------------------------------------------------------
/static/photos/B03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/static/photos/B03.png
--------------------------------------------------------------------------------
/static/photos/B04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/static/photos/B04.png
--------------------------------------------------------------------------------
/static/photos/B05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hoogkamer/vue-org-chart/1c1130429f10683479d4b13e669237fa43f1cdfd/static/photos/B05.png
--------------------------------------------------------------------------------
/static/testfiles/config v1.js:
--------------------------------------------------------------------------------
1 | var CONFIG = {"title":{"color":"#05668d","text":"Interactive organization chart"},"information":"Do you see something wrong? Please drop a mail to someone@example.com","photoUrl":{"prefix":"photos/","suffix":".png"},"startView":{"photos":true,"names":true,"columnview":true,"staffColumnview":false,"showNrDepartments":true,"showNrPeople":true},"enableScreenCapture":true,"levelColors":["#0c058d","#05668d","#8d6e05","#8d2305","#cfb303"],"editCommand":"_edit","dataFields":[{"name":"Location","type":"text"}]}
--------------------------------------------------------------------------------
/static/testfiles/config_default.js:
--------------------------------------------------------------------------------
1 | var CONFIG = {
2 | // You can set the header color and title,
3 | title: {
4 | color: '#05668d',
5 | text: 'Interactive organization chart'
6 | },
7 |
8 | // provide text to display when clicked on the (i) button (you can use HTML). Leave empty if not needed
9 | information:
10 | 'Do you see something wrong? Please drop a mail to someone@example.com',
11 |
12 | // The position where to get the photo's
13 | // For these locations it is fetched from "prefix" + photo + "suffix".
14 | // So if you have photo P0001, it will be fetched from "photos/P0001.png".
15 | // If you have an api or other locations which delivers photo's based on the photo field you can change that here.
16 | photoUrl: {
17 | prefix: 'photos/',
18 | suffix: '.png'
19 | },
20 |
21 | // It will open a new tab to navigate to that page when clicked in the sidescreen on a person.
22 | // If you have an api which shows a user profile page you can enter the location here.
23 | // Don't specify this object if you want to see the profile information from this application (default)
24 | //linkUrl: {
25 | // prefix: 'photos/',
26 | // suffix: '.png'
27 | //},
28 |
29 | // Sets the inital options (the user can change them in the menu bar)
30 | startView: {
31 | photos: true,
32 | names: true,
33 | columnview: true,
34 | staffColumnview: false,
35 | showNrDepartments: true,
36 | showNrPeople: true
37 | },
38 |
39 | //This shows the icon to make an image of the graph to save.
40 | //This does not work when you are on a local folder, so disable this option then
41 | enableScreenCapture: true,
42 |
43 | //The colors of each level in the orgchart
44 | levelColors: [
45 | '#0c058d',
46 | '#05668d',
47 | '#8d6e05',
48 | '#8d2305',
49 | '#cfb303'
50 | ],
51 |
52 | // the command to type in the searchbar to switch to edit mode
53 | editCommand: '_edit',
54 | dataFields: [{ name: 'Location', type: 'text' }]
55 | }
56 |
--------------------------------------------------------------------------------
/static/testfiles/data v1.js:
--------------------------------------------------------------------------------
1 | var INPUT_DATA={"api_version":"1.0","chart":{"id":"1","name":"Software BV","description":"","parent_id":"","staff_department":"N","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"2","name":"Office","description":"","parent_id":"1","staff_department":"Y","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"01268004-f249-5d93-41e4-c23947f11a62","name":"team 0","description":"","parent_id":"2","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"a798e6cf-0b58-067e-44ef-237f3b3b253a","name":"team 1","description":"","parent_id":"2","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"3","name":"Communication","description":"","parent_id":"1","staff_department":"Y","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"2b5f3900-b816-b42a-f272-b9ae0ca0ab83","name":"comteam1","description":"","parent_id":"3","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"4","name":"Strategy & Sustainability","description":"","parent_id":"1","staff_department":"Y","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5","name":"Desktop Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B01","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"5_1","name":"Business customers","description":"","parent_id":"5","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"5_1_0","name":"Business Office","description":"","parent_id":"5_1","staff_department":"Y","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_1","name":"Front end team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_2","name":"Back end team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"5_1_3","name":"Api team","description":"","parent_id":"5_1","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"5_2","name":"Private Customer","description":"","parent_id":"5","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"6","name":"Mobile Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"6_1","name":"Android","description":"","parent_id":"6","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"6_2","name":"IOS","description":"The IOS department creates and maintains applications for Apple phones and tablets","parent_id":"6","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":true},{"id":"7","name":"Web Development","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"7_1","name":"IE troubleshooters","description":"","parent_id":"7","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_2","name":"Javascript kiddies","description":"","parent_id":"7","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_3","name":"Java masters","description":"","parent_id":"7","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"7_4","name":"PHP people","description":"","parent_id":"7","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"9","name":"Finance","description":"","parent_id":"1","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"9_1","name":"Payments","description":"","parent_id":"9","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"9_2","name":"Invoices","description":"","parent_id":"9","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"9_3","name":"Incasso","description":"","parent_id":"9","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"6_3","name":"Other","description":"","parent_id":"9","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"e6d71ac8-39c2-c334-4323-0688c96311f1","name":"new department type","description":"","parent_id":"6_3","staff_department":"N","manager_id":"B02","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"09a54438-5ef2-2295-b019-b18b922ed741","name":"subsub","description":"","parent_id":"e6d71ac8-39c2-c334-4323-0688c96311f1","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"50a97250-a02f-20de-4749-89103c1e40e6","name":"safsf","description":"","parent_id":"e6d71ac8-39c2-c334-4323-0688c96311f1","staff_department":"N","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false}],"showChildren":false}],"showChildren":false},{"id":"10","name":"Risk Management","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"10_1","name":"Central Risk Management","description":"","parent_id":"10","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"10_6","name":"Operational Risk Management & Control","description":"","parent_id":"10","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"11","name":"Innovation & Technology","description":"","parent_id":"1","staff_department":"N","manager_id":"B04","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"11_1","name":"Innovation","description":"","parent_id":"11","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"11_2","name":"Technology","description":"","parent_id":"11","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false},{"id":"12","name":"Human Resources","description":"","parent_id":"1","staff_department":"N","manager_id":"B05","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[{"id":"12_1","name":"Transformation Team","description":"","parent_id":"12","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false},{"id":"12_2","name":"Branding & Communications","description":"","parent_id":"12","staff_department":"N","manager_id":"B03","dataFields":[{"name":"Location","value":"","type":"text"}],"children":[],"showChildren":false}],"showChildren":false}],"showChildren":true},"people":[{"id":"B01","name":"Big Boss","photo":"B01","main_role":"","function":"a","homepage":"nu.nl","street":"Kalverstraat 1","email":"bigbos@someaddress.nl","phone":"0345-394930203","country":"Netherlands","city":"Amsterdam","functionName":"chief executive officer"},{"id":"B03","name":"Mo Ney","photo":"B03","main_role":"","function":"","homepage":"linkedin.com","street":"Vijzelstraat 143a","email":"","phone":"0345-394930204","country":"Netherlands","city":"Amsterdam","functionName":"CFO"},{"id":"B02","name":"S. Talker","photo":"B02","main_role":"","function":"","homepage":"https://www.linkedin.com/company/philips/","street":"Molenstraat 6","email":"","phone":"0345-394930205","country":"Netherlands","city":"Amsterdam","functionName":"HR"},{"id":"df","name":"Big Boss1","photo":"","main_role":"","function":"","homepage":"https://www.linkedin.com/company/philips/","street":"Kerkwerg 15","email":"","phone":"0345-394930206","country":"Netherlands","city":"Amsterdam","functionName":""},{"id":"B05","name":"Mr x","photo":"B05","main_role":"","function":"","homepage":"https://www.linkedin.com/company/philips/","street":"Dorpstraat 9","email":"MRX@somecomplany.mail","phone":"0345-394930207","country":"Netherlands","city":"Utrecht","functionName":""},{"id":"B04","name":"Mr y","photo":"B04","main_role":"","function":"","homepage":"https://www.linkedin.com/company/philips/","street":"Stationslaan 88","email":"","phone":"0345-394930208","country":"Netherlands","city":"Utrecht","functionName":"CIO"},{"id":"44","name":"michael","photo":"","main_role":"","function":"web","homepage":"https://www.linkedin.com/company/philips/","street":"Het verdun 5","email":"","phone":"0345-394930209","country":"Netherlands","city":"Utrecht","functionName":""},{"name":"asdfasdf","id":"asdfasdf","manager":true,"photo":"","email":"","phone":"","country":"","city":"","street":"","functionName":"","homepage":""},{"name":"asdfasdfasd","id":"fasddfasdf","manager":true,"photo":"","email":"","phone":"","country":"","city":"","street":"","functionName":"","homepage":""},{"name":"jantje","id":"al;skdj;lasdjf","manager":false,"photo":"","email":"","phone":"","country":"","city":"","street":"","functionName":"","homepage":""},{"name":"mrnew","id":"mrnew","photo":"","email":"","phone":"","country":"","city":"","street":"","functionName":"","homepage":""}],"assignments":[{"department_id":"6_2","id":0,"person_id":"B01","role":"strategy consultanting"},{"department_id":"6_2","id":1,"person_id":"B03","role":"scrum master"},{"department_id":"6_2","id":4,"person_id":"B05","role":"ux/ui designer"},{"department_id":"6_2","id":5,"person_id":"B04","role":"new tester"},{"department_id":"6_2","id":6,"person_id":"44","role":"tester"},{"department_id":"5","id":9,"person_id":"al;skdj;lasdjf","role":""},{"department_id":"6_2","id":10,"person_id":"mrnew","role":"new job"}]};var UPDATED_ON="28-07-2020"
--------------------------------------------------------------------------------
/static/translate.js:
--------------------------------------------------------------------------------
1 | var UINAMES = {
2 | person: {
3 | name: 'Name',
4 | function: 'Function',
5 | id: 'Employee ID',
6 | departments: 'Departments'
7 | },
8 | sidebar: {
9 | detailTabName: 'Details',
10 | peopleTabName: 'People',
11 | departmentName: 'Name',
12 | departmentManager: 'Manager',
13 | departmentDescription: 'Description',
14 | departmentType: 'Department type',
15 | departmentHierarchy: 'Hierarchy',
16 | departmentTypeStaff: 'Staff department',
17 | departmentTypeNormal: 'Normal department',
18 | managerOfDepartment: 'Manager of department'
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/store/README.md:
--------------------------------------------------------------------------------
1 | # STORE
2 |
3 | **This directory is not required, you can delete it if you don't want to use it.**
4 |
5 | This directory contains your Vuex Store files.
6 | Vuex Store option is implemented in the Nuxt.js framework.
7 |
8 | Creating a file in this directory activate the option in the framework automatically.
9 |
10 | More information about the usage of this directory in [the documentation](https://nuxtjs.org/guide/vuex-store).
11 |
--------------------------------------------------------------------------------
/vendor.yml:
--------------------------------------------------------------------------------
1 | devtools/* linguist-vendored
2 |
--------------------------------------------------------------------------------