@ssv/ngx.command 3.0.0-dev.1 → 3.0.0-dev.1-dev.11

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.
package/README.md CHANGED
@@ -1,243 +1,243 @@
1
- [projectUri]: https://github.com/sketch7/ngx.command
2
- [changeLog]: ./CHANGELOG.md
3
- [releaseWorkflowWiki]: ./docs/RELEASE-WORKFLOW.md
4
-
5
- [npm]: https://www.npmjs.com
6
- [commandpatternwiki]: https://en.wikipedia.org/wiki/Command_pattern
7
-
8
- # @ssv/ngx.command
9
- [![CI](https://github.com/sketch7/ngx.command/actions/workflows/ci.yml/badge.svg)](https://github.com/sketch7/ngx.command/actions/workflows/ci.yml)
10
- [![npm version](https://badge.fury.io/js/%40ssv%2Fngx.command.svg)](https://badge.fury.io/js/%40ssv%2Fngx.command)
11
-
12
- [Command pattern][commandpatternwiki] implementation for angular. Command's are used to encapsulate information which is needed to perform an action.
13
-
14
- Primary usage is to disable a button when an action is executing, or not in a valid state (e.g. busy, invalid), and also to show an activity progress while executing.
15
-
16
- **Quick links**
17
-
18
- [Change logs][changeLog] | [Project Repository][projectUri]
19
-
20
- ## Installation
21
-
22
- Get library via [npm]
23
-
24
- ```bash
25
- npm install @ssv/ngx.command
26
- ```
27
-
28
- Choose the version corresponding to your Angular version:
29
-
30
- | Angular | library |
31
- | ------- | ------- |
32
- | 10+ | 2.x+ |
33
- | 4 to 9 | 1.x+ |
34
-
35
-
36
- # Usage
37
-
38
- ## Register module
39
-
40
- ```ts
41
- import { SsvCommandModule } from "@ssv/ngx.command";
42
-
43
- @NgModule({
44
- imports: [
45
- SsvCommandModule
46
- ]
47
- }
48
- export class AppModule {
49
- }
50
- ```
51
-
52
- ## Command
53
- In order to start working with Command, you need to create a new instance of it.
54
-
55
- ```ts
56
- import { CommandDirective, Command, CommandAsync, ICommand } from "@ssv/ngx.command";
57
-
58
- isValid$ = new BehaviorSubject(false);
59
-
60
- // use `CommandAsync` when execute function returns an observable/promise OR else 3rd argument must be true.
61
- saveCmd = new Command(() => this.save()), this.isValid$);
62
-
63
- // using CommandAsync
64
- saveCmd = new CommandAsync(() => Observable.timer(2000), this.isValid$);
65
-
66
- // using ICommand interface
67
- saveCmd: ICommand = new CommandAsync(() => Observable.timer(2000), this.isValid$);
68
- ```
69
-
70
- ## Command Attribute (Directive)
71
- Handles the command `canExecute$`, `isExecuting` and `execute` functions of the `Command`, in order to
72
- enable/disable, add/remove a cssClass while executing in order alter styling during execution (if desired)
73
- and execute when its enabled and clicked.
74
-
75
- Generally used on a `<button>` as below.
76
-
77
- ### Usage
78
-
79
- ```html
80
- <!-- simple usage -->
81
- <button [ssvCommand]="saveCmd">Save</button>
82
-
83
- <!-- using isExecuting + showing spinner -->
84
- <button [ssvCommand]="saveCmd">
85
- <i *ngIf="saveCmd.isExecuting" class="ai-circled ai-indicator ai-dark-spin small"></i>
86
- Save
87
- </button>
88
- ```
89
-
90
- #### Usage with params
91
- This is useful for collections (loops) or using multiple actions with different args.
92
- *NOTE: This will share the `isExecuting` when used with multiple controls.*
93
-
94
- ```html
95
- <!-- with single param -->
96
- <button [ssvCommand]="saveCmd" [ssvCommandParams]="{id: 1}">Save</button>
97
- <!--
98
- NOTE: if you have only 1 argument as an array, it should be enclosed within an array e.g. [['apple', 'banana']],
99
- else it will spread and you will arg1: "apple", arg2: "banana"
100
- -->
101
-
102
- <!-- with multi params -->
103
- <button [ssvCommand]="saveCmd" [ssvCommandParams]="[{id: 1}, 'hello', hero]">Save</button>
104
- ```
105
-
106
- #### Usage with command creator
107
- This is useful for collections (loops) or using multiple actions with different args, whilst not sharing `isExecuting`.
108
-
109
- ```html
110
- <button [ssvCommand]="{host: this, execute: removeHero$, canExecute: isValid$, params: [hero, 1337, 'xx']}">Remove</button>
111
- ```
112
-
113
- ##### canExecute with params
114
- ```html
115
- <button [ssvCommand]="{host: this, execute: removeHero$, canExecute: canRemoveHero$, params: [hero, 1337, 'xx']}">Remove</button>
116
- ```
117
-
118
- ```ts
119
- canRemoveHero$(hero: Hero, id: number, param2): Observable<boolean> {
120
- return of(id).pipe(
121
- map(x => x === "invulnerable")
122
- );
123
- }
124
- ```
125
-
126
- ## Usage without Attribute
127
- It can also be used as below without the command attribute.
128
-
129
- ```html
130
- <button
131
- [disabled]="!saveCmd.canExecute"
132
- (click)="saveCmd.execute()">
133
- Save
134
- </button>
135
- ```
136
-
137
- ## CommandRef Attribute (directive)
138
- Command creator ref, directive which allows creating Command in the template and associate it to a command (in order to share executions).
139
-
140
- ```html
141
- <div *ngFor="let hero of heroes">
142
- <div #actionCmd="ssvCommandRef" [ssvCommandRef]="{host: this, execute: removeHero$, canExecute: isValid$}" class="button-group">
143
- <button [ssvCommand]="actionCmd.command" [ssvCommandParams]="hero">
144
- Remove
145
- </button>
146
- <button [ssvCommand]="actionCmd.command" [ssvCommandParams]="hero">
147
- Remove
148
- </button>
149
- </div>
150
- </div>
151
- ```
152
-
153
- ## Utils
154
-
155
- ### canExecuteFromNgForm
156
- In order to use with `NgForm` easily, you can use the following utility method.
157
- This will make canExecute respond to `form.valid` and for `form.dirty` - also can optionally disable validity or dirty.
158
-
159
- ```ts
160
- import { CommandAsync, canExecuteFromNgForm } from "@ssv/ngx.command";
161
-
162
- loginCmd = new CommandAsync(this.login.bind(this), canExecuteFromNgForm(this.form));
163
-
164
- // options - disable dirty check
165
- loginCmd = new CommandAsync(this.login.bind(this), canExecuteFromNgForm(this.form, {
166
- dirty: false
167
- }));
168
-
169
- ```
170
-
171
-
172
- ## Configure
173
- In order to configure globally, you can do so as following:
174
-
175
- ```ts
176
- import { SsvCommandModule } from "@ssv/ngx.command";
177
-
178
- imports: [
179
- SsvCommandModule.forRoot({ executingCssClass: "is-busy" })
180
- ],
181
- ```
182
-
183
-
184
- ## Getting Started
185
-
186
- ### Setup Machine for Development
187
- Install/setup the following:
188
-
189
- - NodeJS v18.16.0+
190
- - Visual Studio Code or similar code editor
191
- - TypeScript 5.0+
192
- - Git + SourceTree, SmartGit or similar (optional)
193
- - Ensure to install **global NPM modules** using the following:
194
-
195
-
196
- ```bash
197
- npm install -g git gulp devtool
198
- ```
199
-
200
-
201
- ### Project Setup
202
- The following process need to be executed in order to get started.
203
-
204
- ```bash
205
- npm install
206
- ```
207
-
208
-
209
- ### Building the code
210
-
211
- ```bash
212
- npm run build
213
- ```
214
-
215
- ### Running the tests
216
-
217
- ```bash
218
- npm test
219
- ```
220
-
221
- #### Watch
222
- Handles compiling of changes.
223
-
224
- ```bash
225
- npm start
226
- ```
227
-
228
-
229
- #### Running Continuous Tests
230
- Spawns test runner and keep watching for changes.
231
-
232
- ```bash
233
- npm run tdd
234
- ```
235
-
236
-
237
- ### Preparation for Release
238
-
239
- - Update changelogs
240
- - bump version
241
-
242
-
1
+ [projectUri]: https://github.com/sketch7/ngx.command
2
+ [changeLog]: ./CHANGELOG.md
3
+ [releaseWorkflowWiki]: ./docs/RELEASE-WORKFLOW.md
4
+
5
+ [npm]: https://www.npmjs.com
6
+ [commandpatternwiki]: https://en.wikipedia.org/wiki/Command_pattern
7
+
8
+ # @ssv/ngx.command
9
+ [![CI](https://github.com/sketch7/ngx.command/actions/workflows/ci.yml/badge.svg)](https://github.com/sketch7/ngx.command/actions/workflows/ci.yml)
10
+ [![npm version](https://badge.fury.io/js/%40ssv%2Fngx.command.svg)](https://badge.fury.io/js/%40ssv%2Fngx.command)
11
+
12
+ [Command pattern][commandpatternwiki] implementation for angular. Command's are used to encapsulate information which is needed to perform an action.
13
+
14
+ Primary usage is to disable a button when an action is executing, or not in a valid state (e.g. busy, invalid), and also to show an activity progress while executing.
15
+
16
+ **Quick links**
17
+
18
+ [Change logs][changeLog] | [Project Repository][projectUri]
19
+
20
+ ## Installation
21
+
22
+ Get library via [npm]
23
+
24
+ ```bash
25
+ npm install @ssv/ngx.command
26
+ ```
27
+
28
+ Choose the version corresponding to your Angular version:
29
+
30
+ | Angular | library |
31
+ | ------- | ------- |
32
+ | 10+ | 2.x+ |
33
+ | 4 to 9 | 1.x+ |
34
+
35
+
36
+ # Usage
37
+
38
+ ## Register module
39
+
40
+ ```ts
41
+ import { SsvCommandModule } from "@ssv/ngx.command";
42
+
43
+ @NgModule({
44
+ imports: [
45
+ SsvCommandModule
46
+ ]
47
+ }
48
+ export class AppModule {
49
+ }
50
+ ```
51
+
52
+ ## Command
53
+ In order to start working with Command, you need to create a new instance of it.
54
+
55
+ ```ts
56
+ import { CommandDirective, Command, CommandAsync, ICommand } from "@ssv/ngx.command";
57
+
58
+ isValid$ = new BehaviorSubject(false);
59
+
60
+ // use `CommandAsync` when execute function returns an observable/promise OR else 3rd argument must be true.
61
+ saveCmd = new Command(() => this.save()), this.isValid$);
62
+
63
+ // using CommandAsync
64
+ saveCmd = new CommandAsync(() => Observable.timer(2000), this.isValid$);
65
+
66
+ // using ICommand interface
67
+ saveCmd: ICommand = new CommandAsync(() => Observable.timer(2000), this.isValid$);
68
+ ```
69
+
70
+ ## Command Attribute (Directive)
71
+ Handles the command `canExecute$`, `isExecuting` and `execute` functions of the `Command`, in order to
72
+ enable/disable, add/remove a cssClass while executing in order alter styling during execution (if desired)
73
+ and execute when its enabled and clicked.
74
+
75
+ Generally used on a `<button>` as below.
76
+
77
+ ### Usage
78
+
79
+ ```html
80
+ <!-- simple usage -->
81
+ <button [ssvCommand]="saveCmd">Save</button>
82
+
83
+ <!-- using isExecuting + showing spinner -->
84
+ <button [ssvCommand]="saveCmd">
85
+ <i *ngIf="saveCmd.isExecuting" class="ai-circled ai-indicator ai-dark-spin small"></i>
86
+ Save
87
+ </button>
88
+ ```
89
+
90
+ #### Usage with params
91
+ This is useful for collections (loops) or using multiple actions with different args.
92
+ *NOTE: This will share the `isExecuting` when used with multiple controls.*
93
+
94
+ ```html
95
+ <!-- with single param -->
96
+ <button [ssvCommand]="saveCmd" [ssvCommandParams]="{id: 1}">Save</button>
97
+ <!--
98
+ NOTE: if you have only 1 argument as an array, it should be enclosed within an array e.g. [['apple', 'banana']],
99
+ else it will spread and you will arg1: "apple", arg2: "banana"
100
+ -->
101
+
102
+ <!-- with multi params -->
103
+ <button [ssvCommand]="saveCmd" [ssvCommandParams]="[{id: 1}, 'hello', hero]">Save</button>
104
+ ```
105
+
106
+ #### Usage with command creator
107
+ This is useful for collections (loops) or using multiple actions with different args, whilst not sharing `isExecuting`.
108
+
109
+ ```html
110
+ <button [ssvCommand]="{host: this, execute: removeHero$, canExecute: isValid$, params: [hero, 1337, 'xx']}">Remove</button>
111
+ ```
112
+
113
+ ##### canExecute with params
114
+ ```html
115
+ <button [ssvCommand]="{host: this, execute: removeHero$, canExecute: canRemoveHero$, params: [hero, 1337, 'xx']}">Remove</button>
116
+ ```
117
+
118
+ ```ts
119
+ canRemoveHero$(hero: Hero, id: number, param2): Observable<boolean> {
120
+ return of(id).pipe(
121
+ map(x => x === "invulnerable")
122
+ );
123
+ }
124
+ ```
125
+
126
+ ## Usage without Attribute
127
+ It can also be used as below without the command attribute.
128
+
129
+ ```html
130
+ <button
131
+ [disabled]="!saveCmd.canExecute"
132
+ (click)="saveCmd.execute()">
133
+ Save
134
+ </button>
135
+ ```
136
+
137
+ ## CommandRef Attribute (directive)
138
+ Command creator ref, directive which allows creating Command in the template and associate it to a command (in order to share executions).
139
+
140
+ ```html
141
+ <div *ngFor="let hero of heroes">
142
+ <div #actionCmd="ssvCommandRef" [ssvCommandRef]="{host: this, execute: removeHero$, canExecute: isValid$}" class="button-group">
143
+ <button [ssvCommand]="actionCmd.command" [ssvCommandParams]="hero">
144
+ Remove
145
+ </button>
146
+ <button [ssvCommand]="actionCmd.command" [ssvCommandParams]="hero">
147
+ Remove
148
+ </button>
149
+ </div>
150
+ </div>
151
+ ```
152
+
153
+ ## Utils
154
+
155
+ ### canExecuteFromNgForm
156
+ In order to use with `NgForm` easily, you can use the following utility method.
157
+ This will make canExecute respond to `form.valid` and for `form.dirty` - also can optionally disable validity or dirty.
158
+
159
+ ```ts
160
+ import { CommandAsync, canExecuteFromNgForm } from "@ssv/ngx.command";
161
+
162
+ loginCmd = new CommandAsync(this.login.bind(this), canExecuteFromNgForm(this.form));
163
+
164
+ // options - disable dirty check
165
+ loginCmd = new CommandAsync(this.login.bind(this), canExecuteFromNgForm(this.form, {
166
+ dirty: false
167
+ }));
168
+
169
+ ```
170
+
171
+
172
+ ## Configure
173
+ In order to configure globally, you can do so as following:
174
+
175
+ ```ts
176
+ import { SsvCommandModule } from "@ssv/ngx.command";
177
+
178
+ imports: [
179
+ SsvCommandModule.forRoot({ executingCssClass: "is-busy" })
180
+ ],
181
+ ```
182
+
183
+
184
+ ## Getting Started
185
+
186
+ ### Setup Machine for Development
187
+ Install/setup the following:
188
+
189
+ - NodeJS v18.16.0+
190
+ - Visual Studio Code or similar code editor
191
+ - TypeScript 5.0+
192
+ - Git + SourceTree, SmartGit or similar (optional)
193
+ - Ensure to install **global NPM modules** using the following:
194
+
195
+
196
+ ```bash
197
+ npm install -g git gulp devtool
198
+ ```
199
+
200
+
201
+ ### Project Setup
202
+ The following process need to be executed in order to get started.
203
+
204
+ ```bash
205
+ npm install
206
+ ```
207
+
208
+
209
+ ### Building the code
210
+
211
+ ```bash
212
+ npm run build
213
+ ```
214
+
215
+ ### Running the tests
216
+
217
+ ```bash
218
+ npm test
219
+ ```
220
+
221
+ #### Watch
222
+ Handles compiling of changes.
223
+
224
+ ```bash
225
+ npm start
226
+ ```
227
+
228
+
229
+ #### Running Continuous Tests
230
+ Spawns test runner and keep watching for changes.
231
+
232
+ ```bash
233
+ npm run tdd
234
+ ```
235
+
236
+
237
+ ### Preparation for Release
238
+
239
+ - Update changelogs
240
+ - bump version
241
+
242
+
243
243
  Check out the [release workflow guide][releaseWorkflowWiki] in order to guide you creating a release and publishing it.
package/eslint.config.js CHANGED
@@ -1,43 +1,43 @@
1
- const nx = require('@nx/eslint-plugin');
2
- const baseConfig = require('../../eslint.config.js');
3
-
4
- module.exports = [
5
- ...baseConfig,
6
- {
7
- files: ['**/*.json'],
8
- rules: {
9
- '@nx/dependency-checks': ['error', { ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs}'] }],
10
- },
11
- languageOptions: { parser: require('jsonc-eslint-parser') },
12
- },
13
- ...nx.configs['flat/angular'],
14
- ...nx.configs['flat/angular-template'],
15
- {
16
- files: ['**/*.ts'],
17
- rules: {
18
- '@angular-eslint/directive-selector': [
19
- 'error',
20
- {
21
- type: 'attribute',
22
- prefix: 'ssv',
23
- style: 'camelCase',
24
- },
25
- ],
26
- '@angular-eslint/component-selector': [
27
- 'error',
28
- {
29
- type: 'element',
30
- prefix: 'ssv',
31
- style: 'kebab-case',
32
- },
33
- ],
34
- '@angular-eslint/directive-selector': 'off',
35
- '@angular-eslint/no-input-rename': 'off',
36
- },
37
- },
38
- {
39
- files: ['**/*.html'],
40
- // Override or add rules here
41
- rules: {},
42
- },
43
- ];
1
+ const nx = require('@nx/eslint-plugin');
2
+ const baseConfig = require('../../eslint.config.js');
3
+
4
+ module.exports = [
5
+ ...baseConfig,
6
+ {
7
+ files: ['**/*.json'],
8
+ rules: {
9
+ '@nx/dependency-checks': ['error', { ignoredFiles: ['{projectRoot}/eslint.config.{js,cjs,mjs}'] }],
10
+ },
11
+ languageOptions: { parser: require('jsonc-eslint-parser') },
12
+ },
13
+ ...nx.configs['flat/angular'],
14
+ ...nx.configs['flat/angular-template'],
15
+ {
16
+ files: ['**/*.ts'],
17
+ rules: {
18
+ '@angular-eslint/directive-selector': [
19
+ 'error',
20
+ {
21
+ type: 'attribute',
22
+ prefix: 'ssv',
23
+ style: 'camelCase',
24
+ },
25
+ ],
26
+ '@angular-eslint/component-selector': [
27
+ 'error',
28
+ {
29
+ type: 'element',
30
+ prefix: 'ssv',
31
+ style: 'kebab-case',
32
+ },
33
+ ],
34
+ '@angular-eslint/directive-selector': 'off',
35
+ '@angular-eslint/no-input-rename': 'off',
36
+ },
37
+ },
38
+ {
39
+ files: ['**/*.html'],
40
+ // Override or add rules here
41
+ rules: {},
42
+ },
43
+ ];
package/jest.config.ts CHANGED
@@ -1,21 +1,21 @@
1
- export default {
2
- displayName: '@ssv/ngx.command',
3
- preset: '../../jest.preset.js',
4
- setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
5
- coverageDirectory: '../../coverage/libs/ngx.command',
6
- transform: {
7
- '^.+\\.(ts|mjs|js|html)$': [
8
- 'jest-preset-angular',
9
- {
10
- tsconfig: '<rootDir>/tsconfig.spec.json',
11
- stringifyContentPathRegex: '\\.(html|svg)$',
12
- },
13
- ],
14
- },
15
- transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
16
- snapshotSerializers: [
17
- 'jest-preset-angular/build/serializers/no-ng-attributes',
18
- 'jest-preset-angular/build/serializers/ng-snapshot',
19
- 'jest-preset-angular/build/serializers/html-comment',
20
- ],
21
- };
1
+ export default {
2
+ displayName: '@ssv/ngx.command',
3
+ preset: '../../jest.preset.js',
4
+ setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
5
+ coverageDirectory: '../../coverage/libs/ngx.command',
6
+ transform: {
7
+ '^.+\\.(ts|mjs|js|html)$': [
8
+ 'jest-preset-angular',
9
+ {
10
+ tsconfig: '<rootDir>/tsconfig.spec.json',
11
+ stringifyContentPathRegex: '\\.(html|svg)$',
12
+ },
13
+ ],
14
+ },
15
+ transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
16
+ snapshotSerializers: [
17
+ 'jest-preset-angular/build/serializers/no-ng-attributes',
18
+ 'jest-preset-angular/build/serializers/ng-snapshot',
19
+ 'jest-preset-angular/build/serializers/html-comment',
20
+ ],
21
+ };
package/ng-package.json CHANGED
@@ -1,7 +1,7 @@
1
- {
2
- "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3
- "dest": "../../dist/libs/ngx.command",
4
- "lib": {
5
- "entryFile": "src/index.ts"
6
- }
7
- }
1
+ {
2
+ "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
3
+ "dest": "../../dist/libs/ngx.command",
4
+ "lib": {
5
+ "entryFile": "src/index.ts"
6
+ }
7
+ }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@ssv/ngx.command",
3
- "version": "3.0.0-dev.1",
3
+ "version": "3.0.0-dev.1-dev.11",
4
4
  "versionSuffix": "",
5
5
  "description": "Command pattern implementation for angular. Command used to encapsulate information which is needed to perform an action.",
6
6
  "keywords": [
7
7
  "sketch7",
8
8
  "ngx",
9
- "angular15",
9
+ "angular17",
10
10
  "angular",
11
11
  "ssv",
12
12
  "command",
@@ -22,8 +22,8 @@
22
22
  },
23
23
  "dependencies": {},
24
24
  "peerDependencies": {
25
- "@angular/core": ">=10.0.0",
26
- "@angular/forms": ">=10.0.0",
25
+ "@angular/core": ">=17.0.0",
26
+ "@angular/forms": ">=17.0.0",
27
27
  "rxjs": ">=6.0.0"
28
28
  },
29
29
  "sideEffects": false