@solidev/data 0.0.2 → 0.0.3

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.
@@ -3,7 +3,7 @@ import { InjectionToken, PLATFORM_ID, Injectable, Inject, Optional, Component, I
3
3
  import 'reflect-metadata';
4
4
  import * as i2$2 from '@angular/forms';
5
5
  import { FormControl, Validators, FormGroup, ReactiveFormsModule, UntypedFormControl, NG_VALUE_ACCESSOR, UntypedFormGroup } from '@angular/forms';
6
- import { throwError, ReplaySubject, share, combineLatest, of, takeUntil, NEVER, Subject, debounceTime, distinctUntilChanged, isObservable, firstValueFrom, timer, Observable, BehaviorSubject, merge } from 'rxjs';
6
+ import { throwError, ReplaySubject, share, combineLatest, of, takeUntil, NEVER, Subject, debounceTime, distinctUntilChanged, firstValueFrom, isObservable, timer, Observable, BehaviorSubject, merge } from 'rxjs';
7
7
  import { tap, switchMap, map, throttleTime, filter, mergeMap, finalize, catchError, take, first } from 'rxjs/operators';
8
8
  import * as i2 from '@angular/platform-browser';
9
9
  import { makeStateKey } from '@angular/platform-browser';
@@ -2044,16 +2044,165 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImpor
2044
2044
  type: Input
2045
2045
  }] } });
2046
2046
 
2047
+ class Level {
2048
+ constructor(tree, level, choices) {
2049
+ this.tree = tree;
2050
+ this.level = level;
2051
+ this.fc = new FormControl('');
2052
+ this.choices = choices;
2053
+ this.subs = this.fc.valueChanges.subscribe((val) => {
2054
+ if (this.selected !== val) {
2055
+ this.selected = val;
2056
+ this.tree.updated(this);
2057
+ }
2058
+ });
2059
+ }
2060
+ close() {
2061
+ this.subs.unsubscribe();
2062
+ }
2063
+ }
2064
+ class Tree {
2065
+ constructor(qs, maxLevel, display, filter) {
2066
+ this.qs = qs;
2067
+ this.maxLevel = maxLevel;
2068
+ this.display = display;
2069
+ this.filter = filter;
2070
+ this.levels = [];
2071
+ this.changed = new Subject();
2072
+ }
2073
+ /**
2074
+ * Conditionnaly add level to current tree.
2075
+ *
2076
+ * - if previous level have non-empty selected value
2077
+ * - if current level choices are non empty
2078
+ */
2079
+ async addLevel(fparent) {
2080
+ let values = [];
2081
+ if (this.levels.length === 0) {
2082
+ values = await firstValueFrom(this.qs
2083
+ .filter({ level: this.levels.length, parent: 'null', ...this.filter })
2084
+ .get());
2085
+ }
2086
+ else {
2087
+ const parent = fparent
2088
+ ? fparent
2089
+ : this.levels[this.levels.length - 1].selected;
2090
+ if (parent) {
2091
+ values = await firstValueFrom(this.qs
2092
+ .filter({
2093
+ level: this.levels.length,
2094
+ parent: this.levels[this.levels.length - 1].selected || 'null',
2095
+ ...this.filter,
2096
+ })
2097
+ .get());
2098
+ }
2099
+ }
2100
+ if (values.length > 0) {
2101
+ const level = new Level(this, this.levels.length, []);
2102
+ for (const v of values) {
2103
+ level.choices.push({ value: v.id, desc: this.display(v) });
2104
+ }
2105
+ this.levels.push(level);
2106
+ return level;
2107
+ }
2108
+ return null;
2109
+ }
2110
+ updated(level) {
2111
+ const newLevels = [];
2112
+ for (const l of this.levels) {
2113
+ if (l.level <= level.level) {
2114
+ newLevels.push(l);
2115
+ }
2116
+ else if (l.level > level.level) {
2117
+ l.close();
2118
+ }
2119
+ }
2120
+ this.levels = newLevels;
2121
+ this.addLevel();
2122
+ if (level.selected) {
2123
+ this.changed.next(level.selected);
2124
+ }
2125
+ else {
2126
+ this.changed.next(this.levels[level.level - 1]?.selected || null);
2127
+ }
2128
+ }
2129
+ async prepare(value) {
2130
+ // console.log('prepare', value);
2131
+ const levels = [];
2132
+ let cur = (await firstValueFrom(this.qs.filter({ id: value, ...this.filter }).get()))[0];
2133
+ levels.push(cur);
2134
+ let nlev = 0;
2135
+ while (cur.parent !== null) {
2136
+ cur = (await firstValueFrom(this.qs
2137
+ .filter({
2138
+ id: cur.parent,
2139
+ ...this.filter,
2140
+ })
2141
+ .get()))[0];
2142
+ levels.push(cur);
2143
+ nlev++;
2144
+ if (nlev > this.maxLevel) {
2145
+ throw Error('Max level error, could not find root');
2146
+ }
2147
+ }
2148
+ for (let i = levels.length - 1; i >= 0; i--) {
2149
+ const lv = await this.addLevel();
2150
+ if (lv !== null) {
2151
+ lv.selected = levels[i].id;
2152
+ lv.fc.setValue(levels[i].id, { emitEvent: false });
2153
+ }
2154
+ }
2155
+ if (this.levels.length <= this.maxLevel) {
2156
+ await this.addLevel();
2157
+ }
2158
+ }
2159
+ reset() { }
2160
+ }
2047
2161
  class ModelListTreeFilterComponent {
2048
2162
  constructor() {
2049
2163
  this.classes = '';
2050
2164
  }
2165
+ async ngOnInit() {
2166
+ this.tree = new Tree(this.filter.queryset, this.filter.maxLevel, this.filter.display, this.filter.filter);
2167
+ if (this.filter.get()) {
2168
+ await this.tree.prepare(this.filter.get()?.value);
2169
+ }
2170
+ else {
2171
+ await this.tree.addLevel();
2172
+ }
2173
+ this.tree.changed.pipe(debounceTime(250)).subscribe((val) => {
2174
+ // console.log('changed', val);
2175
+ if (val === null) {
2176
+ this.filter.clear();
2177
+ this.list.filters.update();
2178
+ }
2179
+ else {
2180
+ if (this.filter.set(val, '')) {
2181
+ this.list.filters.update();
2182
+ }
2183
+ }
2184
+ });
2185
+ // this.tree.changed.subscribe((selected) => {
2186
+ // console.log('tree changed', selected);
2187
+ // this.filter.set(selected, '');
2188
+ // });
2189
+ // if (this.filter.getValue()) {
2190
+ // console.log('filter value', this.filter.getValue());
2191
+ // await this.tree.prepare(this.filter.getValue() as number);
2192
+ // } else {
2193
+ // await this.tree.addLevel();
2194
+ // }
2195
+ }
2196
+ disable() {
2197
+ this.filter.enabled = false;
2198
+ this.list.filters.update();
2199
+ }
2051
2200
  }
