Update MD2 editor
This commit is contained in:
parent
fd32ae5dcc
commit
f88cd21b33
180
package-lock.json
generated
180
package-lock.json
generated
@ -69,6 +69,7 @@
|
|||||||
"@angular/cli": "^17.3.3",
|
"@angular/cli": "^17.3.3",
|
||||||
"@angular/compiler-cli": "^17.3.3",
|
"@angular/compiler-cli": "^17.3.3",
|
||||||
"@angular/language-service": "17.3.3",
|
"@angular/language-service": "17.3.3",
|
||||||
|
"@angular/localize": "^17.3.3",
|
||||||
"@compodoc/compodoc": "1.0.1",
|
"@compodoc/compodoc": "1.0.1",
|
||||||
"@fortawesome/fontawesome-free": "^5.2.0",
|
"@fortawesome/fontawesome-free": "^5.2.0",
|
||||||
"@schematics/angular": "^14.1.3",
|
"@schematics/angular": "^14.1.3",
|
||||||
@ -856,6 +857,30 @@
|
|||||||
"node": "^18.13.0 || >=20.9.0"
|
"node": "^18.13.0 || >=20.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@angular/localize": {
|
||||||
|
"version": "17.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.3.tgz",
|
||||||
|
"integrity": "sha512-gahGKy0VBZ+KP6MUULGQMoi5SN3REwslaPvtomizzz9fdmqHfR8PPd1vOJSNm2IEVlvm1hv1dDRjPcR4DJwvaQ==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/core": "7.23.9",
|
||||||
|
"@types/babel__core": "7.20.5",
|
||||||
|
"fast-glob": "3.3.2",
|
||||||
|
"yargs": "^17.2.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"localize-extract": "tools/bundles/src/extract/cli.js",
|
||||||
|
"localize-migrate": "tools/bundles/src/migrate/cli.js",
|
||||||
|
"localize-translate": "tools/bundles/src/translate/cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^18.13.0 || >=20.9.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@angular/compiler": "17.3.3",
|
||||||
|
"@angular/compiler-cli": "17.3.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@angular/platform-browser": {
|
"node_modules/@angular/platform-browser": {
|
||||||
"version": "17.3.3",
|
"version": "17.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.3.tgz",
|
||||||
@ -1325,18 +1350,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-string-parser": {
|
"node_modules/@babel/helper-string-parser": {
|
||||||
"version": "7.24.1",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
|
||||||
"integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==",
|
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/helper-validator-identifier": {
|
"node_modules/@babel/helper-validator-identifier": {
|
||||||
"version": "7.22.20",
|
"version": "7.28.5",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
|
||||||
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
|
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@ -2687,14 +2712,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/types": {
|
"node_modules/@babel/types": {
|
||||||
"version": "7.24.0",
|
"version": "7.28.5",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
|
||||||
"integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
|
"integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/helper-string-parser": "^7.23.4",
|
"@babel/helper-string-parser": "^7.27.1",
|
||||||
"@babel/helper-validator-identifier": "^7.22.20",
|
"@babel/helper-validator-identifier": "^7.28.5"
|
||||||
"to-fast-properties": "^2.0.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
@ -12453,6 +12477,47 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/babel__core": {
|
||||||
|
"version": "7.20.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
|
||||||
|
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/parser": "^7.20.7",
|
||||||
|
"@babel/types": "^7.20.7",
|
||||||
|
"@types/babel__generator": "*",
|
||||||
|
"@types/babel__template": "*",
|
||||||
|
"@types/babel__traverse": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@types/babel__generator": {
|
||||||
|
"version": "7.27.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
|
||||||
|
"integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/types": "^7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@types/babel__template": {
|
||||||
|
"version": "7.4.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
|
||||||
|
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/parser": "^7.1.0",
|
||||||
|
"@babel/types": "^7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@types/babel__traverse": {
|
||||||
|
"version": "7.28.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
|
||||||
|
"integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/types": "^7.28.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@types/body-parser": {
|
"node_modules/@types/body-parser": {
|
||||||
"version": "1.19.5",
|
"version": "1.19.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
|
||||||
@ -29691,15 +29756,6 @@
|
|||||||
"node": ">=0.6.0"
|
"node": ">=0.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/to-fast-properties": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
|
|
||||||
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/to-object-path": {
|
"node_modules/to-object-path": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
|
||||||
@ -32340,6 +32396,18 @@
|
|||||||
"integrity": "sha512-OtdWNY0Syg4UvA8j2IhQJeq/UjWHYbRiyUcZjGKPRzuqIPjUhsmMyuW3zpi7Pwx2CpBzZXcik1Ra2WZ0gbwigg==",
|
"integrity": "sha512-OtdWNY0Syg4UvA8j2IhQJeq/UjWHYbRiyUcZjGKPRzuqIPjUhsmMyuW3zpi7Pwx2CpBzZXcik1Ra2WZ0gbwigg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@angular/localize": {
|
||||||
|
"version": "17.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/@angular/localize/-/localize-17.3.3.tgz",
|
||||||
|
"integrity": "sha512-gahGKy0VBZ+KP6MUULGQMoi5SN3REwslaPvtomizzz9fdmqHfR8PPd1vOJSNm2IEVlvm1hv1dDRjPcR4DJwvaQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/core": "7.23.9",
|
||||||
|
"@types/babel__core": "7.20.5",
|
||||||
|
"fast-glob": "3.3.2",
|
||||||
|
"yargs": "^17.2.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@angular/platform-browser": {
|
"@angular/platform-browser": {
|
||||||
"version": "17.3.3",
|
"version": "17.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.3.tgz",
|
||||||
@ -32679,15 +32747,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/helper-string-parser": {
|
"@babel/helper-string-parser": {
|
||||||
"version": "7.24.1",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
|
||||||
"integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==",
|
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/helper-validator-identifier": {
|
"@babel/helper-validator-identifier": {
|
||||||
"version": "7.22.20",
|
"version": "7.28.5",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
|
||||||
"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
|
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@babel/helper-validator-option": {
|
"@babel/helper-validator-option": {
|
||||||
@ -33607,14 +33675,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@babel/types": {
|
"@babel/types": {
|
||||||
"version": "7.24.0",
|
"version": "7.28.5",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
|
||||||
"integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
|
"integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@babel/helper-string-parser": "^7.23.4",
|
"@babel/helper-string-parser": "^7.27.1",
|
||||||
"@babel/helper-validator-identifier": "^7.22.20",
|
"@babel/helper-validator-identifier": "^7.28.5"
|
||||||
"to-fast-properties": "^2.0.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@colors/colors": {
|
"@colors/colors": {
|
||||||
@ -40050,6 +40117,47 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/babel__core": {
|
||||||
|
"version": "7.20.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
|
||||||
|
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.20.7",
|
||||||
|
"@babel/types": "^7.20.7",
|
||||||
|
"@types/babel__generator": "*",
|
||||||
|
"@types/babel__template": "*",
|
||||||
|
"@types/babel__traverse": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@types/babel__generator": {
|
||||||
|
"version": "7.27.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
|
||||||
|
"integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/types": "^7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@types/babel__template": {
|
||||||
|
"version": "7.4.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
|
||||||
|
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/parser": "^7.1.0",
|
||||||
|
"@babel/types": "^7.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@types/babel__traverse": {
|
||||||
|
"version": "7.28.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
|
||||||
|
"integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/types": "^7.28.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/body-parser": {
|
"@types/body-parser": {
|
||||||
"version": "1.19.5",
|
"version": "1.19.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
|
||||||
@ -53452,12 +53560,6 @@
|
|||||||
"os-tmpdir": "~1.0.2"
|
"os-tmpdir": "~1.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"to-fast-properties": {
|
|
||||||
"version": "2.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
|
|
||||||
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"to-object-path": {
|
"to-object-path": {
|
||||||
"version": "0.3.0",
|
"version": "0.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
|
||||||
|
|||||||
@ -89,6 +89,7 @@
|
|||||||
"@angular/cli": "^17.3.3",
|
"@angular/cli": "^17.3.3",
|
||||||
"@angular/compiler-cli": "^17.3.3",
|
"@angular/compiler-cli": "^17.3.3",
|
||||||
"@angular/language-service": "17.3.3",
|
"@angular/language-service": "17.3.3",
|
||||||
|
"@angular/localize": "^17.3.3",
|
||||||
"@compodoc/compodoc": "1.0.1",
|
"@compodoc/compodoc": "1.0.1",
|
||||||
"@fortawesome/fontawesome-free": "^5.2.0",
|
"@fortawesome/fontawesome-free": "^5.2.0",
|
||||||
"@schematics/angular": "^14.1.3",
|
"@schematics/angular": "^14.1.3",
|
||||||
|
|||||||
@ -3,14 +3,12 @@ import { ActivatedRoute } from '@angular/router';
|
|||||||
import { NbDialogService } from '@nebular/theme';
|
import { NbDialogService } from '@nebular/theme';
|
||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
import { first } from 'rxjs/operators';
|
import { first } from 'rxjs/operators';
|
||||||
import { inherits } from 'util';
|
|
||||||
import { CellGroupRoutineEvents } from '../../entity/CellGroupRoutineEvents';
|
import { CellGroupRoutineEvents } from '../../entity/CellGroupRoutineEvents';
|
||||||
import { CellGroupRoutineEventsService } from '../../services/crudServices/cell-group-routine-events.service';
|
import { CellGroupRoutineEventsService } from '../../services/crudServices/cell-group-routine-events.service';
|
||||||
import { MsgBoxService } from '../../services/msg-box.service';
|
import { MsgBoxService } from '../../services/msg-box.service';
|
||||||
import { StateService } from '../../services/state.service';
|
import { StateService } from '../../services/state.service';
|
||||||
import { FancySettings } from '../../ui/fancy-table/fancy-settings.model';
|
import { FancySettings } from '../../ui/fancy-table/fancy-settings.model';
|
||||||
import { FancyTableComponent } from '../../ui/fancy-table/fancy-table.component';
|
import { FancyTableComponent } from '../../ui/fancy-table/fancy-table.component';
|
||||||
import { ObjectUtils } from '../../utilities/object-utils';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ngx-cell-group-routine-events',
|
selector: 'ngx-cell-group-routine-events',
|
||||||
|
|||||||
@ -1,8 +1,5 @@
|
|||||||
import { ActivatedRoute } from "@angular/router";
|
import { ActivatedRoute } from "@angular/router";
|
||||||
import { basename } from "path";
|
|
||||||
import { Observable, Subject } from "rxjs";
|
import { Observable, Subject } from "rxjs";
|
||||||
import { ScreenBase } from "../ScreenBase";
|
|
||||||
import { ICrudService } from "../services/crudServices/crud.service";
|
|
||||||
import { PastoralDomainService } from "../services/crudServices/pastoral-domain.service";
|
import { PastoralDomainService } from "../services/crudServices/pastoral-domain.service";
|
||||||
import { StateService } from "../services/state.service";
|
import { StateService } from "../services/state.service";
|
||||||
import { first } from 'rxjs/operators';
|
import { first } from 'rxjs/operators';
|
||||||
|
|||||||
@ -12,10 +12,10 @@
|
|||||||
</nb-accordion>
|
</nb-accordion>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<md2-html-editor></md2-html-editor>
|
|
||||||
</div>
|
</div>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
<md2-html-editor></md2-html-editor>
|
||||||
|
|
||||||
<div class="col-12 col-md-5">
|
<div class="col-12 col-md-5">
|
||||||
<nb-card>
|
<nb-card>
|
||||||
|
|||||||
@ -25,7 +25,7 @@ import { NumberUtils } from '../../utilities/number-utils';
|
|||||||
changeDetection: ChangeDetectionStrategy.OnPush
|
changeDetection: ChangeDetectionStrategy.OnPush
|
||||||
})
|
})
|
||||||
export class MassiveDarkness2Component extends MD2Base implements OnInit {
|
export class MassiveDarkness2Component extends MD2Base implements OnInit {
|
||||||
HeroClass: HeroClass
|
HeroClass = HeroClass;
|
||||||
constructor(
|
constructor(
|
||||||
private fileService: FileService,
|
private fileService: FileService,
|
||||||
private initService: MD2InitService,
|
private initService: MD2InitService,
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { stringify } from "querystring"
|
|
||||||
import { Observable, Subject, Subscription } from "rxjs"
|
import { Observable, Subject, Subscription } from "rxjs"
|
||||||
import { first } from "rxjs/operators"
|
import { first } from "rxjs/operators"
|
||||||
import { MD2Service } from "../../services/MD2/md2.service"
|
import { MD2Service } from "../../services/MD2/md2.service"
|
||||||
|
|||||||
@ -1,20 +1,50 @@
|
|||||||
<kendo-editor [value]="value" (valueChange)="onChange($event)" (blur)="onTouched()" [disabled]="disabled" [schema]="messageTemplateSchema"
|
<kendo-editor [value]="value" (valueChange)="onChange($event)" (blur)="onTouched()" [disabled]="disabled"
|
||||||
[iframeCss]="{ content: customCssClass }">
|
[schema]="messageTemplateSchema" [iframe]="false">
|
||||||
<kendo-toolbar>
|
<kendo-toolbar>
|
||||||
<!-- Standard editing tools -->
|
<!-- Standard editing tools -->
|
||||||
<kendo-toolbar-button kendoEditorBold></kendo-toolbar-button>
|
<kendo-toolbar-buttongroup>
|
||||||
<kendo-toolbar-button kendoEditorItalic></kendo-toolbar-button>
|
<kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>
|
||||||
<kendo-toolbar-button kendoEditorUnderline></kendo-toolbar-button>
|
<kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>
|
||||||
<kendo-toolbar-separator></kendo-toolbar-separator>
|
<kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>
|
||||||
<kendo-toolbar-button kendoEditorUnorderedList></kendo-toolbar-button>
|
<kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>
|
||||||
<kendo-toolbar-button kendoEditorOrderedList></kendo-toolbar-button>
|
</kendo-toolbar-buttongroup>
|
||||||
<kendo-toolbar-separator></kendo-toolbar-separator>
|
<kendo-toolbar-buttongroup>
|
||||||
<kendo-toolbar-button kendoEditorUndo></kendo-toolbar-button>
|
<kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>
|
||||||
<kendo-toolbar-button kendoEditorRedo></kendo-toolbar-button>
|
<kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>
|
||||||
<kendo-toolbar-separator></kendo-toolbar-separator>
|
</kendo-toolbar-buttongroup>
|
||||||
|
<kendo-toolbar-buttongroup>
|
||||||
|
<kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>
|
||||||
|
</kendo-toolbar-buttongroup>
|
||||||
|
<kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>
|
||||||
|
<kendo-toolbar-dropdownlist kendoEditorFontSize #fontSizeDropdown
|
||||||
|
[data]="fontSizeData"></kendo-toolbar-dropdownlist>
|
||||||
|
<kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>
|
||||||
|
<kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>
|
||||||
|
<kendo-toolbar-colorpicker kendoEditorBackColor view="gradient"></kendo-toolbar-colorpicker>
|
||||||
|
<kendo-toolbar-buttongroup>
|
||||||
|
<kendo-toolbar-button kendoEditorInsertUnorderedListButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorInsertOrderedListButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>
|
||||||
|
</kendo-toolbar-buttongroup>
|
||||||
|
<kendo-toolbar-button kendoEditorBlockquoteButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorSelectAllButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-buttongroup>
|
||||||
|
<kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>
|
||||||
|
</kendo-toolbar-buttongroup>
|
||||||
|
<kendo-toolbar-buttongroup>
|
||||||
|
<kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>
|
||||||
|
</kendo-toolbar-buttongroup>
|
||||||
|
<kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorInsertImageButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>
|
||||||
|
<kendo-toolbar-button kendoEditorCleanFormattingButton></kendo-toolbar-button>
|
||||||
<!-- Custom MD2 Icon button -->
|
<!-- Custom MD2 Icon button -->
|
||||||
<kendo-toolbar-button (click)="showInsertMD2Icon()">
|
<kendo-toolbar-button text="Insert Icon" (click)="showInsertMD2Icon()"></kendo-toolbar-button>
|
||||||
Insert Icon
|
|
||||||
</kendo-toolbar-button>
|
|
||||||
</kendo-toolbar>
|
</kendo-toolbar>
|
||||||
</kendo-editor>
|
</kendo-editor>
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import { Component, ElementRef, EventEmitter, Inject, Input, NgZone, Output, PLATFORM_ID, Renderer2, ViewChild } from '@angular/core';
|
import { Component, ElementRef, EventEmitter, Inject, Input, NgZone, Output, PLATFORM_ID, Renderer2, ViewChild, AfterViewInit } from '@angular/core';
|
||||||
import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors } from '@angular/forms';
|
import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors } from '@angular/forms';
|
||||||
import { EditorComponent } from '@progress/kendo-angular-editor';
|
import { EditorComponent, NodeSpec, schema, Schema, FontSizeItem } from '@progress/kendo-angular-editor';
|
||||||
|
|
||||||
import { MsgBoxService } from '../../../services/msg-box.service';
|
import { MsgBoxService } from '../../../services/msg-box.service';
|
||||||
import { DropDownOption } from '../../../entity/dropDownOption';
|
import { DropDownOption } from '../../../entity/dropDownOption';
|
||||||
@ -9,14 +9,15 @@ import { first } from 'rxjs/operators';
|
|||||||
import { MD2StateService } from '../../../services/MD2/md2-state.service';
|
import { MD2StateService } from '../../../services/MD2/md2-state.service';
|
||||||
import { MD2IconPickerDlgComponent } from './md2-icon-picker-dlg.component';
|
import { MD2IconPickerDlgComponent } from './md2-icon-picker-dlg.component';
|
||||||
import { NbDialogService } from '@nebular/theme';
|
import { NbDialogService } from '@nebular/theme';
|
||||||
|
import { DOMParser as ProseMirrorDOMParser } from 'prosemirror-model';
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'md2-html-editor',
|
selector: 'md2-html-editor',
|
||||||
templateUrl: './md2-html-editor.component.html',
|
templateUrl: './md2-html-editor.component.html',
|
||||||
styleUrl: './md2-html-editor.component.scss'
|
styleUrl: './md2-html-editor.component.scss'
|
||||||
})
|
})
|
||||||
export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
export class MD2HtmlEditorComponent implements ControlValueAccessor, AfterViewInit {
|
||||||
@ViewChild(EditorComponent) editor: EditorComponent;
|
@ViewChild(EditorComponent) editor: EditorComponent;
|
||||||
|
@ViewChild('fontSizeDropdown') fontSizeDropdown: any;
|
||||||
|
|
||||||
value: string = '';
|
value: string = '';
|
||||||
disabled: boolean = false;
|
disabled: boolean = false;
|
||||||
@ -24,6 +25,26 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
messageTemplateSchema = this.createCustomSchema();
|
messageTemplateSchema = this.createCustomSchema();
|
||||||
customCssClass = '.MD2Icon{font-family: "Massive Darkness 2", sans-serif !important; font-size: 40px; margin-left:5px} body{font-size: 30px; }';
|
customCssClass = '.MD2Icon{font-family: "Massive Darkness 2", sans-serif !important; font-size: 40px; margin-left:5px} body{font-size: 30px; }';
|
||||||
|
|
||||||
|
// Default font size: 30px
|
||||||
|
fontSizeData: FontSizeItem[] = [
|
||||||
|
{ size: 30, text: '30px' },
|
||||||
|
{ size: 8, text: '8px' },
|
||||||
|
{ size: 10, text: '10px' },
|
||||||
|
{ size: 12, text: '12px' },
|
||||||
|
{ size: 14, text: '14px' },
|
||||||
|
{ size: 16, text: '16px' },
|
||||||
|
{ size: 18, text: '18px' },
|
||||||
|
{ size: 20, text: '20px' },
|
||||||
|
{ size: 24, text: '24px' },
|
||||||
|
{ size: 30, text: '30px' },
|
||||||
|
{ size: 36, text: '36px' },
|
||||||
|
{ size: 48, text: '48px' },
|
||||||
|
{ size: 60, text: '60px' },
|
||||||
|
{ size: 72, text: '72px' }
|
||||||
|
];
|
||||||
|
|
||||||
|
defaultFontSize: FontSizeItem = { size: 30, text: '30px' };
|
||||||
|
|
||||||
// ControlValueAccessor interface
|
// ControlValueAccessor interface
|
||||||
private onChangeFn = (value: string) => { };
|
private onChangeFn = (value: string) => { };
|
||||||
private onTouchedFn = () => { };
|
private onTouchedFn = () => { };
|
||||||
@ -36,6 +57,23 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngAfterViewInit(): void {
|
||||||
|
// Set default font size after view initialization
|
||||||
|
// The fontSizeDropdown is the EditorFontSizeComponent instance
|
||||||
|
setTimeout(() => {
|
||||||
|
if (this.fontSizeDropdown) {
|
||||||
|
// Access the fontSizeDropDownList component which has the defaultItem property
|
||||||
|
if (this.fontSizeDropdown.fontSizeDropDownList) {
|
||||||
|
this.fontSizeDropdown.fontSizeDropDownList.defaultItem = this.defaultFontSize;
|
||||||
|
}
|
||||||
|
// Also try setting it directly on the component if it has the property
|
||||||
|
if (this.fontSizeDropdown.defaultItem !== undefined) {
|
||||||
|
this.fontSizeDropdown.defaultItem = this.defaultFontSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
// ControlValueAccessor implementation
|
// ControlValueAccessor implementation
|
||||||
writeValue(value: string): void {
|
writeValue(value: string): void {
|
||||||
this.value = value || '';
|
this.value = value || '';
|
||||||
@ -68,6 +106,8 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
closeOnEsc: true
|
closeOnEsc: true
|
||||||
}).onClose.pipe(first()).subscribe((html: string) => {
|
}).onClose.pipe(first()).subscribe((html: string) => {
|
||||||
if (html && this.editor) {
|
if (html && this.editor) {
|
||||||
|
this.insertAfterSelection(html, true);
|
||||||
|
return;
|
||||||
// Insert the HTML content at the current cursor position
|
// Insert the HTML content at the current cursor position
|
||||||
// Use ProseMirror's dispatch method to insert content at cursor
|
// Use ProseMirror's dispatch method to insert content at cursor
|
||||||
const view = this.editor.view;
|
const view = this.editor.view;
|
||||||
@ -144,7 +184,7 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
if (contentNode) {
|
if (contentNode) {
|
||||||
const transaction = view.state.tr.insert(0, contentNode);
|
const transaction = view.state.tr.insert(0, contentNode);
|
||||||
view.dispatch(transaction);
|
view.dispatch(transaction);
|
||||||
this.onValueChanged(this.editor.value);
|
this.onChange(this.editor.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +203,7 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
if (contentNode) {
|
if (contentNode) {
|
||||||
const transaction = view.state.tr.insert(endPos, contentNode);
|
const transaction = view.state.tr.insert(endPos, contentNode);
|
||||||
view.dispatch(transaction);
|
view.dispatch(transaction);
|
||||||
this.onValueChanged(this.editor.value);
|
this.onChange(this.editor.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,7 +222,7 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
if (contentNode) {
|
if (contentNode) {
|
||||||
const transaction = view.state.tr.insert(from, contentNode);
|
const transaction = view.state.tr.insert(from, contentNode);
|
||||||
view.dispatch(transaction);
|
view.dispatch(transaction);
|
||||||
this.onValueChanged(this.editor.value);
|
this.onChange(this.editor.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +241,7 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
if (contentNode) {
|
if (contentNode) {
|
||||||
const transaction = view.state.tr.insert(to, contentNode);
|
const transaction = view.state.tr.insert(to, contentNode);
|
||||||
view.dispatch(transaction);
|
view.dispatch(transaction);
|
||||||
this.onValueChanged(this.editor.value);
|
this.onChange(this.editor.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,7 +268,7 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
const transaction = view.state.tr.replaceWith(from, to, contentNode);
|
const transaction = view.state.tr.replaceWith(from, to, contentNode);
|
||||||
view.dispatch(transaction);
|
view.dispatch(transaction);
|
||||||
}
|
}
|
||||||
this.onValueChanged(this.editor.value);
|
this.onChange(this.editor.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -286,7 +326,7 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
if (contentNode) {
|
if (contentNode) {
|
||||||
const transaction = view.state.tr.insert(safePos, contentNode);
|
const transaction = view.state.tr.insert(safePos, contentNode);
|
||||||
view.dispatch(transaction);
|
view.dispatch(transaction);
|
||||||
this.onValueChanged(this.editor.value);
|
this.onChange(this.editor.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,21 +349,21 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
if (contentNode) {
|
if (contentNode) {
|
||||||
const transaction = view.state.tr.replaceWith(safeFrom, safeTo, contentNode);
|
const transaction = view.state.tr.replaceWith(safeFrom, safeTo, contentNode);
|
||||||
view.dispatch(transaction);
|
view.dispatch(transaction);
|
||||||
this.onValueChanged(this.editor.value);
|
this.onChange(this.editor.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
showVariablePicker() {
|
// showVariablePicker() {
|
||||||
this.easyEditorService.openTableMultiPicker(this.variables, this.variableTableSettings, "Please select a variable").pipe(first()).subscribe(result => {
|
// this.easyEditorService.openTableMultiPicker(this.variables, this.variableTableSettings, "Please select a variable").pipe(first()).subscribe(result => {
|
||||||
if (result) {
|
// if (result) {
|
||||||
result.forEach(c => {
|
// result.forEach(c => {
|
||||||
this.insertAfterSelection(`<${RbjTagNode} class="rbj-tag" ${RbjTagIdAttribute}="${c.name}" ${RbjTagValueAttribute}="${c.name}">${c.name}</${RbjTagNode}>`, true);
|
// this.insertAfterSelection(`<${RbjTagNode} class="rbj-tag" ${RbjTagIdAttribute}="${c.name}" ${RbjTagValueAttribute}="${c.name}">${c.name}</${RbjTagNode}>`, true);
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
// Private methods
|
// Private methods
|
||||||
@ -342,9 +382,10 @@ export class MD2HtmlEditorComponent implements ControlValueAccessor {
|
|||||||
export const rbjTagNodeSpec: NodeSpec = {
|
export const rbjTagNodeSpec: NodeSpec = {
|
||||||
// Define the node attributes for the tag
|
// Define the node attributes for the tag
|
||||||
attrs: {
|
attrs: {
|
||||||
"rbj-tag-id": { default: "" },
|
"md2-icon": { default: "" },
|
||||||
"tag-value": { default: "" },
|
"class": { default: "" },
|
||||||
"tag-preview": { default: "" }
|
// "tag-value": { default: "" },
|
||||||
|
// "tag-preview": { default: "" }
|
||||||
},
|
},
|
||||||
// Specify that this node should be treated as an inline element
|
// Specify that this node should be treated as an inline element
|
||||||
inline: true,
|
inline: true,
|
||||||
@ -355,23 +396,27 @@ export const rbjTagNodeSpec: NodeSpec = {
|
|||||||
|
|
||||||
// Define how the node should be rendered in the DOM
|
// Define how the node should be rendered in the DOM
|
||||||
toDOM: (node) => {
|
toDOM: (node) => {
|
||||||
let tagPreview = node.attrs["tag-preview"];
|
let md2IconText = node.attrs["md2-icon"] as string;
|
||||||
let displayValue = tagPreview == 'true' ? node.attrs["tag-value"] : node.attrs["rbj-tag-id"];
|
let classValue = node.attrs["class"] as string;
|
||||||
|
if (classValue.includes('dice')) {
|
||||||
|
md2IconText = '';
|
||||||
|
}
|
||||||
|
// let displayValue = tagPreview == 'true' ? node.attrs["tag-value"] : node.attrs["rbj-tag-id"];
|
||||||
|
|
||||||
return [
|
return [
|
||||||
"span",
|
"span",
|
||||||
{
|
{
|
||||||
class: "rbj-tag",
|
class: classValue,
|
||||||
"rbj-tag-id": node.attrs["rbj-tag-id"],
|
// "rbj-tag-id": node.attrs["rbj-tag-id"],
|
||||||
"tag-marker": node.attrs["tag-marker"],
|
// "tag-marker": node.attrs["tag-marker"],
|
||||||
"tag-value": node.attrs["tag-value"],
|
// "tag-value": node.attrs["tag-value"],
|
||||||
"tag-preview": node.attrs["tag-preview"],
|
// "tag-preview": node.attrs["tag-preview"],
|
||||||
//contenteditable: "false",
|
contenteditable: "false",
|
||||||
//spellcheck: "false",
|
//spellcheck: "false", style="font-size: 36px;"
|
||||||
style: "display: inline;"
|
style: "display: inline;"
|
||||||
},
|
},
|
||||||
//node.attrs["tag-marker"] + node.attrs["tag-value"] // Display the tag content directly
|
//node.attrs["tag-marker"] + node.attrs["tag-value"] // Display the tag content directly
|
||||||
displayValue
|
md2IconText
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -379,32 +424,20 @@ export const rbjTagNodeSpec: NodeSpec = {
|
|||||||
parseDOM: [
|
parseDOM: [
|
||||||
{
|
{
|
||||||
// Look for span elements with class rbj-tag (higher priority)
|
// Look for span elements with class rbj-tag (higher priority)
|
||||||
tag: "span[rbj-tag-id]",
|
tag: "span[md2-icon]",
|
||||||
priority: 51, // Higher priority to catch before other parsers
|
priority: 51, // Higher priority to catch before other parsers
|
||||||
// Extract attributes from the DOM element
|
// Extract attributes from the DOM element
|
||||||
getAttrs: (dom) => {
|
getAttrs: (dom) => {
|
||||||
const element = dom as HTMLElement;
|
const element = dom as HTMLElement;
|
||||||
// Must have rbj-tag-id attribute to be valid
|
// Must have rbj-tag-id attribute to be valid
|
||||||
if (!element.hasAttribute("rbj-tag-id")) {
|
if (!element.hasAttribute("md2-icon")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
"rbj-tag-id": element.getAttribute("rbj-tag-id") || "",
|
"md2-icon": element.getAttribute("md2-icon") || "",
|
||||||
"tag-preview": element.getAttribute("tag-preview") || "false",
|
"class": element.className || "",
|
||||||
"tag-value": element.getAttribute("tag-value") || element.getAttribute("rbj-tag-id")
|
// "tag-preview": element.getAttribute("tag-preview") || "false",
|
||||||
};
|
// "tag-value": element.getAttribute("tag-value") || element.getAttribute("rbj-tag-id")
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
// Look for div elements with rbj-tag-id attribute (for backward compatibility)
|
|
||||||
tag: "div[rbj-tag-id]",
|
|
||||||
// Extract attributes from the DOM element
|
|
||||||
getAttrs: (dom) => {
|
|
||||||
const element = dom as HTMLElement;
|
|
||||||
return {
|
|
||||||
"rbj-tag-id": element.getAttribute("rbj-tag-id") || "",
|
|
||||||
"tag-preview": element.getAttribute("tag-preview") || "false",
|
|
||||||
"tag-value": element.getAttribute("tag-value") || element.getAttribute("rbj-tag-id")
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,11 +11,11 @@ import { MD2StateService } from '../../../services/MD2/md2-state.service';
|
|||||||
<h5>Insert MD2 Icon</h5>
|
<h5>Insert MD2 Icon</h5>
|
||||||
</nb-card-header>
|
</nb-card-header>
|
||||||
<nb-card-body>
|
<nb-card-body>
|
||||||
<div class="icon-grid">
|
<div class="md2-icon-grid">
|
||||||
<div
|
<div
|
||||||
*ngFor="let iconData of iconList"
|
*ngFor="let iconData of iconList"
|
||||||
(click)="selectIcon(iconData)"
|
(click)="selectIcon(iconData)"
|
||||||
class="icon-item"
|
class="icon-item" title="{{iconData.name}}"
|
||||||
[innerHTML]="iconData.html">
|
[innerHTML]="iconData.html">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -26,12 +26,13 @@ import { MD2StateService } from '../../../services/MD2/md2-state.service';
|
|||||||
</nb-card>
|
</nb-card>
|
||||||
`,
|
`,
|
||||||
styles: [`
|
styles: [`
|
||||||
.icon-grid {
|
.md2-icon-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(60px, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(60px, 1fr));
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
max-height: 400px;
|
max-height: 400px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
width:400px;
|
||||||
}
|
}
|
||||||
.icon-item {
|
.icon-item {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@ -42,11 +43,12 @@ import { MD2StateService } from '../../../services/MD2/md2-state.service';
|
|||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
transition: all 0.2s;
|
transition: all 0.2s;
|
||||||
|
font-size: 30px;
|
||||||
}
|
}
|
||||||
.icon-item:hover {
|
.icon-item:hover {
|
||||||
background-color: #f0f0f0;
|
background-color: #f0f0f0;
|
||||||
border-color: #007bff;
|
border-color: #007bff;
|
||||||
transform: scale(1.1);
|
//transform: scale(1.1);
|
||||||
}
|
}
|
||||||
`]
|
`]
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { NbDialogService } from '@nebular/theme';
|
import { NbDialogService } from '@nebular/theme';
|
||||||
import { stringify } from 'querystring';
|
|
||||||
import { first } from 'rxjs/operators';
|
import { first } from 'rxjs/operators';
|
||||||
import { DropDownOption } from '../../../entity/dropDownOption';
|
import { DropDownOption } from '../../../entity/dropDownOption';
|
||||||
import { FileService } from '../../../services/file.service';
|
import { FileService } from '../../../services/file.service';
|
||||||
@ -10,7 +9,6 @@ import { MD2Service } from '../../../services/MD2/md2.service';
|
|||||||
import { MsgBoxService } from '../../../services/msg-box.service';
|
import { MsgBoxService } from '../../../services/msg-box.service';
|
||||||
import { StateService } from '../../../services/state.service';
|
import { StateService } from '../../../services/state.service';
|
||||||
import { ADIcon } from '../../../ui/alert-dlg/alert-dlg.model';
|
import { ADIcon } from '../../../ui/alert-dlg/alert-dlg.model';
|
||||||
import { ArrayUtils } from '../../../utilities/array-utils';
|
|
||||||
import { NumberUtils } from '../../../utilities/number-utils';
|
import { NumberUtils } from '../../../utilities/number-utils';
|
||||||
import { StringUtils } from '../../../utilities/string-utils';
|
import { StringUtils } from '../../../utilities/string-utils';
|
||||||
import { CoreGameMobFactories } from '../factorys/mobs/CoreGame';
|
import { CoreGameMobFactories } from '../factorys/mobs/CoreGame';
|
||||||
|
|||||||
@ -31,9 +31,9 @@ export class MD2StateService {
|
|||||||
cssClass += ' g-color-aqua ';
|
cssClass += ' g-color-aqua ';
|
||||||
}
|
}
|
||||||
if (icon < MD2Icon.RedDice) {
|
if (icon < MD2Icon.RedDice) {
|
||||||
return `<span class='MD2Icon ${cssClass}'>${String.fromCharCode(65 + icon)}</span>`
|
return `<span md2-icon='${String.fromCharCode(65 + icon)}' class='MD2Icon ${cssClass}'>${String.fromCharCode(65 + icon)}</span>`
|
||||||
} else {
|
} else {
|
||||||
return `<span class='MD2Icon dice ${MD2Icon[icon].replace('Dice', '')} ${cssClass}'></span>`;
|
return `<span md2-icon='${String.fromCharCode(65 + icon)}' class='MD2Icon dice ${MD2Icon[icon].replace('Dice', '')} ${cssClass}'></span>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -178,165 +178,165 @@ export class CombinedKeyCrudService<T> implements ICrudService<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// Type definitions
|
// // Type definitions
|
||||||
type TextResponse = { message: string };
|
// type TextResponse = { message: string };
|
||||||
/**
|
// /**
|
||||||
* Base CRUD service that targets the provided controller path.
|
// * Base CRUD service that targets the provided controller path.
|
||||||
*
|
// *
|
||||||
* It mirrors the endpoints of CrudBaseApiController<T>:
|
// * It mirrors the endpoints of CrudBaseApiController<T>:
|
||||||
* GET /api/{controller}
|
// * GET /api/{controller}
|
||||||
* GET /api/{controller}/{id}
|
// * GET /api/{controller}/{id}
|
||||||
* POST /api/{controller} -> string
|
// * POST /api/{controller} -> string
|
||||||
* POST /api/{controller}/batch -> string[]
|
// * POST /api/{controller}/batch -> string[]
|
||||||
* PUT /api/{controller}
|
// * PUT /api/{controller}
|
||||||
* PUT /api/{controller}/batch -> number
|
// * PUT /api/{controller}/batch -> number
|
||||||
* DELETE /api/{controller}/{id}
|
// * DELETE /api/{controller}/{id}
|
||||||
* DELETE /api/{controller}/batch -> text summary
|
// * DELETE /api/{controller}/batch -> text summary
|
||||||
* GET /api/{controller}/{id}/exists -> boolean
|
// * GET /api/{controller}/{id}/exists -> boolean
|
||||||
* GET /api/{controller}/count -> number
|
// * GET /api/{controller}/count -> number
|
||||||
*/
|
// */
|
||||||
@Injectable({ providedIn: 'root' })
|
// @Injectable({ providedIn: 'root' })
|
||||||
export class CrudBaseApiService<T extends object> {
|
// export class CrudBaseApiService<T extends object> {
|
||||||
/**
|
// /**
|
||||||
* Example: baseUrl = 'https://your-api', controller = 'Customer' →
|
// * Example: baseUrl = 'https://your-api', controller = 'Customer' →
|
||||||
* endpoint = 'https://your-api/api/Customer'
|
// * endpoint = 'https://your-api/api/Customer'
|
||||||
*/
|
// */
|
||||||
protected readonly endpoint: string;
|
// protected readonly endpoint: string;
|
||||||
|
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* @param http Angular HttpClient
|
// * @param http Angular HttpClient
|
||||||
* @param baseUrl API root without trailing slash (e.g., environment.apiBaseUrl)
|
// * @param baseUrl API root without trailing slash (e.g., environment.apiBaseUrl)
|
||||||
* @param controllerName Controller name (e.g., 'Customer', 'Orders')
|
// * @param controllerName Controller name (e.g., 'Customer', 'Orders')
|
||||||
*/
|
// */
|
||||||
constructor(
|
// constructor(
|
||||||
protected http: HttpClient,
|
// protected http: HttpClient,
|
||||||
protected apiConfig: ApiConfigService,
|
// protected apiConfig: ApiConfigService,
|
||||||
@Inject(String) private controllerName: string
|
// @Inject(String) private controllerName: string
|
||||||
) {
|
// ) {
|
||||||
this.endpoint = apiConfig.getApiUrl(this.controllerName);
|
// this.endpoint = apiConfig.getApiUrl(this.controllerName);
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** Optional default headers (JSON). Override in subclasses if needed. */
|
// /** Optional default headers (JSON). Override in subclasses if needed. */
|
||||||
protected get jsonHeaders(): HttpHeaders {
|
// protected get jsonHeaders(): HttpHeaders {
|
||||||
return new HttpHeaders({ 'Content-Type': 'application/json' });
|
// return new HttpHeaders({ 'Content-Type': 'application/json' });
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** Shared error handler that surfaces useful messages. */
|
// /** Shared error handler that surfaces useful messages. */
|
||||||
protected handleError(error: HttpErrorResponse): Observable<never> {
|
// protected handleError(error: HttpErrorResponse): Observable<never> {
|
||||||
let msg = 'Unknown error';
|
// let msg = 'Unknown error';
|
||||||
if (error.error instanceof Blob) {
|
// if (error.error instanceof Blob) {
|
||||||
// In case backend returns text/plain; charset=utf-8 as Blob
|
// // In case backend returns text/plain; charset=utf-8 as Blob
|
||||||
return throwError(() => new Error('Server returned an error blob'));
|
// return throwError(() => new Error('Server returned an error blob'));
|
||||||
}
|
// }
|
||||||
if (typeof error.error === 'string') msg = error.error;
|
// if (typeof error.error === 'string') msg = error.error;
|
||||||
else if (error.error?.message) msg = error.error.message;
|
// else if (error.error?.message) msg = error.error.message;
|
||||||
else if (error.message) msg = error.message;
|
// else if (error.message) msg = error.message;
|
||||||
return throwError(() => new Error(msg));
|
// return throwError(() => new Error(msg));
|
||||||
}
|
// }
|
||||||
/** Prepare the response for the given entity. Override in subclasses if needed. */
|
// /** Prepare the response for the given entity. Override in subclasses if needed. */
|
||||||
protected prepareResponse(response: T): T {
|
// protected prepareResponse(response: T): T {
|
||||||
// Do nothing by default
|
// // Do nothing by default
|
||||||
return response;
|
// return response;
|
||||||
}
|
// }
|
||||||
|
|
||||||
/** GET /api/{controller} */
|
// /** GET /api/{controller} */
|
||||||
getAll(): Observable<T[]> {
|
// getAll(): Observable<T[]> {
|
||||||
return this.http
|
// return this.http
|
||||||
.get<T[]>(this.endpoint)
|
// .get<T[]>(this.endpoint)
|
||||||
.pipe(
|
// .pipe(
|
||||||
map(response => {
|
// map(response => {
|
||||||
|
|
||||||
for (let i = 0; i < response.length; i++) {
|
// for (let i = 0; i < response.length; i++) {
|
||||||
const element = response[i];
|
// const element = response[i];
|
||||||
response[i] = this.prepareResponse(element);
|
// response[i] = this.prepareResponse(element);
|
||||||
}
|
// }
|
||||||
return response;
|
// return response;
|
||||||
}),
|
// }),
|
||||||
catchError(err => this.handleError(err)));
|
// catchError(err => this.handleError(err)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** GET /api/{controller}/{id} */
|
// /** GET /api/{controller}/{id} */
|
||||||
getById(id: string): Observable<T> {
|
// getById(id: string): Observable<T> {
|
||||||
return this.http
|
// return this.http
|
||||||
.get<T>(`${this.endpoint}/${id}`)
|
// .get<T>(`${this.endpoint}/${id}`)
|
||||||
.pipe(
|
// .pipe(
|
||||||
map(response => this.prepareResponse(response)),
|
// map(response => this.prepareResponse(response)),
|
||||||
catchError(err => this.handleError(err)));
|
// catchError(err => this.handleError(err)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** POST /api/{controller} -> string */
|
// /** POST /api/{controller} -> string */
|
||||||
create(entity: T): Observable<string> {
|
// create(entity: T): Observable<string> {
|
||||||
return this.http
|
// return this.http
|
||||||
.post<string>(this.endpoint, entity, { headers: this.jsonHeaders })
|
// .post<string>(this.endpoint, entity, { headers: this.jsonHeaders })
|
||||||
.pipe(catchError(err => this.handleError(err)));
|
// .pipe(catchError(err => this.handleError(err)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** POST /api/{controller}/batch -> string[] */
|
// /** POST /api/{controller}/batch -> string[] */
|
||||||
createRange(entities: T[]): Observable<string[]> {
|
// createRange(entities: T[]): Observable<string[]> {
|
||||||
return this.http
|
// return this.http
|
||||||
.post<string[]>(`${this.endpoint}/batch`, entities, { headers: this.jsonHeaders })
|
// .post<string[]>(`${this.endpoint}/batch`, entities, { headers: this.jsonHeaders })
|
||||||
.pipe(catchError(err => this.handleError(err)));
|
// .pipe(catchError(err => this.handleError(err)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** PUT /api/{controller} */
|
// /** PUT /api/{controller} */
|
||||||
update(entity: T): Observable<void> {
|
// update(entity: T): Observable<void> {
|
||||||
return this.http
|
// return this.http
|
||||||
.put<void>(this.endpoint, entity, { headers: this.jsonHeaders })
|
// .put<void>(this.endpoint, entity, { headers: this.jsonHeaders })
|
||||||
.pipe(catchError(err => this.handleError(err)));
|
// .pipe(catchError(err => this.handleError(err)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** PUT /api/{controller}/batch -> number (updated count) */
|
// /** PUT /api/{controller}/batch -> number (updated count) */
|
||||||
updateRange(entities: T[]): Observable<number> {
|
// updateRange(entities: T[]): Observable<number> {
|
||||||
return this.http
|
// return this.http
|
||||||
.put<number>(`${this.endpoint}/batch`, entities, { headers: this.jsonHeaders })
|
// .put<number>(`${this.endpoint}/batch`, entities, { headers: this.jsonHeaders })
|
||||||
.pipe(catchError(err => this.handleError(err)));
|
// .pipe(catchError(err => this.handleError(err)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** DELETE /api/{controller}/{id} */
|
// /** DELETE /api/{controller}/{id} */
|
||||||
delete(id: string): Observable<void> {
|
// delete(id: string): Observable<void> {
|
||||||
return this.http
|
// return this.http
|
||||||
.delete<void>(`${this.endpoint}/${id}`)
|
// .delete<void>(`${this.endpoint}/${id}`)
|
||||||
.pipe(catchError(err => this.handleError(err)));
|
// .pipe(catchError(err => this.handleError(err)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** DELETE /api/{controller}/batch -> text summary */
|
// /** DELETE /api/{controller}/batch -> text summary */
|
||||||
deleteRange(ids: string[]): Observable<TextResponse> {
|
// deleteRange(ids: string[]): Observable<TextResponse> {
|
||||||
// API returns a plain text message; map it into a TextResponse for convenience
|
// // API returns a plain text message; map it into a TextResponse for convenience
|
||||||
return this.http
|
// return this.http
|
||||||
.delete(`${this.endpoint}/batch`, {
|
// .delete(`${this.endpoint}/batch`, {
|
||||||
body: ids,
|
// body: ids,
|
||||||
headers: this.jsonHeaders
|
// headers: this.jsonHeaders
|
||||||
})
|
// })
|
||||||
.pipe(
|
// .pipe(
|
||||||
map((response: any) => ({ message: response || 'Batch delete completed' })),
|
// map((response: any) => ({ message: response || 'Batch delete completed' })),
|
||||||
catchError(err => this.handleError(err))
|
// catchError(err => this.handleError(err))
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** GET /api/{controller}/{id}/exists -> boolean */
|
// /** GET /api/{controller}/{id}/exists -> boolean */
|
||||||
exists(id: string): Observable<boolean> {
|
// exists(id: string): Observable<boolean> {
|
||||||
return this.http
|
// return this.http
|
||||||
.get<boolean>(`${this.endpoint}/${id}/exists`)
|
// .get<boolean>(`${this.endpoint}/${id}/exists`)
|
||||||
.pipe(catchError(err => this.handleError(err)));
|
// .pipe(catchError(err => this.handleError(err)));
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** GET /api/{controller}/count -> number */
|
// /** GET /api/{controller}/count -> number */
|
||||||
count(): Observable<number> {
|
// count(): Observable<number> {
|
||||||
return this.http
|
// return this.http
|
||||||
.get<number>(`${this.endpoint}/count`)
|
// .get<number>(`${this.endpoint}/count`)
|
||||||
.pipe(catchError(err => this.handleError(err)));
|
// .pipe(catchError(err => this.handleError(err)));
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
//import { FtTagType } from "../components/fancy-table/fancy-row-column.model";
|
//import { FtTagType } from "../components/fancy-table/fancy-row-column.model";
|
||||||
//import { AddressInfo } from "../models/contactInfo.model";
|
//import { AddressInfo } from "../models/contactInfo.model";
|
||||||
|
|
||||||
import { stringify } from "querystring";
|
|
||||||
import { AddressInfo } from "../entity/PastoralDomain";
|
import { AddressInfo } from "../entity/PastoralDomain";
|
||||||
|
|
||||||
export class StringUtils {
|
export class StringUtils {
|
||||||
|
|||||||
@ -41,6 +41,7 @@
|
|||||||
}
|
}
|
||||||
.MD2Icon {
|
.MD2Icon {
|
||||||
font-family: "Massive Darkness 2", sans-serif !important;
|
font-family: "Massive Darkness 2", sans-serif !important;
|
||||||
|
//font-size: 20px;
|
||||||
//font-size: 50px;
|
//font-size: 50px;
|
||||||
|
|
||||||
&.attack::before {
|
&.attack::before {
|
||||||
|
|||||||
@ -31,6 +31,9 @@
|
|||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" />
|
||||||
|
|
||||||
<link rel="stylesheet" href="./assets/home/css/styles.op-architecture.css">
|
<link rel="stylesheet" href="./assets/home/css/styles.op-architecture.css">
|
||||||
|
<link href="https://unpkg.com/@progress/kendo-theme-fluent@12.2.0/dist/fluent-main.css" rel="stylesheet" />
|
||||||
|
|
||||||
|
|
||||||
<!-- <link rel="stylesheet" href="./assets/home/css/">
|
<!-- <link rel="stylesheet" href="./assets/home/css/">
|
||||||
<link rel="stylesheet" href="./assets/home/css/">
|
<link rel="stylesheet" href="./assets/home/css/">
|
||||||
<link rel="stylesheet" href="./assets/home/css/"> -->
|
<link rel="stylesheet" href="./assets/home/css/"> -->
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
/// <reference types="@angular/localize" />
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @license
|
* @license
|
||||||
* Copyright Akveo. All Rights Reserved.
|
* Copyright Akveo. All Rights Reserved.
|
||||||
|
|||||||
@ -40,7 +40,7 @@ import 'zone.js'; // Included with Angular CLI.
|
|||||||
*/
|
*/
|
||||||
import 'core-js/es7/array';
|
import 'core-js/es7/array';
|
||||||
import 'core-js/es7/object';
|
import 'core-js/es7/object';
|
||||||
|
import '@angular/localize/init';
|
||||||
if (typeof SVGElement.prototype.contains === 'undefined') {
|
if (typeof SVGElement.prototype.contains === 'undefined') {
|
||||||
SVGElement.prototype.contains = HTMLDivElement.prototype.contains;
|
SVGElement.prototype.contains = HTMLDivElement.prototype.contains;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,10 @@
|
|||||||
"extends": "../tsconfig.json",
|
"extends": "../tsconfig.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"outDir": "../out-tsc/app",
|
"outDir": "../out-tsc/app",
|
||||||
"baseUrl": "./"
|
"baseUrl": "./",
|
||||||
|
"types": [
|
||||||
|
"@angular/localize"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"main.ts",
|
"main.ts",
|
||||||
|
|||||||
@ -5,7 +5,8 @@
|
|||||||
"baseUrl": "./",
|
"baseUrl": "./",
|
||||||
"types": [
|
"types": [
|
||||||
"jasmine",
|
"jasmine",
|
||||||
"node"
|
"node",
|
||||||
|
"@angular/localize"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user