fix bottom bar, migrate placeholder

This commit is contained in:
_Bastler 2022-12-11 10:29:49 +01:00
parent 159d19e939
commit 3d7dc4d03c
16 changed files with 167 additions and 170 deletions

View File

@ -2,7 +2,7 @@
"$schema": "./node_modules/@angular/service-worker/config/schema.json", "$schema": "./node_modules/@angular/service-worker/config/schema.json",
"index": "/index.html", "index": "/index.html",
"appData": { "appData": {
"version": "1.5.4" "version": "1.5.5"
}, },
"assetGroups": [ "assetGroups": [
{ {

181
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "bstlboard", "name": "bstlboard",
"version": "1.5.4", "version": "1.5.5",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "bstlboard", "name": "bstlboard",
"version": "1.5.4", "version": "1.5.5",
"license": "AGPL3", "license": "AGPL3",
"dependencies": { "dependencies": {
"@angular-material-components/datetime-picker": "^9.0.0", "@angular-material-components/datetime-picker": "^9.0.0",
@ -3726,14 +3726,11 @@
"yarn": ">= 1.13.0" "yarn": ">= 1.13.0"
} }
}, },
"node_modules/@socket.io/base64-arraybuffer": { "node_modules/@socket.io/component-emitter": {
"version": "1.0.2", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
"integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
"dev": true, "dev": true
"engines": {
"node": ">= 0.6.0"
}
}, },
"node_modules/@tootallnate/once": { "node_modules/@tootallnate/once": {
"version": "2.0.0", "version": "2.0.0",
@ -3763,12 +3760,6 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"node_modules/@types/component-emitter": {
"version": "1.2.11",
"resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
"integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==",
"dev": true
},
"node_modules/@types/connect": { "node_modules/@types/connect": {
"version": "3.4.35", "version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@ -3795,10 +3786,13 @@
"dev": true "dev": true
}, },
"node_modules/@types/cors": { "node_modules/@types/cors": {
"version": "2.8.12", "version": "2.8.13",
"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
"integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
"dev": true "dev": true,
"dependencies": {
"@types/node": "*"
}
}, },
"node_modules/@types/eslint": { "node_modules/@types/eslint": {
"version": "8.4.1", "version": "8.4.1",
@ -4183,9 +4177,9 @@
} }
}, },
"node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": {
"version": "2.0.2", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"big.js": "^5.2.2", "big.js": "^5.2.2",
@ -5224,12 +5218,6 @@
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true "dev": true
}, },
"node_modules/component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
"dev": true
},
"node_modules/compressible": { "node_modules/compressible": {
"version": "2.0.18", "version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@ -6061,9 +6049,9 @@
} }
}, },
"node_modules/engine.io": { "node_modules/engine.io": {
"version": "6.1.3", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
"integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/cookie": "^0.4.1", "@types/cookie": "^0.4.1",
@ -6082,13 +6070,10 @@
} }
}, },
"node_modules/engine.io-parser": { "node_modules/engine.io-parser": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
"integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
"dev": true, "dev": true,
"dependencies": {
"@socket.io/base64-arraybuffer": "~1.0.2"
},
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"
} }
@ -11607,9 +11592,9 @@
} }
}, },
"node_modules/resolve-url-loader/node_modules/loader-utils": { "node_modules/resolve-url-loader/node_modules/loader-utils": {
"version": "2.0.2", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"big.js": "^5.2.2", "big.js": "^5.2.2",
@ -12210,36 +12195,35 @@
} }
}, },
"node_modules/socket.io": { "node_modules/socket.io": {
"version": "4.4.1", "version": "4.5.4",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
"integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"accepts": "~1.3.4", "accepts": "~1.3.4",
"base64id": "~2.0.0", "base64id": "~2.0.0",
"debug": "~4.3.2", "debug": "~4.3.2",
"engine.io": "~6.1.0", "engine.io": "~6.2.1",
"socket.io-adapter": "~2.3.3", "socket.io-adapter": "~2.4.0",
"socket.io-parser": "~4.0.4" "socket.io-parser": "~4.2.1"
}, },
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=10.0.0"
} }
}, },
"node_modules/socket.io-adapter": { "node_modules/socket.io-adapter": {
"version": "2.3.3", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
"integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==",
"dev": true "dev": true
}, },
"node_modules/socket.io-parser": { "node_modules/socket.io-parser": {
"version": "4.0.4", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
"integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/component-emitter": "^1.2.10", "@socket.io/component-emitter": "~3.1.0",
"component-emitter": "~1.3.0",
"debug": "~4.3.1" "debug": "~4.3.1"
}, },
"engines": { "engines": {
@ -16573,10 +16557,10 @@
"jsonc-parser": "3.2.0" "jsonc-parser": "3.2.0"
} }
}, },
"@socket.io/base64-arraybuffer": { "@socket.io/component-emitter": {
"version": "1.0.2", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
"integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
"dev": true "dev": true
}, },
"@tootallnate/once": { "@tootallnate/once": {
@ -16604,12 +16588,6 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/component-emitter": {
"version": "1.2.11",
"resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
"integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==",
"dev": true
},
"@types/connect": { "@types/connect": {
"version": "3.4.35", "version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@ -16636,10 +16614,13 @@
"dev": true "dev": true
}, },
"@types/cors": { "@types/cors": {
"version": "2.8.12", "version": "2.8.13",
"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz",
"integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==",
"dev": true "dev": true,
"requires": {
"@types/node": "*"
}
}, },
"@types/eslint": { "@types/eslint": {
"version": "8.4.1", "version": "8.4.1",
@ -17010,9 +16991,9 @@
}, },
"dependencies": { "dependencies": {
"loader-utils": { "loader-utils": {
"version": "2.0.2", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true, "dev": true,
"requires": { "requires": {
"big.js": "^5.2.2", "big.js": "^5.2.2",
@ -17796,12 +17777,6 @@
"integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
"dev": true "dev": true
}, },
"component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
"dev": true
},
"compressible": { "compressible": {
"version": "2.0.18", "version": "2.0.18",
"resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@ -18449,9 +18424,9 @@
} }
}, },
"engine.io": { "engine.io": {
"version": "6.1.3", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz",
"integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/cookie": "^0.4.1", "@types/cookie": "^0.4.1",
@ -18467,13 +18442,10 @@
} }
}, },
"engine.io-parser": { "engine.io-parser": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
"integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==",
"dev": true, "dev": true
"requires": {
"@socket.io/base64-arraybuffer": "~1.0.2"
}
}, },
"enhanced-resolve": { "enhanced-resolve": {
"version": "5.12.0", "version": "5.12.0",
@ -22615,9 +22587,9 @@
}, },
"dependencies": { "dependencies": {
"loader-utils": { "loader-utils": {
"version": "2.0.2", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true, "dev": true,
"requires": { "requires": {
"big.js": "^5.2.2", "big.js": "^5.2.2",
@ -23074,33 +23046,32 @@
"dev": true "dev": true
}, },
"socket.io": { "socket.io": {
"version": "4.4.1", "version": "4.5.4",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.4.tgz",
"integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", "integrity": "sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"accepts": "~1.3.4", "accepts": "~1.3.4",
"base64id": "~2.0.0", "base64id": "~2.0.0",
"debug": "~4.3.2", "debug": "~4.3.2",
"engine.io": "~6.1.0", "engine.io": "~6.2.1",
"socket.io-adapter": "~2.3.3", "socket.io-adapter": "~2.4.0",
"socket.io-parser": "~4.0.4" "socket.io-parser": "~4.2.1"
} }
}, },
"socket.io-adapter": { "socket.io-adapter": {
"version": "2.3.3", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
"integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==",
"dev": true "dev": true
}, },
"socket.io-parser": { "socket.io-parser": {
"version": "4.0.4", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz",
"integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/component-emitter": "^1.2.10", "@socket.io/component-emitter": "~3.1.0",
"component-emitter": "~1.3.0",
"debug": "~4.3.1" "debug": "~4.3.1"
} }
}, },