2052
2201
  ModelListTreeFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: ModelListTreeFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2053
- ModelListTreeFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: ModelListTreeFilterComponent, isStandalone: true, selector: "data-model-list-tree-filter", inputs: { list: "list", filter: "filter", classes: "classes" }, ngImport: i0, template: "<p>model-list-tree-filter works!</p>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
2202
+ ModelListTreeFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.2", type: ModelListTreeFilterComponent, isStandalone: true, selector: "data-model-list-tree-filter", inputs: { list: "list", filter: "filter", classes: "classes" }, ngImport: i0, template: "\n<div class=\"filteritem\" [ngClass]=\"filter.displayClasses || classes\">\n <div class=\"trash float-end\" (click)=\"disable()\"><i class=\"bi bi-trash\"></i></div>\n <label>{{filter.label}}</label>\n <div class=\"levelselect\" *ngFor=\"let l of tree.levels\">\n <select class=\"form-select form-select-sm\" [formControl]=\"l.fc\">\n <option value=\"\">{{filter.help}}</option>\n <option *ngFor=\"let ch of l.choices\" [value]=\"ch.value\">{{ch.desc}}</option>\n </select>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }] });
2054
2203
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.2", ngImport: i0, type: ModelListTreeFilterComponent, decorators: [{
2055
2204
  type: Component,
2056
- args: [{ selector: 'data-model-list-tree-filter', standalone: true, imports: [CommonModule], template: "<p>model-list-tree-filter works!</p>" }]
2205
+ args: [{ selector: 'data-model-list-tree-filter', standalone: true, imports: [CommonModule, ReactiveFormsModule], template: "\n<div class=\"filteritem\" [ngClass]=\"filter.displayClasses || classes\">\n <div class=\"trash float-end\" (click)=\"disable()\"><i class=\"bi bi-trash\"></i></div>\n <label>{{filter.label}}</label>\n <div class=\"levelselect\" *ngFor=\"let l of tree.levels\">\n <select class=\"form-select form-select-sm\" [formControl]=\"l.fc\">\n <option value=\"\">{{filter.help}}</option>\n <option *ngFor=\"let ch of l.choices\" [value]=\"ch.value\">{{ch.desc}}</option>\n </select>\n </div>\n</div>" }]
2057
2206
  }], ctorParameters: function () { return []; }, propDecorators: { list: [{
2058
2207
  type: Input
2059
2208
  }], filter: [{
@@ -2242,6 +2391,9 @@ class ModelListFilter {
2242
2391
  getValue() {
2243
2392
  return `${this._value?.value}`;
2244
2393
  }
2394
+ get() {
2395
+ return this._value;
2396
+ }
2245
2397
  mtoggle(value, desc, notify = true) {
2246
2398
  if (this._mvalue.has(`${value}`)) {
2247
2399
  this._mvalue.delete(`${value}`);
@@ -2535,15 +2687,19 @@ class ModelListTextFilter extends ModelListFilter {
2535
2687
  }
2536
2688
  }
2537
2689
 
2538
- class ModelListTreeFilter extends ModelListFilter {
2690
+ class ModelListTreeFilter extends ModelListAutocompleteFilter {
2539
2691
  constructor(params) {
2540
2692
  super(params);
2541
- this.type = "tree";
2542
- if (this.label == "") {
2543
- this.label = "Sélectionnez dans la hiérarchie";
2693
+ this.maxLevel = 5;
2694
+ this.type = 'tree';
2695
+ if (this.label == '') {
2696
+ this.label = 'Sélectionnez dans la hiérarchie';
2544
2697
  }
2545
- if (this.help == "") {
2546
- this.help = "Texte à rechercher";
2698
+ if (this.help == '') {
2699
+ this.help = 'Texte à rechercher';
2700
+ }
2701
+ if (params.maxLevel) {
2702
+ this.maxLevel = params.maxLevel;
2547
2703
  }
2548
2704
  }
2549
2705
  }