diff --git a/.github/workflows/docker-vizzu-dev-desktop.yml b/.github/workflows/docker-vizzu-dev-desktop.yml index 3dce230ce..f1d764790 100644 --- a/.github/workflows/docker-vizzu-dev-desktop.yml +++ b/.github/workflows/docker-vizzu-dev-desktop.yml @@ -24,6 +24,6 @@ jobs: - name: Build and Publish run: | IMAGE="vizzu-dev-desktop" - IMAGE_NAME="vizzu/$IMAGE:0.15" + IMAGE_NAME="vizzu/$IMAGE:0.16" docker build -t $IMAGE_NAME -f tools/ci/docker/$IMAGE . docker push $IMAGE_NAME diff --git a/.github/workflows/docker-vizzu-dev-wasm.yml b/.github/workflows/docker-vizzu-dev-wasm.yml index dfdb03bf5..6ca6b230a 100644 --- a/.github/workflows/docker-vizzu-dev-wasm.yml +++ b/.github/workflows/docker-vizzu-dev-wasm.yml @@ -24,6 +24,6 @@ jobs: - name: Build and Publish run: | IMAGE="vizzu-dev-wasm" - IMAGE_NAME="vizzu/$IMAGE:0.15" + IMAGE_NAME="vizzu/$IMAGE:0.16" docker build -t $IMAGE_NAME -f tools/ci/docker/$IMAGE . docker push $IMAGE_NAME diff --git a/CHANGELOG.md b/CHANGELOG.md index c352dc9dc..242cb025f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,43 +2,50 @@ ## [Unreleased] +### Changed + +- Separate Channel properties to AxisChannel properties at config. +- Channels 'set' rewrite doesn't clear AxisChannel properties. + +## [0.16.0] - 2024-11-28 + ### Fixed - Fix align on fake-split charts +- Drilldown on split chart is fade. +- Fix aggregate on split chart. - Do not interpolate hiding/showing legend -- Fix aggregator interface for 'set' channel parameter: +- Remove rare fantom empty marker space on scrollable legend. +- Same legend with different series are not interpolated. +- Different legend with same series are interpolated. +- Invisible axis labels are not draw. +- Fix chaotic axis labels on sorted chart with multiple dimension. +- Fix dimension axis guides on sorted chart. +- Fix NaN handling on axes and size measures other aggregators than sum. +- Do not draw dimension axis labels when the middle of the text is off the plot. + +### Changed + +- Mekko charts: The main axis handled as dimension. +- Change aggregator interface for 'set' channel parameter: - From now not accepted the same dimension on the same channel. - From now, it is prohibited to set multiple measure on one channel. - From now, it is prohibited to set only aggregator without series name. - Fix series parsing when aggregator comes first. - - Fix disappearing dimension when aggregated dimension was already set. -- Fix legend with multiple dimension duplicated markers: + - Fix disappearing dimension when aggregated dimension was already set. +- Change legend with multiple dimension duplicated markers: - Markers of color are never merged. - Markers of size are always merged. - Markers of lightness are only merged when labelLevel == 0. - When merge happens, the marker shows the middle value of lightness. -- Remove rare fantom empty marker space on scrollable legend. -- Same legend with different series are not interpolated. -- Different legend with same series are interpolated. -- Invisible axis labels are not draw. -- Fix chaotic axis labels on sorted chart with multiple dimension. -- Fix Mekko charts: The main axis handled as dimension. -- LabelLevel can be used to handle measure axis as dimension axis. -- Enable dimension axis ticks and interlacing. -- Enable measure axis guides. -- Fix dimension axis guides on sorted chart. -- Fix NaN handling on axes and size measures other aggregators than sum. -- Add meaning to crossing interlacing. -- Do not draw dimension axis labels when the middle of the text is off the plot. ### Added - Add spacing property for plot axis style structure. - -### Changed - -- Separate Channel properties to AxisChannel properties at config. -- Channels 'set' rewrite doesn't clear AxisChannel properties. +- LabelLevel can be used to handle measure axis as dimension axis. +- Enable dimension axis ticks and interlacing. +- Enable measure axis guides. +- Add meaning to crossing interlacing. ## [0.15.0] - 2024-10-28 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3e54b0b7b..0475d862c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -70,7 +70,7 @@ docker run -i -t -v .:/workspace vizzu/vizzu-dev-desktop bash or you can use a specific version of the prebuilt image: ```sh -docker run -i -t -v .:/workspace vizzu/vizzu-dev-desktop:0.15 bash +docker run -i -t -v .:/workspace vizzu/vizzu-dev-desktop:0.16 bash ``` Run the following commands to build and run the `WASM` version's development @@ -84,7 +84,7 @@ docker run -i -t -v .:/workspace vizzu/vizzu-dev-wasm bash or you can use a specific version of the prebuilt image: ```sh -docker run -i -t -v .:/workspace vizzu/vizzu-dev-wasm:0.15 bash +docker run -i -t -v .:/workspace vizzu/vizzu-dev-wasm:0.16 bash ``` ### Building the project diff --git a/docs/tutorial/align_range/02_b.js b/docs/tutorial/align_range/02_b.js index 439c79e8c..cf84891bf 100644 --- a/docs/tutorial/align_range/02_b.js +++ b/docs/tutorial/align_range/02_b.js @@ -1,7 +1,8 @@ chart.animate({ config: { - y: { - align: 'stretch' - } + y: { + align: 'stretch', + labels: true + } } }) diff --git a/docs/tutorial/align_range/03_b.js b/docs/tutorial/align_range/03_b.js index 7162d94ca..85f5e651b 100644 --- a/docs/tutorial/align_range/03_b.js +++ b/docs/tutorial/align_range/03_b.js @@ -1,10 +1,7 @@ chart.animate({ config: { - channels: { - y: { - align: 'none', - labels: true - } - } + y: { + align: 'none' + } } }) diff --git a/src/chart/animator/animation.cpp b/src/chart/animator/animation.cpp index 07f74a357..129dc31a9 100644 --- a/src/chart/animator/animation.cpp +++ b/src/chart/animator/animation.cpp @@ -128,7 +128,7 @@ void Animation::addKeyframe(const Gen::PlotPtr &next, auto begin = std::ref(intermediate0 ? intermediate0 : target); auto &&intermediate1Instant = - intermediate1 && strategy == RegroupStrategy::aggregate + intermediate1 && strategy != RegroupStrategy::fade && begin.get()->getOptions()->looksTheSame( *intermediate1->getOptions()); begin = intermediate1 ? std::ref(intermediate1) : begin; diff --git a/src/chart/main/version.cpp b/src/chart/main/version.cpp index 4541e656c..92ff16a63 100644 --- a/src/chart/main/version.cpp +++ b/src/chart/main/version.cpp @@ -2,6 +2,6 @@ #include "base/app/version.h" -const App::Version Vizzu::Main::version(0, 15, 0); +const App::Version Vizzu::Main::version(0, 16, 0); const char *const Vizzu::Main::siteUrl = "https://vizzu.io/"; diff --git a/src/chart/options/options.cpp b/src/chart/options/options.cpp index e3a42caa3..275fbb579 100644 --- a/src/chart/options/options.cpp +++ b/src/chart/options/options.cpp @@ -111,7 +111,8 @@ Channels Options::shadowChannels() const &ch2 = shadow.at(ChannelId::noop); auto &&stacker : shadow.getDimensions({data(stackChannels), std::size_t{1} + secondary.has_value()})) { - ch1.removeSeries(stacker); + if (stackChannelType() != subAxisType() || !isSplit()) + ch1.removeSeries(stacker); ch2.removeSeries(stacker); } @@ -122,7 +123,7 @@ void Options::drilldownTo(const Options &other) { auto &stackChannel = this->stackChannel(); - if (!isSplit()) + if (!isSplit() || !other.isSplit()) getChannels().axisPropsAt(subAxisType()).split = {}; for (auto &&dim : other.getChannels().getDimensions()) @@ -135,12 +136,14 @@ void Options::intersection(const Options &other) for (auto &&dim : getChannels().getDimensions()) if (!other.getChannels().isSeriesUsed(dim)) getChannels().removeSeries(dim); + + getChannels().axisPropsAt(subAxisType()).split = {}; } bool Options::looksTheSame(const Options &other) const { if (channels.anyAxisSet() - && channels.at(Gen::ChannelId::label).isEmpty()) { + && channels.at(ChannelId::label).isEmpty()) { auto thisCopy = *this; thisCopy.simplify(); @@ -155,6 +158,8 @@ bool Options::looksTheSame(const Options &other) const void Options::simplify() { + if (isSplit()) return; + // remove all dimensions, only used at the end of stack auto &stackChannel = this->stackChannel(); diff --git a/src/dataframe/old/datatable.cpp b/src/dataframe/old/datatable.cpp index 33ab6d87e..d3baca7cf 100644 --- a/src/dataframe/old/datatable.cpp +++ b/src/dataframe/old/datatable.cpp @@ -85,6 +85,15 @@ void SeriesIndex::setAggr(const std::string &aggr) aggregator = Refl::get_enum(aggr); } +std::string SeriesIndex::toJSON() const +{ + std::string res; + Conv::JSONObj obj{res}; + obj("name", name); + if (aggregator) obj("aggregator", Conv::toString(*aggregator)); + return res; +} + DataCube::iterator_t DataCube::begin() const { iterator_t res{this, diff --git a/src/dataframe/old/types.h b/src/dataframe/old/types.h index 3625277bb..5684a7c2c 100644 --- a/src/dataframe/old/types.h +++ b/src/dataframe/old/types.h @@ -69,11 +69,7 @@ class SeriesIndex [[nodiscard]] bool isDimension() const { return !aggregator; } - [[nodiscard]] consteval static auto members() - { - return std::tuple{&SeriesIndex::name, - &SeriesIndex::aggregator}; - } + [[nodiscard]] std::string toJSON() const; }; using SeriesList = Type::UniqueList; diff --git a/test/e2e/test_cases/test_cases.json b/test/e2e/test_cases/test_cases.json index a0c916db4..1e2490c94 100644 --- a/test/e2e/test_cases/test_cases.json +++ b/test/e2e/test_cases/test_cases.json @@ -2453,7 +2453,7 @@ "refs": ["e5678fa"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/area_column_time_sum": { - "refs": ["67ef3d7"] + "refs": ["727c6d5"] }, "ww_noFade/wNoFade_Tests/Marker_transition_problem/area_orientation": { "refs": ["8c0d580"] diff --git a/test/e2e/tests/docs.json b/test/e2e/tests/docs.json index 33dde8416..981272ea2 100644 --- a/test/e2e/tests/docs.json +++ b/test/e2e/tests/docs.json @@ -5,7 +5,7 @@ "refs": ["83f7b33"] }, "align_range": { - "refs": ["b3188f8"] + "refs": ["c4478ca"] }, "animation_control_keyframes": { "refs": ["ef161c7"] diff --git a/test/e2e/tests/fixes.json b/test/e2e/tests/fixes.json index 90a3ab56d..fd616844e 100644 --- a/test/e2e/tests/fixes.json +++ b/test/e2e/tests/fixes.json @@ -8,7 +8,7 @@ "refs": ["1732a49"] }, "143": { - "refs": ["fb8a740"] + "refs": ["95b9c83"] }, "144": { "refs": ["fde02e4"] diff --git a/test/e2e/tests/fixes/143.mjs b/test/e2e/tests/fixes/143.mjs index 4073c8dfe..3f6436b36 100644 --- a/test/e2e/tests/fixes/143.mjs +++ b/test/e2e/tests/fixes/143.mjs @@ -12,6 +12,11 @@ const testSteps = [ type: 'dimension', values: ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'] }, + { + name: 'Letters2', + type: 'dimension', + values: ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'] + }, { name: 'Val', type: 'measure', @@ -23,19 +28,61 @@ const testSteps = [ return chart.animate({ data, config: { - y: 'Colors', - x: 'Val' + y: { + set: 'Colors', + split: true + }, + x: { + set: 'Val', + split: true + } } }) }, (chart) => chart.animate( { - y: { set: 'Val', split: true }, - x: { set: 'Letters', split: true } + y: ['Letters2', 'Val'], + x: 'Letters' }, { regroupStrategy: 'drilldown' } - ) + ), + (chart) => + chart.animate( + { + y: ['Letters2', 'Colors', 'Val'] + }, + { regroupStrategy: 'drilldown' } + ), + (chart) => + chart.animate({ + config: { + y: 'Colors', + x: 'Val' + } + }), + (chart) => + chart.animate({ + config: { + y: ['Letters2', 'Val'], + x: 'Letters' + } + }), + (chart) => + chart.animate({ + y: ['Letters2', 'Val'] + }), + (chart) => + chart.animate({ + y: ['Letters2', 'Colors', 'Val'] + }), + (chart) => + chart.animate({ + config: { + y: ['Letters2', 'Colors'], + x: 'Val' + } + }) ] export default testSteps diff --git a/tools/ci/gcp/cloudbuild/cloudbuild.yaml b/tools/ci/gcp/cloudbuild/cloudbuild.yaml index 9ddb85f09..f3d9ac60d 100644 --- a/tools/ci/gcp/cloudbuild/cloudbuild.yaml +++ b/tools/ci/gcp/cloudbuild/cloudbuild.yaml @@ -3,15 +3,15 @@ steps: id: pull_wasm waitFor: - '-' - args: ['pull', 'vizzu/vizzu-dev-wasm:0.15'] + args: ['pull', 'vizzu/vizzu-dev-wasm:0.16'] - name: 'gcr.io/cloud-builders/docker' id: pull_desktop waitFor: - '-' - args: ['pull', 'vizzu/vizzu-dev-desktop:0.15'] + args: ['pull', 'vizzu/vizzu-dev-desktop:0.16'] - - name: vizzu/vizzu-dev-wasm:0.15 + - name: vizzu/vizzu-dev-wasm:0.16 id: init waitFor: - pull_wasm @@ -24,7 +24,7 @@ steps: ./tools/ci/run/init-py.sh dir: /workspace - - name: vizzu/vizzu-dev-wasm:0.15 + - name: vizzu/vizzu-dev-wasm:0.16 id: check_src waitFor: - init @@ -41,7 +41,7 @@ steps: npm run lint:src fi dir: /workspace - - name: vizzu/vizzu-dev-wasm:0.15 + - name: vizzu/vizzu-dev-wasm:0.16 id: check_docs waitFor: - init @@ -58,7 +58,7 @@ steps: npm run lint:docs fi dir: /workspace - - name: vizzu/vizzu-dev-wasm:0.15 + - name: vizzu/vizzu-dev-wasm:0.16 id: check_tools waitFor: - init @@ -77,7 +77,7 @@ steps: fi dir: /workspace - - name: vizzu/vizzu-dev-desktop:0.15 + - name: vizzu/vizzu-dev-desktop:0.16 id: build_desktop_clangformat waitFor: - pull_desktop @@ -97,7 +97,7 @@ steps: fi dir: /workspace - - name: vizzu/vizzu-dev-desktop:0.15 + - name: vizzu/vizzu-dev-desktop:0.16 id: build_desktop_clangtidy waitFor: - build_desktop_clangformat @@ -113,7 +113,7 @@ steps: ./tools/ci/run/pkg-build-desktop-clangtidy.sh fi dir: /workspace - - name: vizzu/vizzu-dev-wasm:0.15 + - name: vizzu/vizzu-dev-wasm:0.16 id: build_wasm waitFor: - build_desktop_clangformat @@ -134,7 +134,7 @@ steps: ./tools/ci/run/pkg-build-js.sh dir: /workspace - - name: vizzu/vizzu-dev-wasm:0.15 + - name: vizzu/vizzu-dev-wasm:0.16 id: lib_sha waitFor: - build_wasm @@ -157,7 +157,7 @@ steps: fi dir: /workspace - - name: vizzu/vizzu-dev-wasm:0.15 + - name: vizzu/vizzu-dev-wasm:0.16 id: test waitFor: - lib_sha @@ -172,7 +172,7 @@ steps: fi dir: /workspace - - name: vizzu/vizzu-dev-wasm:0.15 + - name: vizzu/vizzu-dev-wasm:0.16 id: docs waitFor: - test @@ -215,7 +215,7 @@ steps: - VIZZUHQ_GITHUB_USER - VIZZUHQ_GITHUB_EMAIL - - name: vizzu/vizzu-dev-wasm:0.15 + - name: vizzu/vizzu-dev-wasm:0.16 id: publish waitFor: - docs