@c8y/tutorial 1022.21.3 → 1022.27.0

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.
@@ -703,6 +703,20 @@ export default {
703
703
  description: 'An introduction to data points export selector example.',
704
704
  scope: 'self'
705
705
  },
706
+ {
707
+ name: 'Introduction to properties selector- inline usage',
708
+ module: 'propertiesSelectorInlineExampleProviders',
709
+ path: './src/selector/properties-selector-inline-example/properties-selector-inline.providers.ts',
710
+ description: 'An introduction to properties selector example- inline usage.',
711
+ scope: 'self'
712
+ },
713
+ {
714
+ name: 'Introduction to properties selector- drawer usage',
715
+ module: 'propertiesSelectorDrawerExampleProviders',
716
+ path: './src/selector/properties-selector-drawer-example/properties-selector-drawer.providers.ts',
717
+ description: 'An introduction to properties selector example- drawer usage.',
718
+ scope: 'self'
719
+ },
706
720
  {
707
721
  name: 'Introduction to asset selector device child',
708
722
  module: 'AssetSingleSelectModule',
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@c8y/tutorial",
3
- "version": "1022.21.3",
3
+ "version": "1022.27.0",
4
4
  "description": "This package is used to scaffold a tutorial for Cumulocity IoT Web SDK which explains a lot of concepts.",
5
5
  "dependencies": {
6
- "@c8y/style": "1022.21.3",
7
- "@c8y/ngx-components": "1022.21.3",
8
- "@c8y/client": "1022.21.3",
9
- "@c8y/bootstrap": "1022.21.3",
6
+ "@c8y/style": "1022.27.0",
7
+ "@c8y/ngx-components": "1022.27.0",
8
+ "@c8y/client": "1022.27.0",
9
+ "@c8y/bootstrap": "1022.27.0",
10
10
  "@angular/cdk": "^19.2.18",
11
11
  "ngx-bootstrap": "19.0.2",
12
12
  "leaflet": "1.9.4",
13
13
  "rxjs": "7.8.1"
14
14
  },
15
15
  "devDependencies": {
16
- "@c8y/options": "1022.21.3",
17
- "@c8y/devkit": "1022.21.3"
16
+ "@c8y/options": "1022.27.0",
17
+ "@c8y/devkit": "1022.27.0"
18
18
  },
19
19
  "peerDependencies": {
20
20
  "@angular/common": ">=19 <20"
@@ -0,0 +1,85 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { IIdentified, IManagedObject, InventoryService } from '@c8y/client';
4
+ import { BottomDrawerService, TitleComponent } from '@c8y/ngx-components';
5
+ import { AssetPropertySelectorDrawerComponent } from '@c8y/ngx-components/asset-properties';
6
+ import {
7
+ AssetSelectionChangeEvent,
8
+ AssetSelectorModule
9
+ } from '@c8y/ngx-components/assets-navigator';
10
+ import { SubAssetsModule } from '@c8y/ngx-components/sub-assets';
11
+ import { TooltipModule } from 'ngx-bootstrap/tooltip';
12
+ import { JsonPipe } from '@angular/common';
13
+
14
+ @Component({
15
+ selector: 'tut-properties-selector-drawer',
16
+ template: `<c8y-title>Properties selector- drawer</c8y-title>
17
+ <div class="d-flex row">
18
+ <div class="col-xs-12 col-md-6">
19
+ <div class="card">
20
+ <div class="card-inner-scroll d-flex d-col bg-component" style="height: 490px">
21
+ <c8y-asset-selector
22
+ [(ngModel)]="model"
23
+ [config]="{
24
+ groupsSelectable: true,
25
+ showUnassignedDevices: true,
26
+ showChildDevices: true
27
+ }"
28
+ (onSelected)="selectionChanged($event)"
29
+ ></c8y-asset-selector>
30
+ </div>
31
+ <div class="card-footer separator-top">
32
+ <button class="btn btn-primary" (click)="selectProperty()" [disabled]="!selectedAsset">
33
+ Select property
34
+ </button>
35
+ </div>
36
+ </div>
37
+ </div>
38
+
39
+ <div class="col-xs-12 col-md-6">
40
+ <pre class="inner-scroll m-0" style="height: 554px">{{ output | json }}</pre>
41
+ </div>
42
+ </div>`,
43
+ imports: [
44
+ AssetSelectorModule,
45
+ TitleComponent,
46
+ FormsModule,
47
+ SubAssetsModule,
48
+ TooltipModule,
49
+ JsonPipe
50
+ ]
51
+ })
52
+ export class PropertiesSelectorDrawerExampleComponent {
53
+ inventoryService = inject(InventoryService);
54
+ model: IIdentified;
55
+ selectedAsset: IManagedObject;
56
+ output: unknown;
57
+ bottomDrawerService = inject(BottomDrawerService);
58
+
59
+ selectionChanged(e: AssetSelectionChangeEvent) {
60
+ this.selectedAsset = e.change.item;
61
+ }
62
+
63
+ async selectProperty() {
64
+ const drawer = this.bottomDrawerService.openDrawer(AssetPropertySelectorDrawerComponent, {
65
+ disableClickOutside: true,
66
+ initialState: {
67
+ asset: this.selectedAsset,
68
+ config: {
69
+ selectMode: 'single',
70
+ expansionMode: 'collapsedByDefault',
71
+ showValue: true,
72
+ showKey: true,
73
+ emptyStateContent: 'default-properties'
74
+ }
75
+ }
76
+ });
77
+
78
+ try {
79
+ const resultOf = await drawer.instance.result;
80
+ this.output = resultOf;
81
+ } catch (ex) {
82
+ this.output = 'Cancelled';
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,19 @@
1
+ import { NavigatorNode, hookNavigator, hookRoute } from '@c8y/ngx-components';
2
+
3
+ export const propertiesSelectorDrawerExampleProviders = [
4
+ hookRoute({
5
+ path: 'selector/properties-selector-drawer-example',
6
+ loadComponent: () =>
7
+ import('./properties-selector-drawer.component').then(
8
+ m => m.PropertiesSelectorDrawerExampleComponent
9
+ )
10
+ }),
11
+ hookNavigator(
12
+ new NavigatorNode({
13
+ label: 'Properties selector drawer example',
14
+ path: '/selector/properties-selector-drawer-example',
15
+ icon: 'th-list',
16
+ priority: 4
17
+ })
18
+ )
19
+ ];
@@ -0,0 +1,197 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { IIdentified, IManagedObject, InventoryService } from '@c8y/client';
4
+ import { BottomDrawerService, C8yTranslatePipe, TitleComponent } from '@c8y/ngx-components';
5
+ import {
6
+ AssetPropertyActionDirective,
7
+ AssetPropertyListComponent,
8
+ AssetPropertyType
9
+ } from '@c8y/ngx-components/asset-properties';
10
+ import {
11
+ AssetSelectionChangeEvent,
12
+ AssetSelectorModule
13
+ } from '@c8y/ngx-components/assets-navigator';
14
+ import { SubAssetsModule } from '@c8y/ngx-components/sub-assets';
15
+ import { TooltipModule } from 'ngx-bootstrap/tooltip';
16
+ import { JsonPipe } from '@angular/common';
17
+
18
+ @Component({
19
+ selector: 'tut-properties-selector-inline',
20
+ template: `<c8y-title>Properties selector- inline</c8y-title>
21
+ <div class="d-flex-md row">
22
+ <div class="col-xs-12 col-md-3">
23
+ <div class="card">
24
+ <div class="card-inner-scroll d-flex d-col bg-component" style="height: 208px">
25
+ <c8y-asset-selector
26
+ class="bg-component"
27
+ [(ngModel)]="model"
28
+ [config]="{
29
+ groupsSelectable: true,
30
+ showUnassignedDevices: true,
31
+ showChildDevices: true
32
+ }"
33
+ (onSelected)="selectionChanged($event)"
34
+ ></c8y-asset-selector>
35
+ </div>
36
+ </div>
37
+ <div class="card bg-level-1 p-16">
38
+ <p class="text-medium">Config options</p>
39
+ <fieldset class="c8y-fieldset m-b-16">
40
+ <legend>Select mode</legend>
41
+ <div class="d-flex gap-16 p-b-8">
42
+ <label class="c8y-radio">
43
+ <input name="assetSelection" type="radio" value="multi" [(ngModel)]="multiSelect" />
44
+ <span></span>
45
+ <span class="small m-l-4">multi</span>
46
+ </label>
47
+ <label class="c8y-radio">
48
+ <input
49
+ name="assetSelection"
50
+ type="radio"
51
+ value="single"
52
+ [(ngModel)]="multiSelect"
53
+ />
54
+ <span></span>
55
+ <span class="small m-l-4">single</span>
56
+ </label>
57
+ <label class="c8y-radio">
58
+ <input name="assetSelection" type="radio" value="none" [(ngModel)]="multiSelect" />
59
+ <span></span>
60
+ <span class="small m-l-4">none</span>
61
+ </label>
62
+ </div>
63
+ </fieldset>
64
+ <fieldset class="c8y-fieldset m-t-0">
65
+ <legend>Expansion mode</legend>
66
+ <div class="d-flex gap-8 p-b-8">
67
+ <label class="c8y-radio">
68
+ <input
69
+ name="expansionMode"
70
+ type="radio"
71
+ value="expandedByDefault"
72
+ [(ngModel)]="expansionMode"
73
+ />
74
+ <span></span>
75
+ <span class="small m-l-4">expanded</span>
76
+ </label>
77
+ <label class="c8y-radio">
78
+ <input
79
+ name="expansionMode"
80
+ type="radio"
81
+ value="collapsedByDefault"
82
+ [(ngModel)]="expansionMode"
83
+ />
84
+ <span></span>
85
+ <span class="small m-l-4">collapsed</span>
86
+ </label>
87
+ <label class="c8y-radio">
88
+ <input
89
+ name="expansionMode"
90
+ type="radio"
91
+ value="nonCollapsible"
92
+ [(ngModel)]="expansionMode"
93
+ />
94
+ <span></span>
95
+ <span class="small m-l-4">nonCollapsible</span>
96
+ </label>
97
+ </div>
98
+ </fieldset>
99
+ <label class="c8y-switch">
100
+ <input type="checkbox" [(ngModel)]="searchable" />
101
+ <span></span>
102
+ <small>searchable</small>
103
+ </label>
104
+ <label class="c8y-switch m-0">
105
+ <input type="checkbox" [(ngModel)]="showHeader" />
106
+ <span></span>
107
+ <small>showHeader</small>
108
+ </label>
109
+ <label class="c8y-switch m-0">
110
+ <input type="checkbox" [(ngModel)]="showValue" />
111
+ <span></span>
112
+ <small>showValue</small>
113
+ </label>
114
+ <label class="c8y-switch m-0">
115
+ <input type="checkbox" [(ngModel)]="showKey" />
116
+ <span></span>
117
+ <small>showKey</small>
118
+ </label>
119
+ </div>
120
+ </div>
121
+ <div class="col-xs-12 col-md-5">
122
+ <div class="card">
123
+ <div class="card-inner-scroll d-flex d-col bg-component" style="height: 559px">
124
+ <c8y-asset-property-list
125
+ class="bg-component"
126
+ [asset]="selectedAsset"
127
+ [config]="{
128
+ selectMode: multiSelect,
129
+ showHeader: showHeader,
130
+ searchable: searchable,
131
+ showValue: showValue,
132
+ expansionMode: expansionMode,
133
+ showKey: showKey
134
+ }"
135
+ (selectedProperties)="onSelectedProperties($event)"
136
+ >
137
+ <button
138
+ class="btn-dot btn fit-h"
139
+ [attr.aria-label]="'Copy' | translate"
140
+ tooltip="{{ 'Copy' | translate }}"
141
+ type="button"
142
+ *c8yAssetPropertyAction="let context"
143
+ [delay]="500"
144
+ (click)="copyProperty(context)"
145
+ >
146
+ <i class="dlt-c8y-icon-copy"></i>
147
+ </button>
148
+ </c8y-asset-property-list>
149
+ </div>
150
+ </div>
151
+ </div>
152
+ <div class="col-xs-12 col-md-4">
153
+ <pre class="inner-scroll" style="height: 559px">{{ assetPropertiesOutput | json }}</pre>
154
+ </div>
155
+ </div>`,
156
+ standalone: true,
157
+ imports: [
158
+ AssetSelectorModule,
159
+ AssetPropertyListComponent,
160
+ TitleComponent,
161
+ FormsModule,
162
+ SubAssetsModule,
163
+ AssetPropertyActionDirective,
164
+ C8yTranslatePipe,
165
+ TooltipModule,
166
+ JsonPipe
167
+ ]
168
+ })
169
+ export class PropertiesSelectorInlineExampleComponent {
170
+ inventoryService = inject(InventoryService);
171
+ model: IIdentified;
172
+ selectedAsset: IManagedObject;
173
+ assetPropertiesOutput: AssetPropertyType[] | AssetPropertyType;
174
+ bottomDrawerService = inject(BottomDrawerService);
175
+
176
+ multiSelect: 'single' | 'multi' | 'none' = 'multi';
177
+ expansionMode: 'expandedByDefault' | 'collapsedByDefault' | 'nonCollapsible' =
178
+ 'expandedByDefault';
179
+ showHeader = true;
180
+ showValue = true;
181
+ showKey = true;
182
+ searchable = true;
183
+
184
+ selectionChanged(e: AssetSelectionChangeEvent) {
185
+ this.selectedAsset = e.change.item;
186
+ }
187
+
188
+ onSelectedProperties($event: AssetPropertyType[]) {
189
+ this.assetPropertiesOutput = $event;
190
+ // console.log('Selected properties:', $event);
191
+ }
192
+
193
+ copyProperty(context: AssetPropertyType) {
194
+ this.assetPropertiesOutput = context;
195
+ // console.log('Copy property:', context);
196
+ }
197
+ }
@@ -0,0 +1,19 @@
1
+ import { NavigatorNode, hookNavigator, hookRoute } from '@c8y/ngx-components';
2
+
3
+ export const propertiesSelectorInlineExampleProviders = [
4
+ hookRoute({
5
+ path: 'selector/properties-selector-inline-example',
6
+ loadComponent: () =>
7
+ import('./properties-selector-inline.component').then(
8
+ m => m.PropertiesSelectorInlineExampleComponent
9
+ )
10
+ }),
11
+ hookNavigator(
12
+ new NavigatorNode({
13
+ label: 'Properties selector inline example',
14
+ path: '/selector/properties-selector-inline-example',
15
+ icon: 'th-list',
16
+ priority: 4
17
+ })
18
+ )
19
+ ];