gantt-source_management 3.37.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintrc.json +39 -0
  3. package/.prettierrc.cjs +5 -0
  4. package/README.md +129 -0
  5. package/cypress/e2e/add-rows-items.test.ts +26 -0
  6. package/cypress/e2e/basic.test.ts +173 -0
  7. package/cypress/e2e/calculated-zoom-mode.test.ts +163 -0
  8. package/cypress/e2e/calendar-dates.test.ts +285 -0
  9. package/cypress/e2e/dst.test.ts +691 -0
  10. package/cypress/e2e/grid-cells.test.ts +72 -0
  11. package/cypress/e2e/items-vertical.test.ts +305 -0
  12. package/cypress/e2e/items.test.ts +501 -0
  13. package/cypress/e2e/list-columns-toggle.test.ts +124 -0
  14. package/cypress/e2e/list-header-resize.test.ts +30 -0
  15. package/cypress/e2e/locale.test.ts +102 -0
  16. package/cypress/e2e/move-items-outside.test.ts +437 -0
  17. package/cypress/e2e/rows.test.ts +50 -0
  18. package/cypress/e2e/scroll-bar.test.ts +357 -0
  19. package/cypress/e2e/time-bookmarks.test.ts +92 -0
  20. package/cypress/e2e/utc-mode.test.ts +51 -0
  21. package/cypress/fixtures/example.json +5 -0
  22. package/cypress/helpers.ts +12 -0
  23. package/cypress/plugins/index.js +22 -0
  24. package/cypress/support/commands.ts +175 -0
  25. package/cypress/support/e2e.ts +31 -0
  26. package/cypress.config.js +24 -0
  27. package/dist/api/api.d.ts +182 -0
  28. package/dist/api/helpers.d.ts +9 -0
  29. package/dist/api/id.d.ts +14 -0
  30. package/dist/api/locale.d.ts +3 -0
  31. package/dist/api/main.d.ts +47 -0
  32. package/dist/api/public.d.ts +32 -0
  33. package/dist/api/slots.d.ts +22 -0
  34. package/dist/api/time.d.ts +104 -0
  35. package/dist/assets/2f1f893a.wasm +0 -0
  36. package/dist/gstc.d.ts +708 -0
  37. package/dist/gstc.esm.min.d.ts +708 -0
  38. package/dist/gstc.esm.min.js +574 -0
  39. package/dist/gstc.umd.min.d.ts +708 -0
  40. package/dist/gstc.umd.min.js +701 -0
  41. package/dist/gstc.wasm.esm.min.d.ts +708 -0
  42. package/dist/gstc.wasm.esm.min.js +574 -0
  43. package/dist/gstc.wasm.umd.min.d.ts +708 -0
  44. package/dist/gstc.wasm.umd.min.js +701 -0
  45. package/dist/plugins/calendar-scroll.d.ts +15 -0
  46. package/dist/plugins/calendar-scroll.esm.min.d.ts +15 -0
  47. package/dist/plugins/calendar-scroll.esm.min.js +13 -0
  48. package/dist/plugins/calendar-scroll.umd.min.d.ts +15 -0
  49. package/dist/plugins/calendar-scroll.umd.min.js +13 -0
  50. package/dist/plugins/dependency-lines.d.ts +47 -0
  51. package/dist/plugins/dependency-lines.esm.min.d.ts +47 -0
  52. package/dist/plugins/dependency-lines.esm.min.js +38 -0
  53. package/dist/plugins/dependency-lines.umd.min.d.ts +47 -0
  54. package/dist/plugins/dependency-lines.umd.min.js +38 -0
  55. package/dist/plugins/export-image.d.ts +12 -0
  56. package/dist/plugins/export-image.esm.min.d.ts +12 -0
  57. package/dist/plugins/export-image.esm.min.js +28 -0
  58. package/dist/plugins/export-image.umd.min.d.ts +12 -0
  59. package/dist/plugins/export-image.umd.min.js +34 -0
  60. package/dist/plugins/export-pdf.d.ts +12 -0
  61. package/dist/plugins/export-pdf.esm.min.d.ts +12 -0
  62. package/dist/plugins/export-pdf.esm.min.js +389 -0
  63. package/dist/plugins/export-pdf.umd.min.d.ts +12 -0
  64. package/dist/plugins/export-pdf.umd.min.js +511 -0
  65. package/dist/plugins/grab-scroll.d.ts +14 -0
  66. package/dist/plugins/grab-scroll.esm.min.d.ts +14 -0
  67. package/dist/plugins/grab-scroll.umd.min.d.ts +14 -0
  68. package/dist/plugins/highlight-weekends.d.ts +12 -0
  69. package/dist/plugins/highlight-weekends.esm.min.d.ts +12 -0
  70. package/dist/plugins/highlight-weekends.esm.min.js +14 -0
  71. package/dist/plugins/highlight-weekends.umd.min.d.ts +12 -0
  72. package/dist/plugins/highlight-weekends.umd.min.js +14 -0
  73. package/dist/plugins/item-movement.d.ts +97 -0
  74. package/dist/plugins/item-movement.esm.min.d.ts +97 -0
  75. package/dist/plugins/item-movement.esm.min.js +25 -0
  76. package/dist/plugins/item-movement.umd.min.d.ts +97 -0
  77. package/dist/plugins/item-movement.umd.min.js +25 -0
  78. package/dist/plugins/item-resizing.d.ts +102 -0
  79. package/dist/plugins/item-resizing.esm.min.d.ts +102 -0
  80. package/dist/plugins/item-resizing.esm.min.js +37 -0
  81. package/dist/plugins/item-resizing.umd.min.d.ts +102 -0
  82. package/dist/plugins/item-resizing.umd.min.js +37 -0
  83. package/dist/plugins/item-types.d.ts +13 -0
  84. package/dist/plugins/item-types.esm.min.d.ts +13 -0
  85. package/dist/plugins/item-types.esm.min.js +127 -0
  86. package/dist/plugins/item-types.umd.min.d.ts +13 -0
  87. package/dist/plugins/item-types.umd.min.js +127 -0
  88. package/dist/plugins/progress-bar.d.ts +13 -0
  89. package/dist/plugins/progress-bar.esm.min.d.ts +13 -0
  90. package/dist/plugins/progress-bar.esm.min.js +27 -0
  91. package/dist/plugins/progress-bar.umd.min.d.ts +13 -0
  92. package/dist/plugins/progress-bar.umd.min.js +27 -0
  93. package/dist/plugins/selection.d.ts +94 -0
  94. package/dist/plugins/selection.esm.min.d.ts +94 -0
  95. package/dist/plugins/selection.esm.min.js +26 -0
  96. package/dist/plugins/selection.umd.min.d.ts +94 -0
  97. package/dist/plugins/selection.umd.min.js +26 -0
  98. package/dist/plugins/time-bookmarks.d.ts +38 -0
  99. package/dist/plugins/time-bookmarks.esm.min.d.ts +38 -0
  100. package/dist/plugins/time-bookmarks.esm.min.js +50 -0
  101. package/dist/plugins/time-bookmarks.umd.min.d.ts +38 -0
  102. package/dist/plugins/time-bookmarks.umd.min.js +50 -0
  103. package/dist/plugins/timeline-pointer.d.ts +83 -0
  104. package/dist/plugins/timeline-pointer.esm.min.d.ts +83 -0
  105. package/dist/plugins/timeline-pointer.esm.min.js +13 -0
  106. package/dist/plugins/timeline-pointer.umd.min.d.ts +83 -0
  107. package/dist/plugins/timeline-pointer.umd.min.js +13 -0
  108. package/dist/style.css +811 -0
  109. package/dist/vendor.esm.min.js +128 -0
  110. package/examples/complex-1/faces/face-1.jpg +0 -0
  111. package/examples/complex-1/faces/face-10.jpg +0 -0
  112. package/examples/complex-1/faces/face-11.jpg +0 -0
  113. package/examples/complex-1/faces/face-12.jpg +0 -0
  114. package/examples/complex-1/faces/face-13.jpg +0 -0
  115. package/examples/complex-1/faces/face-14.jpg +0 -0
  116. package/examples/complex-1/faces/face-15.jpg +0 -0
  117. package/examples/complex-1/faces/face-16.jpg +0 -0
  118. package/examples/complex-1/faces/face-17.jpg +0 -0
  119. package/examples/complex-1/faces/face-18.jpg +0 -0
  120. package/examples/complex-1/faces/face-19.jpg +0 -0
  121. package/examples/complex-1/faces/face-2.jpg +0 -0
  122. package/examples/complex-1/faces/face-20.jpg +0 -0
  123. package/examples/complex-1/faces/face-21.jpg +0 -0
  124. package/examples/complex-1/faces/face-22.jpg +0 -0
  125. package/examples/complex-1/faces/face-23.jpg +0 -0
  126. package/examples/complex-1/faces/face-24.jpg +0 -0
  127. package/examples/complex-1/faces/face-25.jpg +0 -0
  128. package/examples/complex-1/faces/face-26.jpg +0 -0
  129. package/examples/complex-1/faces/face-27.jpg +0 -0
  130. package/examples/complex-1/faces/face-28.jpg +0 -0
  131. package/examples/complex-1/faces/face-29.jpg +0 -0
  132. package/examples/complex-1/faces/face-3.jpg +0 -0
  133. package/examples/complex-1/faces/face-30.jpg +0 -0
  134. package/examples/complex-1/faces/face-31.jpg +0 -0
  135. package/examples/complex-1/faces/face-32.jpg +0 -0
  136. package/examples/complex-1/faces/face-33.jpg +0 -0
  137. package/examples/complex-1/faces/face-34.jpg +0 -0
  138. package/examples/complex-1/faces/face-35.jpg +0 -0
  139. package/examples/complex-1/faces/face-36.jpg +0 -0
  140. package/examples/complex-1/faces/face-37.jpg +0 -0
  141. package/examples/complex-1/faces/face-38.jpg +0 -0
  142. package/examples/complex-1/faces/face-39.jpg +0 -0
  143. package/examples/complex-1/faces/face-4.jpg +0 -0
  144. package/examples/complex-1/faces/face-40.jpg +0 -0
  145. package/examples/complex-1/faces/face-41.jpg +0 -0
  146. package/examples/complex-1/faces/face-42.jpg +0 -0
  147. package/examples/complex-1/faces/face-43.jpg +0 -0
  148. package/examples/complex-1/faces/face-44.jpg +0 -0
  149. package/examples/complex-1/faces/face-45.jpg +0 -0
  150. package/examples/complex-1/faces/face-46.jpg +0 -0
  151. package/examples/complex-1/faces/face-47.jpg +0 -0
  152. package/examples/complex-1/faces/face-48.jpg +0 -0
  153. package/examples/complex-1/faces/face-49.jpg +0 -0
  154. package/examples/complex-1/faces/face-5.jpg +0 -0
  155. package/examples/complex-1/faces/face-50.jpg +0 -0
  156. package/examples/complex-1/faces/face-6.jpg +0 -0
  157. package/examples/complex-1/faces/face-7.jpg +0 -0
  158. package/examples/complex-1/faces/face-8.jpg +0 -0
  159. package/examples/complex-1/faces/face-9.jpg +0 -0
  160. package/examples/complex-1/index.html +61 -0
  161. package/examples/complex-1/index.js +923 -0
  162. package/examples/index.html +22 -0
  163. package/examples/reset.css +455 -0
  164. package/examples/server.js +18 -0
  165. package/package.json +150 -0
  166. package/tsconfig.json +17 -0