View File

@ -1,6 +1,6 @@
{ {
"name": "bstlboard", "name": "bstlboard",
"version": "1.5.4", "version": "1.5.5",
"license": "AGPL3", "license": "AGPL3",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",

View File

@ -1,11 +1,13 @@
<div class="container"> <div class="container">
<mat-progress-bar *ngIf="!entry" mode="indeterminate"></mat-progress-bar> <mat-progress-bar *ngIf="!entry" mode="indeterminate"></mat-progress-bar>
<form [formGroup]="form" (ngSubmit)="entry.id ? update() : create()" #formDirective="ngForm" *ngIf="entry && settings"> <form [formGroup]="form" (ngSubmit)="entry.id ? update() : create()" #formDirective="ngForm"
*ngIf="entry && settings">
<mat-card> <mat-card>
<mat-card-content> <mat-card-content>
<p>{{ (entry.id ? 'submission.edit' : 'submission.info') | i18n}}</p> <p>{{ (entry.id ? 'submission.edit' : 'submission.info') | i18n}}</p>
<mat-form-field> <mat-form-field>
<mat-select placeholder="{{'submission.entryType' | i18n}}" formControlName="entryType"> <mat-label>{{'submission.entryType' | i18n}}</mat-label>
<mat-select formControlName="entryType">
<mat-select-trigger> <mat-select-trigger>
<mat-icon>{{'entryType.' + entryType + '.icon' | i18n}}</mat-icon> {{'entryType.' + entryType | i18n}} <mat-icon>{{'entryType.' + entryType + '.icon' | i18n}}</mat-icon> {{'entryType.' + entryType | i18n}}
</mat-select-trigger> </mat-select-trigger>
@ -16,23 +18,24 @@
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<input matInput placeholder="{{'submission.url' | i18n}}" formControlName="url" type="url" <mat-label>{{'submission.url' | i18n}}</mat-label>
[required]="entryType == 'LINK'" matAutofocus> <input matInput formControlName="url" type="url" [required]="entryType == 'LINK'" matAutofocus>
<mat-error *ngIf="hasError('url')"> <mat-error *ngIf="hasError('url')">
{{'submission.url.error' | i18n}} {{'submission.url.error' | i18n}}
</mat-error> </mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<input matInput placeholder="{{'submission.title' | i18n}}" formControlName="title" type="text" required <mat-label>{{'submission.title' | i18n}}</mat-label>
(focus)="onTitleFocus($event)"> <input matInput formControlName="title" type="text" required (focus)="onTitleFocus($event)">
<mat-error> <mat-error>
{{'submission.title.error' | i18n}} {{'submission.title.error' | i18n}}
</mat-error> </mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<textarea matAutosize matAutosizeMinRows="3" matInput placeholder="{{'submission.text' | i18n}}" <mat-label>{{'submission.text' | i18n}}</mat-label>
[required]="entryType != 'LINK'" formControlName="text"></textarea> <textarea matAutosize matAutosizeMinRows="3" matInput [required]="entryType != 'LINK'"
formControlName="text"></textarea>
<mat-error> <mat-error>
{{'submission.text.error' | i18n}} {{'submission.text.error' | i18n}}
</mat-error> </mat-error>

View File

@ -24,15 +24,15 @@
{{'login.invalid' | i18n}} {{'login.invalid' | i18n}}
</mat-error> </mat-error>
<mat-form-field> <mat-form-field>
<input id="username" name="username" matInput placeholder="{{'username' | i18n}}" required <mat-label>{{'username' | i18n}}</mat-label>
matAutofocus> <input id="username" name="username" matInput required matAutofocus>
<mat-error> <mat-error>
{{'username.missing' | i18n}} {{'username.missing' | i18n}}
</mat-error> </mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<input id="password" name="password" matInput type="password" <mat-label>{{'password' | i18n}}</mat-label>
placeholder="{{'password' | i18n}}" required> <input id="password" name="password" matInput type="password" required>
<mat-error> <mat-error>
{{'password.invalid.hint' | i18n}} {{'password.invalid.hint' | i18n}}
</mat-error> </mat-error>

View File

@ -5,8 +5,8 @@
<input matInput [formControl]="searchFormControl"> <input matInput [formControl]="searchFormControl">
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<mat-select placeholder="{{'search.types' | i18n}}" [value]="searchType" <mat-label>{{'search.types' | i18n}}</mat-label>
(selectionChange)="searchType = $event.value; refresh()"> <mat-select [value]="searchType" (selectionChange)="searchType = $event.value; refresh()">
<mat-select-trigger> <mat-select-trigger>
<span *ngIf="searchType"> <span *ngIf="searchType">
<mat-icon>{{'search.types.' + searchType + '.icon' | i18n}}</mat-icon> {{'search.types.' + <mat-icon>{{'search.types.' + searchType + '.icon' | i18n}}</mat-icon> {{'search.types.' +
@ -24,8 +24,8 @@
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<mat-select placeholder="{{'search.byDate' | i18n}}" [value]="byDate" <mat-label>{{'search.byDate' | i18n}}</mat-label>
(selectionChange)="byDate = $event.value; refresh()"> <mat-select [value]="byDate" (selectionChange)="byDate = $event.value; refresh()">
<mat-select-trigger> <mat-select-trigger>
<mat-icon>{{'search.byDate.' + byDate + '.icon' | i18n}}</mat-icon> {{'search.byDate.' + <mat-icon>{{'search.byDate.' + byDate + '.icon' | i18n}}</mat-icon> {{'search.byDate.' +
byDate | i18n}} byDate | i18n}}
@ -41,7 +41,8 @@
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<mat-select placeholder="{{'search.asc' | i18n}}" [value]="asc" (selectionChange)="asc = $event.value; refresh()"> <mat-label>{{'search.asc' | i18n}}</mat-label>
<mat-select [value]="asc" (selectionChange)="asc = $event.value; refresh()">
<mat-select-trigger> <mat-select-trigger>
<mat-icon>{{'search.asc.' + asc + '.icon' | i18n}}</mat-icon> {{'search.asc.' + <mat-icon>{{'search.asc.' + asc + '.icon' | i18n}}</mat-icon> {{'search.asc.' +
asc | i18n}} asc | i18n}}

View File

@ -4,14 +4,15 @@
<mat-card-content> <mat-card-content>
<mat-card-title><a routerLink="/u/{{user.username}}">{{user.username}}</a></mat-card-title> <mat-card-title><a routerLink="/u/{{user.username}}">{{user.username}}</a></mat-card-title>
<mat-form-field> <mat-form-field>
<input matInput placeholder="{{'settings.email' | i18n}}" formControlName="email" type="email"> <mat-label>{{'settings.email' | i18n}}</mat-label>
<input matInput formControlName="email" type="email">
<mat-error *ngIf="hasError('email')"> <mat-error *ngIf="hasError('email')">
{{'settings.email.error' | i18n}} {{'settings.email.error' | i18n}}
</mat-error> </mat-error>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<textarea matAutosize matAutosizeMinRows="3" matInput placeholder="{{'settings.about' | i18n}}" <mat-label>{{'settings.about' | i18n}}</mat-label>
formControlName="about"></textarea> <textarea matAutosize matAutosizeMinRows="3" matInput formControlName="about"></textarea>
<mat-error> <mat-error>
{{'settings.about.error' | i18n}} {{'settings.about.error' | i18n}}
</mat-error> </mat-error>
@ -24,8 +25,8 @@
mat-icon-button (click)="resetGravity()"> mat-icon-button (click)="resetGravity()">
<mat-icon>cancel</mat-icon> <mat-icon>cancel</mat-icon>
</button> </button>
<input type="number" min="0" max="2" step="0.1" matInput placeholder="{{'settings.gravity' | i18n}}" <mat-label>{{'settings.gravity' | i18n}}</mat-label>
formControlName="gravity"> <input type="number" min="0" max="2" step="0.1" matInput formControlName="gravity">
<mat-hint *ngIf="form.get('gravity').value != 0"> <mat-hint *ngIf="form.get('gravity').value != 0">
{{'settings.gravity.hint' | i18n}} {{'settings.gravity.hint' | i18n}}
</mat-hint> </mat-hint>
@ -39,8 +40,8 @@
mat-icon-button (click)="resetEntryDelay()"> mat-icon-button (click)="resetEntryDelay()">
<mat-icon>cancel</mat-icon> <mat-icon>cancel</mat-icon>
</button> </button>
<input type="number" min="0" max="15" step="1" matInput placeholder="{{'settings.entryDelay' | i18n}}" <mat-label>{{'settings.entryDelay' | i18n}}</mat-label>
formControlName="entryDelay"> <input type="number" min="0" max="15" step="1" matInput formControlName="entryDelay">
<mat-hint *ngIf="form.get('entryDelay').value != 0"> <mat-hint *ngIf="form.get('entryDelay').value != 0">
{{'settings.entryDelay.hint' | i18n}} {{'settings.entryDelay.hint' | i18n}}
</mat-hint> </mat-hint>
@ -54,8 +55,8 @@
matPrefix mat-icon-button (click)="resetCommentDelay()"> matPrefix mat-icon-button (click)="resetCommentDelay()">
<mat-icon>cancel</mat-icon> <mat-icon>cancel</mat-icon>
</button> </button>
<input type="number" min="0" max="15" step="1" matInput placeholder="{{'settings.commentDelay' | i18n}}" <mat-label>{{'settings.commentDelay' | i18n}}</mat-label>
formControlName="commentDelay"> <input type="number" min="0" max="15" step="1" matInput formControlName="commentDelay">
<mat-hint *ngIf="form.get('commentDelay').value != 0"> <mat-hint *ngIf="form.get('commentDelay').value != 0">
{{'settings.commentDelay.hint' | i18n}} {{'settings.commentDelay.hint' | i18n}}
</mat-hint> </mat-hint>
@ -70,8 +71,8 @@
mat-icon-button (click)="resetPageSize()"> mat-icon-button (click)="resetPageSize()">
<mat-icon>cancel</mat-icon> <mat-icon>cancel</mat-icon>
</button> </button>
<input type="number" min="1" max="100" step="1" matInput placeholder="{{'settings.pageSize' | i18n}}" <mat-label>{{'settings.pageSize' | i18n}}</mat-label>
formControlName="pageSize"> <input type="number" min="1" max="100" step="1" matInput formControlName="pageSize">
<mat-hint *ngIf="form.get('pageSize').value != 0"> <mat-hint *ngIf="form.get('pageSize').value != 0">
{{'settings.pageSize.hint' | i18n}} {{'settings.pageSize.hint' | i18n}}
</mat-hint> </mat-hint>

View File

@ -6,7 +6,8 @@
<p>{{ (view.id ? 'views.edit' : 'views.create') | i18n}}</p> <p>{{ (view.id ? 'views.edit' : 'views.create') | i18n}}</p>
<mat-form-field> <mat-form-field>
<input matInput placeholder="{{'views.name' | i18n}}" formControlName="name" matAutofocus> <mat-label>{{'views.name' | i18n}}</mat-label>
<input matInput formControlName="name" matAutofocus>
<mat-error *ngIf="hasError('name')"> <mat-error *ngIf="hasError('name')">
<div *ngFor="let error of form.get('name').errors | keyvalue"> <div *ngFor="let error of form.get('name').errors | keyvalue">
{{'views.name.error.' + error.key | i18n}}<br> {{'views.name.error.' + error.key | i18n}}<br>
@ -15,7 +16,8 @@
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<mat-select placeholder="{{'views.sorting' | i18n}}" formControlName="sorting"> <mat-label>{{'views.sorting' | i18n}}</mat-label>
<mat-select formControlName="sorting">
<mat-select-trigger> <mat-select-trigger>
<mat-icon>{{'sorting.' + sorting + '.icon' | i18n}}</mat-icon> {{'sorting.' + sorting | i18n}} <mat-icon>{{'sorting.' + sorting + '.icon' | i18n}}</mat-icon> {{'sorting.' + sorting | i18n}}
</mat-select-trigger> </mat-select-trigger>
@ -32,7 +34,8 @@
</ui-tagspicker> </ui-tagspicker>
<mat-form-field> <mat-form-field>
<mat-select placeholder="{{'views.entryType' | i18n}}" formControlName="entryType"> <mat-label>{{'views.entryType' | i18n}}</mat-label>
<mat-select formControlName="entryType">
<mat-select-trigger> <mat-select-trigger>
<span *ngIf="entryType"> <span *ngIf="entryType">
<mat-icon>{{'entryType.' + entryType + '.icon' | i18n}}</mat-icon> {{'entryType.' + <mat-icon>{{'entryType.' + entryType + '.icon' | i18n}}</mat-icon> {{'entryType.' +
@ -51,7 +54,8 @@
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field>
<input matInput placeholder="{{'views.index' | i18n}}" formControlName="index" type="number" min="0"> <mat-label>{{'views.index' | i18n}}</mat-label>
<input matInput formControlName="index" type="number" min="0">
<mat-error *ngIf="hasError('index')"> <mat-error *ngIf="hasError('index')">
<div *ngFor="let error of form.get('index').errors | keyvalue"> <div *ngFor="let error of form.get('index').errors | keyvalue">
{{'views.index.error.' + error.key | i18n}}<br> {{'views.index.error.' + error.key | i18n}}<br>

View File

@ -60,7 +60,7 @@
<span> | </span> <span> | </span>
<a href="javascript:" (click)="modDeleteComment(comment)">{{'moderation.comment.delete' | <a href="javascript:" (click)="modDeleteComment(comment)">{{'moderation.comment.delete' |
i18n}}</a> i18n}}</a>
</span> </span>
</small> </small>
</div> </div>
</ng-container> </ng-container>
@ -68,8 +68,8 @@
<ng-container *ngIf="comment.metadata && comment.metadata.edit"> <ng-container *ngIf="comment.metadata && comment.metadata.edit">
<form [formGroup]="form" (ngSubmit)="update()" #formDirective="ngForm"> <form [formGroup]="form" (ngSubmit)="update()" #formDirective="ngForm">
<mat-form-field> <mat-form-field>
<textarea matAutosize matAutosizeMinRows="3" matInput formControlName="text" <mat-label>{{'comment.text' | i18n}}</mat-label>
placeholder="{{'comment.text' | i18n}}" required></textarea> <textarea matAutosize matAutosizeMinRows="3" matInput formControlName="text" required></textarea>
<mat-error *ngIf="hasError('text')"> <mat-error *ngIf="hasError('text')">
{{'comment.text.error' | i18n}} {{'comment.text.error' | i18n}}
</mat-error> </mat-error>

View File

@ -1,7 +1,8 @@
<form [formGroup]="form" (ngSubmit)="create()" #formDirective="ngForm"> <form [formGroup]="form" (ngSubmit)="create()" #formDirective="ngForm">
<mat-form-field> <mat-form-field>
<textarea matAutosize matAutosizeMinRows="3" matInput formControlName="text" placeholder="{{'comment.text' | i18n}}" required></textarea> <mat-label>{{'comment.text' | i18n}}</mat-label>
<textarea matAutosize matAutosizeMinRows="3" matInput formControlName="text" required></textarea>
<mat-error *ngIf="hasError('text')"> <mat-error *ngIf="hasError('text')">
{{'comment.text.error' | i18n}} {{'comment.text.error' | i18n}}
</mat-error> </mat-error>

View File

@ -35,27 +35,28 @@
<span class="spacer"></span> <span class="spacer"></span>
<div class="mat-mdc-paginator flex wrap"> <div class="mat-mdc-paginator flex" [ngClass]="{'wrap' : filterOpen}">
<div *ngIf="filter" class="mat-mdc-paginator flex wrap filter-container"> <div *ngIf="filter" class="mat-mdc-paginator flex wrap filter-container">
<a mat-icon-button (click)="filterOpen=!filterOpen" title="{{'entries.filter' | i18n}}" <a mat-icon-button (click)="filterOpen=!filterOpen" title="{{'entries.filter' | i18n}}"
[color]="filterOpen ? 'accent' : 'primary'"> [color]="filterOpen ? 'accent' : 'primary'">
<mat-icon>filter_alt</mat-icon> <mat-icon>filter_alt</mat-icon>
</a> </a>
<div class="flex wrap filter" *ngIf="filterOpen"> <form class="flex wrap filter" *ngIf="filterOpen">
<ui-tagspicker [(model)]="tags" placeholder="{{'entries.filter.tags' | i18n}}" [change]="boundTagsPickerChange"> <ui-tagspicker [(model)]="tags" placeholder="{{'entries.filter.tags' | i18n}}" [change]="boundTagsPickerChange"
appearance="outline">
</ui-tagspicker> </ui-tagspicker>
<mat-form-field> <mat-form-field appearance="outline">
<mat-label>{{'entries.filter.date' | i18n}}</mat-label>
<input matInput [matDatepicker]="picker" [value]="entries && entries.filter && entries.filter.date" <input matInput [matDatepicker]="picker" [value]="entries && entries.filter && entries.filter.date"
(dateChange)="setFilter('date', $event.value && $event.value.toISOString() || undefined)" (dateChange)="setFilter('date', $event.value && $event.value.toISOString() || undefined)">
placeholder="{{'entries.filter.date' | i18n}}">
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle> <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker touchUi></mat-datepicker> <mat-datepicker #picker touchUi></mat-datepicker>
</mat-form-field> </mat-form-field>
<mat-form-field> <mat-form-field appearance="outline">
<mat-select placeholder="{{'entries.filter.entryType' | i18n}}" <mat-label>{{'entries.filter.entryType' | i18n}}</mat-label>
[value]="entries && entries.filter && entries.filter.type" <mat-select [value]="entries && entries.filter && entries.filter.type"
(selectionChange)="setFilter('type', $event.value || undefined)"> (selectionChange)="setFilter('type', $event.value || undefined)">
<mat-select-trigger> <mat-select-trigger>
<span *ngIf="entries.filter.type"> <span *ngIf="entries.filter.type">
@ -75,16 +76,16 @@
</mat-form-field> </mat-form-field>
<ui-tagspicker [(model)]="excludedTags" placeholder="{{'entries.filter.excludedTags' | i18n}}" <ui-tagspicker [(model)]="excludedTags" placeholder="{{'entries.filter.excludedTags' | i18n}}"
[change]="boundExcludedTagsPickerChange"> [change]="boundExcludedTagsPickerChange" appearance="outline">
</ui-tagspicker> </ui-tagspicker>
<mat-form-field *ngIf="gravityFilter"> <mat-form-field *ngIf="gravityFilter" appearance="outline">
<mat-label>{{'entries.filter.gravity' | i18n}}</mat-label>
<input matInput type="number" step="0.01" min="0" max="2.0" <input matInput type="number" step="0.01" min="0" max="2.0"
[value]="entries && entries.filter && entries.filter.gravity" [value]="entries && entries.filter && entries.filter.gravity"
(change)="setFilter('gravity', $event.target && $event.target.value || undefined)" (change)="setFilter('gravity', $event.target && $event.target.value || undefined)">
placeholder="{{'entries.filter.gravity' | i18n}}">
</mat-form-field> </mat-form-field>
</div> </form>
</div> </div>
<span class="spacer"></span> <span class="spacer"></span>
<mat-paginator [pageSizeOptions]="pageSizeOptions" [pageIndex]="entries.number" [length]="entries.totalElements" <mat-paginator [pageSizeOptions]="pageSizeOptions" [pageIndex]="entries.number" [length]="entries.totalElements"

View File

@ -19,7 +19,7 @@
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
&> * { &>* {
margin-top: 5px; margin-top: 5px;
margin-bottom: 5px; margin-bottom: 5px;
margin-left: 15px; margin-left: 15px;
@ -56,4 +56,4 @@ ui-tagspicker {
@media screen and (min-width: 992px) { @media screen and (min-width: 992px) {
max-width: 50%; max-width: 50%;
} }
} }

View File

@ -45,8 +45,8 @@
</mat-toolbar> </mat-toolbar>
<mat-sidenav-container> <mat-sidenav-container>
<mat-sidenav #sidenav [mode]="isBiggerScreen() ? 'side' : 'over'" [(opened)]="opened || searchFocus" [autoFocus]="false" <mat-sidenav #sidenav [mode]="isBiggerScreen() ? 'side' : 'over'" [(opened)]="opened || searchFocus"
(click)="!isBiggerScreen() && this.close()"> [autoFocus]="false" (click)="!isBiggerScreen() && this.close()">
<mat-nav-list *ngIf="authenticated"> <mat-nav-list *ngIf="authenticated">
<ui-viewmenu></ui-viewmenu> <ui-viewmenu></ui-viewmenu>
<mat-divider *ngIf="moderator"></mat-divider> <mat-divider *ngIf="moderator"></mat-divider>
@ -65,8 +65,9 @@
</a> </a>
</mat-nav-list> </mat-nav-list>
<mat-form-field *ngIf="authenticated" (click)="preventClose($event)"> <mat-form-field *ngIf="authenticated" (click)="preventClose($event)">
<mat-label>{{'search' | i18n}}</mat-label>
<input matInput type="text" (change)="search($event.target && $event.target.value || undefined, $event)" <input matInput type="text" (change)="search($event.target && $event.target.value || undefined, $event)"
placeholder="{{'search' | i18n}}" (focus)="searchFocus = true" (blur)="searchFocus = false"> (focus)="searchFocus = true" (blur)="searchFocus = false">
</mat-form-field> </mat-form-field>
<span class="spacer"></span> <span class="spacer"></span>
<mat-nav-list> <mat-nav-list>
@ -86,7 +87,8 @@
style="font-size: 0.7em;"> style="font-size: 0.7em;">
{{'page.privacy-policy' | i18n}} {{'page.privacy-policy' | i18n}}
</a> </a>
<span style="font-size: 0.7em; margin-right: 1em; float: right;">v{{version}} <span *ngIf="hasUpdate" (click)="updateSw()">{{'updateSw' | i18n}}</span></span> <span style="font-size: 0.7em; margin-right: 1em; float: right;">v{{version}} <span *ngIf="hasUpdate"
(click)="updateSw()">{{'updateSw' | i18n}}</span></span>
</mat-nav-list> </mat-nav-list>
</mat-sidenav> </mat-sidenav>

View File

@ -1,4 +1,5 @@
<mat-form-field> <mat-form-field [appearance]="appearance">
<mat-label>{{placeholder}}</mat-label>
<mat-chip-grid #tagList> <mat-chip-grid #tagList>
<mat-chip-row *ngFor="let tag of tags" [removable]="true" (removed)="removeTag(tag)"> <mat-chip-row *ngFor="let tag of tags" [removable]="true" (removed)="removeTag(tag)">
<mat-icon inline="true">tag</mat-icon>{{tag}} <mat-icon inline="true">tag</mat-icon>{{tag}}
@ -6,10 +7,10 @@
<mat-icon>cancel</mat-icon> <mat-icon>cancel</mat-icon>
</button> </button>
</mat-chip-row> </mat-chip-row>
<input *ngIf="max == 0 || !tags || tags.length < max" #tagsInput placeholder="{{placeholder}}" <input *ngIf="max == 0 || !tags || tags.length < max" #tagsInput [formControl]="searchFormControl"
[formControl]="searchFormControl" [matAutocomplete]="auto" [matChipInputFor]="tagList" [matAutocomplete]="auto" [matChipInputFor]="tagList" [matChipInputSeparatorKeyCodes]="separatorKeysCodes"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes" (matChipInputTokenEnd)="addInputTag($event)"> (matChipInputTokenEnd)="addInputTag($event)">
<mat-hint *ngIf="max > 1" align="end">{{tags && tags.length || 0}}/{{max}}</mat-hint> <mat-hint *ngIf="max > 1" align="end">{{tags && tags.length || 0}}/{{max}}</mat-hint>
</mat-chip-grid> </mat-chip-grid>
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="addOptionTag($event)"> <mat-autocomplete #auto="matAutocomplete" (optionSelected)="addOptionTag($event)">
<mat-option *ngFor="let option of searchTags | async" [value]="option"> <mat-option *ngFor="let option of searchTags | async" [value]="option">

View File

@ -10,13 +10,14 @@ import { TagsService } from 'src/app/services/tags.service';
@Component({ @Component({
selector: 'ui-tagspicker', selector: 'ui-tagspicker',
templateUrl: './tagspicker.ui.html', templateUrl: './tagspicker.ui.html',
styleUrls: [ './tagspicker.ui.scss' ] styleUrls: ['./tagspicker.ui.scss']
}) })
export class UiTagsPicker implements OnInit { export class UiTagsPicker implements OnInit {
@Input() change: Function; @Input() change: Function;
@Input() model: any; @Input() model: any;
@Input() placeholder: string; @Input() placeholder: string;
@Input() appearance: string;
@Input() max: number = 0; @Input() max: number = 0;
tags: string[] = []; tags: string[] = [];
searchTags: Observable<Object>; searchTags: Observable<Object>;
@ -24,7 +25,7 @@ export class UiTagsPicker implements OnInit {
@ViewChild('tagsInput') tagsInput: ElementRef<HTMLInputElement>; @ViewChild('tagsInput') tagsInput: ElementRef<HTMLInputElement>;
searchFormControl = new FormControl(); searchFormControl = new FormControl();
readonly separatorKeysCodes = [ ENTER, COMMA, SPACE ] as const; readonly separatorKeysCodes = [ENTER, COMMA, SPACE] as const;
constructor(private tagsService: TagsService) { } constructor(private tagsService: TagsService) { }

View File

@ -150,6 +150,7 @@ qrcode canvas {
max-width: 400px !important; max-width: 400px !important;
} }
.flex { .flex {
display: flex !important; display: flex !important;
@ -173,6 +174,16 @@ qrcode canvas {
} }
} }
@media (max-width: 576px) {
mat-paginator {
.mat-mdc-paginator-range-actions {
flex-wrap: wrap;
}
}
}
.scroll-container { .scroll-container {
overflow: auto; overflow: auto;
} }