package/.editorconfig ADDED
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ indent_style = space
6
+ indent_size = 2
7
+ end_of_line = lf
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
package/.eslintrc.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "env": {
3
+ "browser": true,
4
+ "es6": true,
5
+ "es2017": true,
6
+ "jest": true,
7
+ "node": true,
8
+ "cypress/globals": true
9
+ },
10
+ "extends": ["eslint:recommended", "plugin:@typescript-eslint/eslint-recommended"],
11
+ "globals": {
12
+ "page": true,
13
+ "browser": true,
14
+ "context": true,
15
+ "jestPuppeteer": true
16
+ },
17
+ "parser": "@typescript-eslint/parser",
18
+ "parserOptions": {
19
+ "ecmaVersion": 11,
20
+ "sourceType": "module"
21
+ },
22
+ "plugins": ["@typescript-eslint", "prettier", "cypress"],
23
+ "rules": {
24
+ "semi": ["error", "always"],
25
+ "quotes": [
26
+ "error",
27
+ "single",
28
+ {
29
+ "avoidEscape": true,
30
+ "allowTemplateLiterals": true
31
+ }
32
+ ],
33
+ "no-undef": "warn",
34
+ "no-unused-vars": "warn",
35
+ "@typescript-eslint/no-unused-vars": "warn",
36
+ "no-console": "error"
37
+ },
38
+ "ignorePatterns": ["**/*.d.ts", "node_modules", ".git", ".history", "dist", "types", "./*.js", "examples/**/*.*"]
39
+ }
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ singleQuote: true,
3
+ semi: true,
4
+ printWidth: 120
5
+ };
package/README.md ADDED
@@ -0,0 +1,129 @@
1
+ <h1 align="center">gantt-schedule-timeline-calendar</h1>
2
+
3
+ <h2 align="center">Gantt, schedule, timeline and calendar components all in one!</h2>
4
+
5
+ <p align="center">
6
+ <img src="https://neuronet.io/screenshots/mainapp.jpg" alt="gantt-schedule-timeline-calendar">
7
+ </p>
8
+
9
+ <h3>gantt-schedule-timeline-calendar is all-in-one component that you can use in different scenarios.</h3>
10
+ Keywords: [ gantt, javascript gantt, typescript gantt, project manager, js gantt, js scheduler, js timeline, javascript timeline, javascript schedule, js scheduler, javascript calendar ]
11
+ <br/><br/><br/>
12
+ <p align="center">
13
+ <img src="https://img.shields.io/npm/v/gantt-schedule-timeline-calendar.svg">
14
+ <img src="https://snyk.io/test/github/neuronetio/gantt-schedule-timeline-calendar/badge.svg">
15
+ <img src="https://app.codacy.com/project/badge/Grade/732e0ef156344594b48584af97ba1e4a">
16
+ <img src="https://neuronet.io/screenshots/typescript.svg">
17
+ <img src="https://neuronet.io/screenshots/eslint.svg">
18
+ <img src="https://img.shields.io/endpoint?url=https://dashboard.cypress.io/badge/simple/qdqmtw/master&style=flat&logo=cypress">
19
+ <img src="https://api.travis-ci.com/neuronetio/gantt-schedule-timeline-calendar.svg?branch=master">
20
+ <img src="https://img.shields.io/npm/dm/gantt-schedule-timeline-calendar.svg">
21
+ <!--<img src="https://img.badgesize.io/neuronetio/gantt-schedule-timeline-calendar/master/dist/gstc.esm.min.js?compression=gzip">-->
22
+ </p>
23
+ <br>
24
+ <br />
25
+ <h3 align="center">And always remember, to leave a <a href="https://github.com/neuronetio/gantt-schedule-timeline-calendar">star :star:</a></h3>
26
+ <br />
27
+
28
+ <h2 align="center">FEATURES</h2>
29
+
30
+ - elastic - you can change almost everything from DOM tree to logic (without any compilation, without modifying original code - with config, state or plugin)
31
+ - super fast! even with large dataset
32
+ - multiple items in one row - suitable for various applications like booking, reservation, resource manager, multimedia editor etc.
33
+ - tree like structures - collapsible / expandable groups
34
+ - moveable / resizable items with ability to configure which items can move at the moment and how
35
+ - secure html templates
36
+ - snap to specified time when resizing / moving
37
+ - templates & slots support to easily change html content of each component
38
+ - background grid on which you can place your html content
39
+ - selectable cells and items with a choice of what can be selected at the moment
40
+ - gradual time zoom up to seconds
41
+ - resizable list columns (in realtime)
42
+ - sortable and searchable list columns
43
+ - BEM based CSS rules (easy to change appearance)
44
+ - you can easily add third party libraries
45
+ - highly configurable
46
+ - mobile ready
47
+ - Daylight saving time (DST) support
48
+ - plugins support
49
+ - attractive visually
50
+ - written in typescript
51
+ - offline license key (after purchase)
52
+
53
+ <p>
54
+ You can use it in <strong>react</strong>, <strong>vue</strong>, <strong>angular</strong>, <strong>svelte</strong> or any other projects.
55
+ </p>
56
+
57
+ <p>
58
+ You can use it as <strong>schedule</strong> for reservation system. You can use it for organizing <strong>events</strong>. You can use it as <strong>gantt chart</strong>. You can use it as <strong>calendar</strong> for different purposes.
59
+ You can even use it as a <strong>multimedia timeline editor</strong>!
60
+ </p>
61
+
62
+ <p>
63
+ <strong>gantt-schedule-timeline-calendar</strong> is very extensible and elastic. You can make your own plugins or modify configuration in couple of ways to achieve your goals.
64
+ You can control almost everything. You can change html structure, stylize every html element and even override original components without any compilation stage!
65
+ </p>
66
+
67
+ <h2 align="center">EXAMPLES</h2>
68
+
69
+ <a href="https://gantt-schedule-timeline-calendar.neuronet.io/examples" target="_blank">Online examples</a>
70
+
71
+ You can checkout [examples folder](https://github.com/neuronetio/gantt-schedule-timeline-calendar/tree/master/examples) too.
72
+ To run examples locally, clone this repository and run `npm run examples` in the root folder.
73
+ ```bash
74
+ git clone https://github.com/neuronetio/gantt-schedule-timeline-calendar.git
75
+ cd gantt-schedule-timeline-calendar
76
+ npm i
77
+ npm run examples
78
+ ```
79
+
80
+ <h2 align="center">REACT, NEXTJS, ANGULAR, SVELTE AND VUE EXAMPLES</h2>
81
+
82
+ - [react gantt-schedule-timeline-calendar usage example](https://github.com/neuronetio/react-gantt-schedule-timeline-calendar-example)
83
+ - [nextjs/react gantt-schedule-timeline-calendar usage example](https://github.com/neuronetio/nextjs-gantt-schedule-timeline-calendar-example)
84
+ - [angular gantt-schedule-timeline-calendar usage example](https://github.com/neuronetio/angular-gantt-schedule-timeline-calendar-example)
85
+ - [vue gantt-schedule-timeline-calendar usage example](https://github.com/neuronetio/vue-gantt-schedule-timeline-calendar-example)
86
+ - [vue3 composition api with vite gantt-schedule-timeline-calendar example](https://github.com/neuronetio/vue3-vite-gantt-schedule-timeline-calendar-example)
87
+ - [svelte gantt-schedule-timeline-calendar usage example](https://github.com/neuronetio/svelte-gantt-schedule-timeline-calendar-example)
88
+
89
+ <h2 align="center">SCREENSHOTS</h2>
90
+
91
+ <p align="center">
92
+ <img src="https://neuronet.io/screenshots/item-types.png" alt="gantt-schedule-timeline-calendar item types">
93
+ <br />
94
+ <img src="https://neuronet.io/screenshots/item-types-selected.png" alt="gantt-schedule-timeline-calendar item types">
95
+ <br />
96
+ <img src="https://neuronet.io/screenshots/item-types-selected-2.png" alt="gantt-schedule-timeline-calendar item types">
97
+ <br />
98
+ <img src="https://neuronet.io/screenshots/select-cells.gif" alt="gantt-schedule-timeline-calendar select cells">
99
+ <br />
100
+ <img src="https://neuronet.io/screenshots/linked-items-2.gif" alt="gantt-schedule-timeline-calendar linked items">
101
+ <br />
102
+ <img src="https://neuronet.io/screenshots/select-items.gif" alt="gantt-schedule-timeline-calendar select items">
103
+ <br />
104
+ <img src="https://neuronet.io/screenshots/linked-items.gif" alt="gantt-schedule-timeline-calendar linked-items 2">
105
+ </p>
106
+ <hr />
107
+
108
+ <h2 align="center">INSTALL</h2>
109
+
110
+ `npm i gantt-schedule-timeline-calendar`
111
+
112
+ or
113
+
114
+ `<script src="https://cdn.jsdelivr.net/npm/gantt-schedule-timeline-calendar/dist/gstc.wasm.umd.min.js"></script>`
115
+
116
+ <h2 align="center">DOCUMENTATION</h2>
117
+
118
+ [Documentation can be found here](https://gantt-schedule-timeline-calendar.neuronet.io)
119
+
120
+ <h2 align="center">NEED HELP?</h2>
121
+
122
+ Let us know neuronet.io@gmail.com
123
+
124
+ <h2 align="center">LICENSE</h2>
125
+
126
+ [NEURONET Free / Trial License Terms](https://github.com/neuronetio/gantt-schedule-timeline-calendar/blob/master/LICENSE)
127
+
128
+ You can generate [free or trial license key here](https://gstc.neuronet.io/free-key).
129
+ If you need a full commercial license, please visit [pricing page](https://gantt-schedule-timeline-calendar.neuronet.io/pricing).
@@ -0,0 +1,26 @@
1
+ import { GridRows } from '../../dist/gstc';
2
+
3
+ describe('Add rows & items', () => {
4
+ it('should add rows and display grid properly', () => {
5
+ let state;
6
+ cy.load('/examples/add-rows-items')
7
+ .window()
8
+ .then((win) => {
9
+ // @ts-ignore
10
+ state = win.state;
11
+ })
12
+ .then(() => {
13
+ const gridRows: GridRows = state.get('$data.chart.grid.rows');
14
+ const keys = Object.keys(gridRows);
15
+ expect(keys.length).to.eq(11);
16
+ expect(Object.keys(gridRows[keys[0]].cells).length).to.be.greaterThan(0);
17
+ }).get('.gstc__chart-timeline-grid-row-cell').should('be.visible')
18
+ .get('#add-rows').click().wait(Cypress.env('wait'))
19
+ .then(() => {
20
+ const gridRows: GridRows = state.get('$data.chart.grid.rows');
21
+ const keys = Object.keys(gridRows);
22
+ expect(keys.length).to.eq(11);
23
+ expect(Object.keys(gridRows[keys[0]].cells).length).to.be.greaterThan(0);
24
+ }).get('.gstc__chart-timeline-grid-row-cell').should('be.visible');
25
+ });
26
+ });
@@ -0,0 +1,173 @@
1
+ import DeepState from 'deep-state-observer';
2
+
3
+ describe('Basic', () => {
4
+ function basicTest(path) {
5
+ return it(`Simple (${path})`, () => {
6
+ let state: DeepState, gstc;
7
+ cy.load(path)
8
+ .get('.gstc__chart-timeline-items-row-item[data-gstcid="gstcid-1"] .gstc__chart-timeline-items-row-item-label')
9
+ .should(($el) => {
10
+ expect($el.text()).to.eq('Item 1');
11
+ })
12
+ .window()
13
+ .then((win) => {
14
+ // @ts-ignore
15
+ state = win.state as DeepState;
16
+ // @ts-ignore
17
+ gstc = win.gstc;
18
+ expect(state.get('config.chart.items.gstcid-1.label')).to.eq('Item 1');
19
+ state.update('config.chart.items.gstcid-1.label', 'New label 1');
20
+ expect(state.get('config.chart.items.gstcid-1.label')).to.eq('New label 1');
21
+ })
22
+ .get('.gstc__chart-timeline-items-row-item[data-gstcid="gstcid-1"] .gstc__chart-timeline-items-row-item-label')
23
+ .should(($el) => {
24
+ expect($el.text()).to.eq('New label 1');
25
+ })
26
+ .then(() => {
27
+ cy.log('rows', Object.keys(state.get('$data.list.rows')));
28
+ cy.log('rowsIds', state.get('$data.list.rowsIds'));
29
+ cy.log('visibleRows', state.get('$data.list.visibleRows').join(','));
30
+ cy.log('itemRowMap keys', Object.keys(state.get('$data.itemRowMap')).join(','));
31
+ cy.log('rowsIds', state.get('$data.list.rowsIds').join(','));
32
+ cy.log('$data.chart.grid.rows', Object.keys(state.get('$data.chart.grid.rows')).join(','));
33
+ cy.log('$data.chart.items', Object.keys(state.get('$data.chart.items')).join(','));
34
+ })
35
+ .then(() => {
36
+ expect(Object.keys(state.get('$data.chart.grid.rows')).length).to.be.greaterThan(0);
37
+ expect(Object.keys(state.get('$data.chart.grid.cells')).length).to.be.greaterThan(0);
38
+ expect(Object.keys(state.get('$data.chart.items')).length).to.be.greaterThan(0);
39
+ expect(Object.keys(state.get('$data.list.rows')).length).to.be.greaterThan(0);
40
+ expect(Object.keys(state.get('$data.chart.items')).join(',')).to.eq(
41
+ Object.keys(state.get('$data.itemRowMap')).join(',')
42
+ );
43
+ expect(Object.keys(state.get('$data.list.rows')).join(',')).to.eq(state.get('$data.list.rowsIds').join(','));
44
+ expect(state.get('$data.list.visibleRowsHeight')).to.be.greaterThan(0);
45
+ expect(state.get('$data.list.rowsWithParentsExpanded').join(',')).to.eq(
46
+ Object.keys(state.get('$data.list.rows')).join(',') // all rows should be visible
47
+ );
48
+ expect(state.get('$data.list.rowsWithParentsExpanded').length).to.be.greaterThan(0);
49
+ })
50
+ //
51
+ // Update rows
52
+ //
53
+ .then(() => {
54
+ cy.log('Update rows');
55
+ state.update('config', (config) => {
56
+ config.list.rows = {
57
+ 'gstcid-1': {
58
+ id: 'gstcid-1',
59
+ label: 'Row 1',
60
+ },
61
+ 'gstcid-2': {
62
+ id: 'gstcid-2',
63
+ label: 'Row 2',
64
+ },
65
+ };
66
+ config.chart.items = {
67
+ 'gstcid-1': {
68
+ id: 'gstcid-1',
69
+ label: 'Item 1',
70
+ rowId: 'gstcid-1',
71
+ time: {
72
+ start: gstc.api.time.date('2020-01-01').startOf('day').valueOf(),
73
+ end: gstc.api.time.date('2020-01-02').endOf('day').valueOf(),
74
+ },
75
+ },
76
+ 'gstcid-2': {
77
+ id: 'gstcid-2',
78
+ label: 'Item 2',
79
+ rowId: 'gstcid-2',
80
+ time: {
81
+ start: gstc.api.time.date('2020-01-15').startOf('day').valueOf(),
82
+ end: gstc.api.time.date('2020-01-20').endOf('day').valueOf(),
83
+ },
84
+ },
85
+ };
86
+ return config;
87
+ });
88
+ })
89
+ .then(() => {
90
+ cy.log('rows', Object.keys(state.get('$data.list.rows')));
91
+ cy.log('rowsIds', state.get('$data.list.rowsIds'));
92
+ cy.log('visibleRows', state.get('$data.list.visibleRows').join(','));
93
+ cy.log('itemRowMap keys', Object.keys(state.get('$data.itemRowMap')).join(','));
94
+ cy.log('$data.chart.grid.rows', Object.keys(state.get('$data.chart.grid.rows')).join(','));
95
+ cy.log('$data.chart.items', Object.keys(state.get('$data.chart.items')).join(','));
96
+ cy.log('config.version', state.get('config.version'));
97
+ })
98
+ .then(() => {
99
+ expect(Object.keys(state.get('$data.chart.grid.rows')).length).to.be.greaterThan(0);
100
+ expect(Object.keys(state.get('$data.chart.grid.cells')).length).to.be.greaterThan(0);
101
+ expect(Object.keys(state.get('$data.chart.items')).length).to.be.greaterThan(0);
102
+ expect(Object.keys(state.get('$data.list.rows')).length).to.be.greaterThan(0);
103
+ expect(Object.keys(state.get('$data.chart.items')).join(',')).to.eq(
104
+ Object.keys(state.get('$data.itemRowMap')).join(',')
105
+ );
106
+ expect(Object.keys(state.get('$data.list.rows')).join(',')).to.eq(state.get('$data.list.rowsIds').join(','));
107
+ expect(state.get('$data.list.rowsWithParentsExpanded').length).to.be.greaterThan(0);
108
+ expect(state.get('$data.list.visibleRows').length).to.be.greaterThan(0);
109
+ expect(state.get('$data.list.visibleRowsHeight')).to.be.greaterThan(0);
110
+ expect(state.get('$data.list.rowsWithParentsExpanded').join(',')).to.eq(
111
+ state.get('$data.list.visibleRows').join(',') // there is only one row so it will work
112
+ );
113
+ expect(state.get('$data.list.rowsWithParentsExpanded').length).to.be.greaterThan(0);
114
+ })
115
+ //
116
+ // Update again
117
+ //
118
+ .then(() => {
119
+ cy.log('Update again');
120
+ state.update('config', (config) => {
121
+ config.list.rows = {
122
+ 'gstcid-13': {
123
+ id: 'gstcid-13',
124
+ label: 'Row 2',
125
+ },
126
+ };
127
+ config.chart.items = {
128
+ 'gstcid-400': {
129
+ id: 'gstcid-400',
130
+ label: 'Item 2',
131
+ rowId: 'gstcid-13',
132
+ time: {
133
+ start: gstc.api.time.date('2020-01-15').startOf('day').valueOf(),
134
+ end: gstc.api.time.date('2020-01-20').endOf('day').valueOf(),
135
+ },
136
+ },
137
+ };
138
+ return config;
139
+ });
140
+ })
141
+ .wait(100)
142
+ .then(() => {
143
+ cy.log('rows', Object.keys(state.get('$data.list.rows')));
144
+ cy.log('rowsIds', state.get('$data.list.rowsIds'));
145
+ cy.log('visibleRows', state.get('$data.list.visibleRows').join(','));
146
+ cy.log('itemRowMap keys', Object.keys(state.get('$data.itemRowMap')).join(','));
147
+ cy.log('$data.chart.grid.rows', Object.keys(state.get('$data.chart.grid.rows')).join(','));
148
+ cy.log('$data.chart.items', Object.keys(state.get('$data.chart.items')).join(','));
149
+ cy.log('config.version', state.get('config.version'));
150
+ })
151
+ .then(() => {
152
+ expect(Object.keys(state.get('$data.chart.grid.rows')).length).to.be.greaterThan(0);
153
+ expect(Object.keys(state.get('$data.chart.grid.cells')).length).to.be.greaterThan(0);
154
+ expect(Object.keys(state.get('$data.chart.items')).length).to.be.greaterThan(0);
155
+ expect(Object.keys(state.get('$data.list.rows')).length).to.be.greaterThan(0);
156
+ expect(Object.keys(state.get('$data.chart.items')).join(',')).to.eq(
157
+ Object.keys(state.get('$data.itemRowMap')).join(',')
158
+ );
159
+ expect(Object.keys(state.get('$data.list.rows')).join(',')).to.eq(state.get('$data.list.rowsIds').join(','));
160
+ expect(state.get('$data.list.rowsWithParentsExpanded').length).to.be.greaterThan(0);
161
+ expect(state.get('$data.list.visibleRows').length).to.be.greaterThan(0);
162
+ expect(state.get('$data.list.visibleRowsHeight')).to.be.greaterThan(0);
163
+ expect(state.get('$data.list.rowsWithParentsExpanded').join(',')).to.eq(
164
+ state.get('$data.list.visibleRows').join(',') // there is only one row so it will work
165
+ );
166
+ expect(state.get('$data.list.rowsWithParentsExpanded').length).to.be.greaterThan(0);
167
+ });
168
+ });
169
+ }
170
+
171
+ basicTest('/examples/simple/simple.esm.html');
172
+ basicTest('/examples/simple/simple.umd.html');
173
+ });
@@ -0,0 +1,163 @@
1
+ import DeepState from 'deep-state-observer';
2
+ import { GSTCResult, Item, ItemData } from '../../dist/gstc';
3
+
4
+ describe('Calculated zoom mode', () => {
5
+ it('should change calculatedZoomMode', () => {
6
+ let state: DeepState, gstc, initialFrom, initialTo, from, to;
7
+ cy.load('/examples/complex-1')
8
+ .window()
9
+ .then((win) => {
10
+ // @ts-ignore
11
+ state = win.state;
12
+ // @ts-ignore
13
+ gstc = win.gstc;
14
+ initialFrom = state.get('config.chart.time.from');
15
+ initialTo = state.get('config.chart.time.to');
16
+ from = gstc.api.time.date().startOf('month').valueOf();
17
+ to = gstc.api.time.date().endOf('month').valueOf();
18
+ const startDate = gstc.api.time.date('2020-02-01');
19
+ state.update('config.chart.time', (time) => {
20
+ time.calculatedZoomMode = true;
21
+ time.from = startDate.startOf('month').valueOf();
22
+ time.to = startDate.endOf('month').valueOf();
23
+ return time;
24
+ });
25
+ })
26
+ .wait(Cypress.env('wait'))
27
+ .then(() => {
28
+ expect(state.get('config.chart.time.from')).to.eq(initialFrom);
29
+ expect(state.get('$data.chart.time.fromDate').valueOf()).to.eq(initialFrom);
30
+ expect(state.get('config.chart.time.to')).to.be.lessThan(initialTo);
31
+ expect(state.get('$data.chart.time.toDate').valueOf()).to.be.lessThan(initialTo);
32
+ expect(state.get('config.chart.time.calculatedZoomMode')).to.eq(true);
33
+ })
34
+ .get('.gstc__scroll-bar--horizontal')
35
+ .should('not.exist')
36
+ .log(`updating from to`)
37
+ .then(() => {
38
+ state.update('config.chart.time', (time) => {
39
+ time.from = initialFrom;
40
+ time.to = initialTo;
41
+ time.calculatedZoomMode = false;
42
+ return time;
43
+ });
44
+ })
45
+ .wait(Cypress.env('wait'))
46
+ .then(() => {
47
+ expect(state.get('config.chart.time.from')).to.eq(initialFrom);
48
+ expect(state.get('$data.chart.time.fromDate').valueOf()).to.eq(initialFrom);
49
+ expect(state.get('config.chart.time.to')).to.be.eq(initialTo);
50
+ expect(state.get('$data.chart.time.toDate').valueOf()).to.eq(initialTo);
51
+ expect(state.get('config.chart.time.calculatedZoomMode')).to.eq(false);
52
+ })
53
+ .get('.gstc__scroll-bar--horizontal')
54
+ .should('exist')
55
+ .get('.gstc__chart-timeline-items-row-item')
56
+ .should('exist')
57
+ .then(() => {
58
+ state.update('config.chart.time', (time) => {
59
+ time.from = from;
60
+ time.to = to;
61
+ return time;
62
+ });
63
+ })
64
+ .wait(Cypress.env('wait'))
65
+ .get('.gstc__chart-timeline-items-row-item')
66
+ .should('not.exist')
67
+ .then(() => {
68
+ expect(state.get('config.chart.time.from')).to.eq(from);
69
+ expect(state.get('$data.chart.time.fromDate').valueOf()).to.eq(from);
70
+ expect(state.get('config.chart.time.to')).to.be.eq(to);
71
+ expect(state.get('$data.chart.time.toDate').valueOf()).to.eq(to);
72
+ expect(state.get('config.chart.time.calculatedZoomMode')).to.eq(false);
73
+ });
74
+ });
75
+
76
+ it('should move items one cell at time after calculatedZoomMode change', () => {
77
+ const itemId = 'gstcid-15';
78
+ const itemClass = `.gstc__chart-timeline-items-row-item[data-gstcid="${itemId}"]`;
79
+ let state: DeepState, gstc: GSTCResult;
80
+ cy.load('/examples/complex-1')
81
+ .scrollH(10)
82
+ .window()
83
+ .then((win) => {
84
+ // @ts-ignore
85
+ state = win.state;
86
+ // @ts-ignore
87
+ gstc = win.gstc;
88
+ const startDate = gstc.api.time.date('2020-02-01');
89
+ state.update('config.chart.time', (time) => {
90
+ time.calculatedZoomMode = true;
91
+ time.from = startDate.startOf('month').valueOf();
92
+ time.to = startDate.endOf('month').valueOf();
93
+ return time;
94
+ });
95
+ state.update(`config.chart.items.${itemId}`, (item) => {
96
+ item.time.start = gstc.api.time.date('2020-02-05').valueOf();
97
+ item.time.end = gstc.api.time.date('2020-02-07').endOf('day').valueOf();
98
+ return item;
99
+ });
100
+ })
101
+ .wait(Cypress.env('wait'))
102
+ .move(itemClass, 40, 0)
103
+ .then(() => {
104
+ const itemData: ItemData = state.get(`$data.chart.items.${itemId}`);
105
+ const item: Item = state.get(`config.chart.items.${itemId}`);
106
+ expect(itemData.time.startDate.format('YYYY-MM-DD HH:mm:ss')).to.eq('2020-02-06 00:00:00');
107
+ expect(itemData.time.endDate.format('YYYY-MM-DD HH:mm:ss')).to.eq('2020-02-08 23:59:59');
108
+ expect(item.time.start).to.eq(itemData.time.startDate.valueOf());
109
+ expect(item.time.end).to.eq(itemData.time.endDate.valueOf());
110
+ });
111
+ });
112
+
113
+ it('should resize items one cell at time after calculatedZoomMode change', () => {
114
+ const itemId = 'gstcid-15';
115
+ const itemClass = `.gstc__chart-timeline-items-row-item[data-gstcid="${itemId}"]`;
116
+ const itemLeftResizingHandleClass = `.gstc__chart-timeline-items-row-item-resizing-handle--left[data-gstcid="${itemId}"]`;
117
+ const itemRightResizingHandleClass = `.gstc__chart-timeline-items-row-item-resizing-handle--right[data-gstcid="${itemId}"]`;
118
+ let state: DeepState, gstc: GSTCResult;
119
+ cy.load('/examples/complex-1')
120
+ .scrollH(10)
121
+ .window()
122
+ .then((win) => {
123
+ // @ts-ignore
124
+ state = win.state;
125
+ // @ts-ignore
126
+ gstc = win.gstc;
127
+ const startDate = gstc.api.time.date('2020-02-01');
128
+ state.update('config.chart.time', (time) => {
129
+ time.calculatedZoomMode = true;
130
+ time.from = startDate.startOf('month').valueOf();
131
+ time.to = startDate.endOf('month').valueOf();
132
+ return time;
133
+ });
134
+ state.update(`config.chart.items.${itemId}`, (item) => {
135
+ item.time.start = gstc.api.time.date('2020-02-05').valueOf();
136
+ item.time.end = gstc.api.time.date('2020-02-07').endOf('day').valueOf();
137
+ return item;
138
+ });
139
+ })
140
+ .wait(Cypress.env('wait'))
141
+ .get(itemClass)
142
+ .click()
143
+ .wait(Cypress.env('wait'))
144
+ .move(itemRightResizingHandleClass, 40, 0)
145
+ .then(() => {
146
+ const itemData: ItemData = state.get(`$data.chart.items.${itemId}`);
147
+ const item: Item = state.get(`config.chart.items.${itemId}`);
148
+ expect(itemData.time.startDate.format('YYYY-MM-DD HH:mm:ss')).to.eq('2020-02-05 00:00:00');
149
+ expect(itemData.time.endDate.format('YYYY-MM-DD HH:mm:ss')).to.eq('2020-02-08 23:59:59');
150
+ expect(item.time.start).to.eq(itemData.time.startDate.valueOf());
151
+ expect(item.time.end).to.eq(itemData.time.endDate.valueOf());
152
+ })
153
+ .move(itemLeftResizingHandleClass, -40, 0)
154
+ .then(() => {
155
+ const itemData: ItemData = state.get(`$data.chart.items.${itemId}`);
156
+ const item: Item = state.get(`config.chart.items.${itemId}`);
157
+ expect(itemData.time.startDate.format('YYYY-MM-DD HH:mm:ss')).to.eq('2020-02-04 00:00:00');
158
+ expect(itemData.time.endDate.format('YYYY-MM-DD HH:mm:ss')).to.eq('2020-02-08 23:59:59');
159
+ expect(item.time.start).to.eq(itemData.time.startDate.valueOf());
160
+ expect(item.time.end).to.eq(itemData.time.endDate.valueOf());
161
+ });
162
+ });
163
+ });