Commit 559c22d0 by Nattana Chaiyamat

จัดการบริษัท จัดการพนักงาน

parent 5411f194
......@@ -134,7 +134,6 @@
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
......@@ -620,7 +619,6 @@
"version": "17.3.12",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.12.tgz",
"integrity": "sha512-1F8M7nWfChzurb7obbvuE7mJXlHtY1UG58pcwcomVtpPb+kPavgAO8OEvJHYBMV+bzSxkXt5UIwL9lt9jHUxZA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "7.23.9",
......@@ -649,7 +647,6 @@
"version": "7.23.9",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz",
"integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
......@@ -680,14 +677,12 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true,
"license": "MIT"
},
"node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
......@@ -1099,7 +1094,6 @@
"version": "7.26.10",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
"integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
......@@ -1130,14 +1124,12 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true,
"license": "MIT"
},
"node_modules/@babel/core/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
......@@ -3791,6 +3783,16 @@
"@fortawesome/fontawesome-svg-core": "~1.2.27 || ~1.3.0-beta2 || ^6.1.0"
}
},
"node_modules/@fortawesome/fontawesome-common-types": {
"version": "6.7.2",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz",
"integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/@fortawesome/fontawesome-free": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.0.0.tgz",
......@@ -3800,6 +3802,19 @@
"node": ">=6"
}
},
"node_modules/@fortawesome/fontawesome-svg-core": {
"version": "6.7.2",
"resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz",
"integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@fortawesome/fontawesome-common-types": "6.7.2"
},
"engines": {
"node": ">=6"
}
},
"node_modules/@grpc/grpc-js": {
"version": "1.9.15",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz",
......@@ -3874,7 +3889,6 @@
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
"dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^5.1.2",
......@@ -3892,7 +3906,6 @@
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
"integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
......@@ -3905,7 +3918,6 @@
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
......@@ -3918,14 +3930,12 @@
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
"dev": true,
"license": "MIT"
},
"node_modules/@isaacs/cliui/node_modules/string-width": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
"dev": true,
"license": "MIT",
"dependencies": {
"eastasianwidth": "^0.2.0",
......@@ -3943,7 +3953,6 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
......@@ -3959,7 +3968,6 @@
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.1.0",
......@@ -4079,6 +4087,13 @@
"rxjs": ">=7.5.0"
}
},
"node_modules/@kurkle/color": {
"version": "0.3.4",
"resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz",
"integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==",
"license": "MIT",
"peer": true
},
"node_modules/@leichtgewicht/ip-codec": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
......@@ -5689,7 +5704,6 @@
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
......@@ -7024,6 +7038,16 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/jquery": {
"version": "3.5.33",
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.33.tgz",
"integrity": "sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/sizzle": "*"
}
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
......@@ -7150,6 +7174,13 @@
"@types/send": "*"
}
},
"node_modules/@types/sizzle": {
"version": "2.3.10",
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.10.tgz",
"integrity": "sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==",
"license": "MIT",
"peer": true
},
"node_modules/@types/sockjs": {
"version": "0.3.36",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
......@@ -7679,7 +7710,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
"dev": true,
"license": "MIT"
},
"node_modules/anymatch": {
......@@ -7711,7 +7741,6 @@
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"dev": true,
"license": "MIT"
},
"node_modules/argparse": {
......@@ -7865,7 +7894,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true,
"license": "MIT"
},
"node_modules/base64-js": {
......@@ -8249,7 +8277,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
......@@ -8298,6 +8325,19 @@
"dev": true,
"license": "MIT"
},
"node_modules/chart.js": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz",
"integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@kurkle/color": "^0.3.0"
},
"engines": {
"pnpm": ">=8"
}
},
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
......@@ -8515,7 +8555,6 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
......@@ -8654,7 +8693,6 @@
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
"dev": true,
"license": "MIT"
},
"node_modules/cookie": {
......@@ -8833,7 +8871,6 @@
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
......@@ -8848,7 +8885,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
......@@ -8930,7 +8966,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
"dev": true,
"license": "MIT",
"bin": {
"cssesc": "bin/cssesc"
......@@ -9173,7 +9208,6 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/dir-glob": {
......@@ -9193,7 +9227,6 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true,
"license": "MIT"
},
"node_modules/dns-packet": {
......@@ -9314,7 +9347,6 @@
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
"dev": true,
"license": "MIT"
},
"node_modules/echarts": {
......@@ -9382,7 +9414,6 @@
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
......@@ -9393,7 +9424,6 @@
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
......@@ -10255,7 +10285,6 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
"integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
"dev": true,
"license": "ISC",
"dependencies": {
"cross-spawn": "^7.0.6",
......@@ -10272,7 +10301,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=14"
......@@ -11365,7 +11393,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
"license": "ISC"
},
"node_modules/isobject": {
......@@ -11473,7 +11500,6 @@
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
"integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/cliui": "^8.0.2"
......@@ -11527,7 +11553,6 @@
"version": "1.21.7",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
"integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
"dev": true,
"license": "MIT",
"bin": {
"jiti": "bin/jiti.js"
......@@ -12017,7 +12042,6 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true,
"license": "MIT"
},
"node_modules/loader-runner": {
......@@ -12428,7 +12452,6 @@
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
......@@ -12695,7 +12718,6 @@
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0",
......@@ -13301,6 +13323,13 @@
"node": ">=0.10.0"
}
},
"node_modules/nouislider": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/nouislider/-/nouislider-15.8.1.tgz",
"integrity": "sha512-93TweAi8kqntHJSPiSWQ1o/uZ29VWOmal9YKb6KKGGlCkugaNfAupT7o1qTHqdJvNQ7S0su5rO6qRFCjP8fxtw==",
"license": "MIT",
"peer": true
},
"node_modules/npm": {
"version": "10.9.3",
"resolved": "https://registry.npmjs.org/npm/-/npm-10.9.3.tgz",
......@@ -15916,7 +15945,6 @@
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
......@@ -15926,7 +15954,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
......@@ -16173,7 +16200,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"dev": true,
"license": "BlueOak-1.0.0"
},
"node_modules/pacote": {
......@@ -16352,7 +16378,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
......@@ -16368,7 +16393,6 @@
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
"integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"lru-cache": "^10.2.0",
......@@ -16385,7 +16409,6 @@
"version": "10.4.3",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true,
"license": "ISC"
},
"node_modules/path-to-regexp": {
......@@ -16436,7 +16459,6 @@
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
"integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
......@@ -16673,7 +16695,6 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
"dev": true,
"license": "MIT",
"dependencies": {
"camelcase-css": "^2.0.1"
......@@ -16834,7 +16855,6 @@
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
"integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
......@@ -16860,7 +16880,6 @@
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"dev": true,
"license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
......@@ -17401,7 +17420,6 @@
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
"integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/regenerate": {
......@@ -18227,7 +18245,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
......@@ -18240,7 +18257,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
......@@ -18791,7 +18807,6 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
......@@ -18819,7 +18834,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
......@@ -18842,7 +18856,6 @@
"version": "3.35.0",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
"integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.2",
......@@ -18865,7 +18878,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
......@@ -18875,7 +18887,6 @@
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"dev": true,
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
......@@ -18896,7 +18907,6 @@
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
......@@ -18997,7 +19007,6 @@
"version": "3.4.17",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
"integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
......@@ -19035,7 +19044,6 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.3"
......@@ -19048,7 +19056,6 @@
"version": "15.1.0",
"resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.0.0",
......@@ -19066,7 +19073,6 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
"integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
......@@ -19102,7 +19108,6 @@
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
"dev": true,
"license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
......@@ -19318,7 +19323,6 @@
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
"dev": true,
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0"
......@@ -19328,7 +19332,6 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
"dev": true,
"license": "MIT",
"dependencies": {
"thenify": ">= 3.1.0 < 4"
......@@ -19442,7 +19445,6 @@
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/tslib": {
......@@ -19503,7 +19505,6 @@
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
"integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
......@@ -20692,7 +20693,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
......
import { TranslateService } from "@ngx-translate/core";
import { BaseModel } from "../base.model";
import { environment } from "../../../../environments/environment";
export interface EmployeeSyncModel {
birthdate: string
branchEngName: string
branchId: string
branchName: string
bu1EngName: string
bu1Id: string
bu1Name: string
bu2EngName: string
bu2Id: string
bu2Name: string
bu3EngName: string
bu3Id: string
bu3Name: string
bu4EngName: string
bu4Id: string
bu4Name: string
bu5EngName: string
bu5Id: string
bu5Name: string
bu6EngName: string
bu6Id: string
bu6Name: string
bu7EngName: string
bu7Id: string
bu7Name: string
companyCode: string
companyId: string
companyName: string
email: string
empGroupEngName: string
empGroupId: string
empGroupName: string
employeeId: string
empStatusEngName: string
empStatusId: string
empStatusName: string
empTypeEngName: string
empTypeId: string
empTypeName: string
firstEngName: string
firstHireDate: string
firstname: string
jobEngName: string
jobId: string
jobName: string
lastEngName: string
lastname: string
marryEngName: string
marryId: string
marryName: string
memberId: string
mobile: string
nationalityEngName: string
nationalityId: string
nationalityName: string
picture: string
plEngName: string
plId: string
plName: string
positionEngName: string
positionId: string
positionName: string
prefixEngName: string
prefixId: string
prefixName: string
sex: string
sexEngName: string
sexName: string
startDate: string
workareaEngName: string
workareaId: string
workareaName: string
}
export class MyEmployeeSyncModel extends BaseModel implements EmployeeSyncModel {
birthdate: string
branchEngName: string
branchId: string
branchName: string
bu1EngName: string
bu1Id: string
bu1Name: string
bu2EngName: string
bu2Id: string
bu2Name: string
bu3EngName: string
bu3Id: string
bu3Name: string
bu4EngName: string
bu4Id: string
bu4Name: string
bu5EngName: string
bu5Id: string
bu5Name: string
bu6EngName: string
bu6Id: string
bu6Name: string
bu7EngName: string
bu7Id: string
bu7Name: string
companyCode: string
companyId: string
companyName: string
email: string
empGroupEngName: string
empGroupId: string
empGroupName: string
employeeId: string
empStatusEngName: string
empStatusId: string
empStatusName: string
empTypeEngName: string
empTypeId: string
empTypeName: string
firstEngName: string
firstHireDate: string
firstname: string
jobEngName: string
jobId: string
jobName: string
lastEngName: string
lastname: string
marryEngName: string
marryId: string
marryName: string
memberId: string
mobile: string
nationalityEngName: string
nationalityId: string
nationalityName: string
picture: string
plEngName: string
plId: string
plName: string
positionEngName: string
positionId: string
positionName: string
prefixEngName: string
prefixId: string
prefixName: string
sex: string
sexEngName: string
sexName: string
startDate: string
workareaEngName: string
workareaId: string
workareaName: string
constructor(data?: Partial<EmployeeSyncModel>, translateService?: TranslateService) {
super(data, translateService)
this.birthdate = data?.birthdate || ''
this.branchEngName = data?.branchEngName || ''
this.branchId = data?.branchId || ''
this.branchName = data?.branchName || ''
this.bu1EngName = data?.bu1EngName || ''
this.bu1Id = data?.bu1Id || ''
this.bu1Name = data?.bu1Name || ''
this.bu2EngName = data?.bu2EngName || ''
this.bu2Id = data?.bu2Id || ''
this.bu2Name = data?.bu2Name || ''
this.bu3EngName = data?.bu3EngName || ''
this.bu3Id = data?.bu3Id || ''
this.bu3Name = data?.bu3Name || ''
this.bu4EngName = data?.bu4EngName || ''
this.bu4Id = data?.bu4Id || ''
this.bu4Name = data?.bu4Name || ''
this.bu5EngName = data?.bu5EngName || ''
this.bu5Id = data?.bu5Id || ''
this.bu5Name = data?.bu5Name || ''
this.bu6EngName = data?.bu6EngName || ''
this.bu6Id = data?.bu6Id || ''
this.bu6Name = data?.bu6Name || ''
this.bu7EngName = data?.bu7EngName || ''
this.bu7Id = data?.bu7Id || ''
this.bu7Name = data?.bu7Name || ''
this.companyCode = data?.companyCode || ''
this.companyId = data?.companyId || ''
this.companyName = data?.companyName || ''
this.email = data?.email || ''
this.empGroupEngName = data?.empGroupEngName || ''
this.empGroupId = data?.empGroupId || ''
this.empGroupName = data?.empGroupName || ''
this.employeeId = data?.employeeId || ''
this.empStatusEngName = data?.empStatusEngName || ''
this.empStatusId = data?.empStatusId || ''
this.empStatusName = data?.empStatusName || ''
this.empTypeEngName = data?.empTypeEngName || ''
this.empTypeId = data?.empTypeId || ''
this.empTypeName = data?.empTypeName || ''
this.firstEngName = data?.firstEngName || ''
this.firstHireDate = data?.firstHireDate || ''
this.firstname = data?.firstname || ''
this.jobEngName = data?.jobEngName || ''
this.jobId = data?.jobId || ''
this.jobName = data?.jobName || ''
this.lastEngName = data?.lastEngName || ''
this.lastname = data?.lastname || ''
this.marryEngName = data?.marryEngName || ''
this.marryId = data?.marryId || ''
this.marryName = data?.marryName || ''
this.memberId = data?.memberId || ''
this.mobile = data?.mobile || ''
this.nationalityEngName = data?.nationalityEngName || ''
this.nationalityId = data?.nationalityId || ''
this.nationalityName = data?.nationalityName || ''
this.picture = data?.picture || ''
this.plEngName = data?.plEngName || ''
this.plId = data?.plId || ''
this.plName = data?.plName || ''
this.positionEngName = data?.positionEngName || ''
this.positionId = data?.positionId || ''
this.positionName = data?.positionName || ''
this.prefixEngName = data?.prefixEngName || ''
this.prefixId = data?.prefixId || ''
this.prefixName = data?.prefixName || ''
this.sex = data?.sex || ''
this.sexEngName = data?.sexEngName || ''
this.sexName = data?.sexName || ''
this.startDate = data?.startDate || ''
this.workareaEngName = data?.workareaEngName || ''
this.workareaId = data?.workareaId || ''
this.workareaName = data?.workareaName || ''
}
}
......@@ -55,30 +55,30 @@ export class MyHrcompanyModel extends BaseModel implements HrcompanyModel {
recommendType: number;
constructor(data?: Partial<HrcompanyModel>, translateService?: TranslateService) {
super(data, translateService)
this.companyId = data?.companyId!
this.companyCode = data?.companyCode!
this.companyName = data?.companyName!
this.companySource = data?.companySource!
this.companyEmail = data?.companyEmail!
this.branchId = data?.branchId!
this.branchName = data?.branchName!
this.pictureUrl = data?.pictureUrl!
this.role = data?.role!
this.database = data?.database!
this.myhrCode = data?.myhrCode!
this.myhrUrl = data?.myhrUrl!
this.companyAddr = data?.companyAddr!
this.companyTel = data?.companyTel!
this.companyTax = data?.companyTax!
this.prefix = data?.prefix!
this.lastNumber = data?.lastNumber!
this.number = data?.number!
this.receiptSignature1 = data?.receiptSignature1!
this.receiptSignature2 = data?.receiptSignature2!
this.logo = data?.logo!
this.displayType = data?.displayType!
this.bestsellerType = data?.bestsellerType!
this.recommendType = data?.recommendType!
this.companyId = data?.companyId || ''
this.companyCode = data?.companyCode || ''
this.companyName = data?.companyName || ''
this.companySource = data?.companySource || ''
this.companyEmail = data?.companyEmail || ''
this.branchId = data?.branchId || ''
this.branchName = data?.branchName || ''
this.pictureUrl = data?.pictureUrl || ''
this.role = data?.role || ''
this.database = data?.database || ''
this.myhrCode = data?.myhrCode || ''
this.myhrUrl = data?.myhrUrl || ''
this.companyAddr = data?.companyAddr || ''
this.companyTel = data?.companyTel || ''
this.companyTax = data?.companyTax || ''
this.prefix = data?.prefix || ''
this.lastNumber = data?.lastNumber || ''
this.number = data?.number || ''
this.receiptSignature1 = data?.receiptSignature1 || ''
this.receiptSignature2 = data?.receiptSignature2 || ''
this.logo = data?.logo || ''
this.displayType = data?.displayType ?? 0
this.bestsellerType = data?.bestsellerType ?? 0
this.recommendType = data?.recommendType ?? 0
}
// getPictureURL(): string {
......
import { TranslateService } from "@ngx-translate/core";
import { BaseModel } from "../base.model";
import { environment } from "../../../../environments/environment";
export interface ZeemeCompanyModel {
companyName: string
companyType: string
website: string
metaData: string
companyStatus: string
suggestion: string
radiusStampAllow: string
latitude: string
longitude: string
pictureCompany: string
ownerId: string
ownerName: string
mainbranchId: string
mainbranchName: string
partitionId: string
companyId: string
companyCode: string
qrCode: string
locationList: {
latitude: string
longitude: string
name: string
expiredDate: string
}[]
}
export class MyZeemeCompanyModel extends BaseModel implements ZeemeCompanyModel {
companyName: string
companyType: string
website: string
metaData: string
companyStatus: string
suggestion: string
radiusStampAllow: string
latitude: string
longitude: string
pictureCompany: string
ownerId: string
ownerName: string
mainbranchId: string
mainbranchName: string
partitionId: string
companyId: string
companyCode: string
qrCode: string
locationList: {
latitude: string
longitude: string
name: string
expiredDate: string
}[]
constructor(data?: Partial<ZeemeCompanyModel>, translateService?: TranslateService) {
super(data, translateService)
this.companyName = data?.companyName || ''
this.companyType = data?.companyType || ''
this.website = data?.website || ''
this.metaData = data?.metaData || ''
this.companyStatus = data?.companyStatus || ''
this.suggestion = data?.suggestion || ''
this.radiusStampAllow = data?.radiusStampAllow || ''
this.latitude = data?.latitude || ''
this.longitude = data?.longitude || ''
this.pictureCompany = data?.pictureCompany || ''
this.ownerId = data?.ownerId || ''
this.ownerName = data?.ownerName || ''
this.mainbranchId = data?.mainbranchId || ''
this.mainbranchName = data?.mainbranchName || ''
this.partitionId = data?.partitionId || ''
this.companyId = data?.companyId || ''
this.companyCode = data?.companyCode || ''
this.qrCode = data?.qrCode || ''
this.locationList = (data?.locationList || []).map(e => ({
latitude: e.latitude || '',
longitude: e.longitude || '',
name: e.name || '',
expiredDate: e.expiredDate || ''
}))
}
}
<app-page-header [title]="'จัดการพนักงาน'" [activeTitle]="'ผู้ดูแลระบบ'" [title1]="'จัดการพนักงาน'">
</app-page-header>
<div class="grid grid-cols-12 gap-6">
<div class="xl:col-span-12 col-span-12">
<div class="box">
<div class="box-header justify-between">
<div class="box-title">
{{ 'All List' | translate}} <span
class="badge bg-light text-default rounded-full ms-1 text-[0.75rem] align-middle">{{hrCompanyListFilter().length}}</span>
</div>
<div class="flex flex-wrap gap-2">
<input class="form-control form-control" type="text" placeholder="ค้นหาบริษัท" [(ngModel)]='search'>
</div>
</div>
<div class="box-body">
<div class="table-responsive">
<table class="table whitespace-nowrap min-w-full ti-custom-table-hover">
<thead>
<tr class="border-b border-defaultborder">
<th scope="col" class="text-start">{{"Logo Company"|translate}}</th>
<th scope="col" class="text-start">{{"Company Code"|translate}}</th>
<th scope="col" class="text-start">{{"Company Name"|translate}}</th>
<th scope="col" class="text-start">{{"Agency" | translate}}</th>
<th scope="col" class="text-start">{{"Company Source" | translate}}</th>
<th scope="col" class="text-start">{{"Manage Data" | translate}}</th>
</tr>
</thead>
<tbody>
@if (hrCompanyListFilter().length) {
@for (item of hrCompanyListFilter(); track item.companyId) {
<tr class="border border-defaultborder dark:border-defaultborder/10 cursor-pointer">
<td>
<div class="flex items-center">
<span class="p-3 me-1" style="width: 200px;">
@if(item.companySource=='MyLearn'){
<img
[src]="item.logo ?baseUrlMylearn+'/files/image/'+item.logo : 'assets/images/media/default-pic-gX.png' "
id="profile-img" class="border-radius-1"
style="width: 100px; height: 100px; object-fit: cover;">
} @else if(item.companySource=='ZeeMe'){
<img [src]="item.pictureUrl ? item.pictureUrl:'assets/images/media/default-pic-gX.png'"
id="profile-img" class="border-radius-1"
style="width: 100px; height: 100px; object-fit: cover;">
} @else{
<img [src]="'assets/images/media/default-pic-gX.png'" id="profile-img" class="border-radius-1"
style="width: 100px; height: 100px; object-fit: cover;">
}
</span>
</div>
</td>
<td>
<div>
<span class="block mb-1">
{{item.companyCode}}
</span>
</div>
</td>
<td>
<div>
<span class="block mb-1">
{{item.companyName}}
</span>
</div>
</td>
<td>
<div>
<span class="block mb-1">
{{item.branchName}}
</span>
</div>
</td>
<td>
<div>
<span class="block mb-1">
{{item.companySource}}
</span>
</div>
</td>
<td>
<div class="flex flex-row items-center !gap-2 ">
<a aria-label="anchor"
class="ti-btn ti-btn-wave !gap-0 !m-0 bg-info/10 text-info hover:bg-info hover:text-white hover:border-info"
(click)="openEmployeeModal(item)">
<i class="ri-pencil-line"></i>
</a>
</div>
</td>
</tr>
}
} @else {
<tr>
<td [attr.colspan]="5" class="text-center py-4">
@if(state.hrCompany.loading){
<p>กำลังโหลดข้อมูล หรือไม่มีข้อมูลเลย...</p>
} @else{
<p>ไม่พบข้อมูลที่ค้นหา...</p>
}
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
<div class="box-footer">
<div class="flex items-center flex-wrap overflow-auto" *ngIf="hrCompanyListFilter().length > 0">
<div class="mb-2 sm:mb-0">
<div>
{{'Showing' | translate}} {{hrCompanyListFilter().length}} {{'entries'
| translate}} <i class="bi bi-arrow-right ms-2 font-semibold"></i>
</div>
</div>
<div class="ms-auto">
<nav aria-label="Page navigation">
<ul class="ti-pagination mb-0">
<li *ngIf="pageIndex>0" class="page-item {{pageIndex==0 ? 'disabled' : ''}}"><a
class="page-link px-3 py-[0.375rem] cursor-pointer" (click)="pageIndex = pageIndex-1">{{'Previous' |
translate}}</a></li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="pageIndex-1>0" (click)="pageIndex = pageIndex-2">{{pageIndex-1}}</a></li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="pageIndex>0 && ((pageIndex-1)*10 < (search == '' ? hrCompanyListFilter().length : hrCompanyListFilter().length))"
(click)="pageIndex = pageIndex-1">{{pageIndex}}</a></li>
<li class="page-item"><a class="page-link active px-3 py-[0.375rem]"
href="javascript:void(0);">{{pageIndex +1}}</a>
</li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="(pageIndex+1)*10 < (search == '' ? hrCompanyListFilter().length : hrCompanyListFilter().length)"
(click)="pageIndex = pageIndex+1">{{pageIndex +2}}</a></li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="(pageIndex+2)*10 < (search == '' ? hrCompanyListFilter().length : hrCompanyListFilter().length)"
(click)="pageIndex = pageIndex+2">{{pageIndex +3}}</a></li>
<li
*ngIf="(pageIndex+1)*10 < (search == '' ? hrCompanyListFilter().length : hrCompanyListFilter().length)"
class="page-item"><a class="page-link px-3 py-[0.375rem] cursor-pointer"
(click)="pageIndex = pageIndex+1">{{'Next' |
translate}}</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
<ng-template #employeeModal let-dialogRef>
<div class="grid grid-cols-12 gap-6">
<div class="xl:col-span-12 col-span-12">
<div class="box-header justify-between">
<div class="box-title">
รายการพนักงาน
</div>
<button type="button" class="hs-dropdown-toggle !text-[1rem] !font-semibold !text-defaulttextcolor"
(click)="employeeModalRef?.close()">
<span class="sr-only">{{'Close' | translate}}</span>
<i class="ri-close-line"></i>
</button>
</div>
<div class="box-body" style="padding: 20px;">
<div class="box">
<div class="box-header justify-between">
<div class="box-title">
{{ 'All List' | translate}} <span
class="badge bg-light text-default rounded-full ms-1 text-[0.75rem] align-middle">{{employeeSyncFilter().length}}</span>
</div>
<div class="flex flex-wrap gap-2">
<div>
<input class="form-control form-control" type="text" placeholder="ค้นหาพนักงาน"
[(ngModel)]='searchModal' (ngModelChange)="pageModal=0">
</div>
</div>
</div>
<div class="table-responsive">
<table class="table whitespace-nowrap min-w-full ti-custom-table-hover">
<thead>
<tr class="border-b border-defaultborder">
<th scope="col" class="!text-start">
<input class="cursor-pointer form-check-input check-all" type="checkbox"
[checked]="state.employeeSync.selectedIds.length === state.employeeSync.list.length && state.employeeSync.list.length > 0"
(change)="toggleSelectAll('employeeSync', 'employeeId', $event)">
</th>
<th class="text-center" scope="col">รหัสพนักงาน</th>
<th class="text-center" scope="col">ชื่อพนักงาน</th>
<th class="text-center" scope="col">ชื่อบริษัท</th>
<th class="text-center" scope="col">สาขา</th>
</tr>
</thead>
<tbody id="tableBody">
@if(!state.employeeSync.loading && employeeSyncFilter().length){
@for (items of employeeSyncFilter() | slice: pageModal * pageSizeModal : (pageModal + 1) *
pageSizeModal;
track $index) {
<tr class="border border-defaultborder dark:border-defaultborder/10 cursor-pointer"
(click)="toggleSelect('employeeSync', 'employeeId', items, $event)">
<td class="font-16 font-medium">
<input class="cursor-pointer form-check-input check-all" type="checkbox"
[checked]="state.employeeSync.selectedIds.includes(items.employeeId)">
</td>
<td class="font-16 font-medium">
{{items.employeeId}}
</td>
<td class="font-16 font-medium">
{{items.firstname}} {{items.lastname}}
</td>
<td class="font-16 font-medium">
{{items.companyName}}
</td>
<td class="font-16 font-medium">
{{items.branchName}}
</td>
</tr>
}
} @else {
<tr>
<td [attr.colspan]="5" class="text-center py-4">
@if(state.employeeSync.loading){
<p>กำลังโหลดข้อมูล หรือไม่มีข้อมูลเลย...</p>
} @else{
<p>ไม่พบข้อมูลที่ค้นหา...</p>
}
</td>
</tr>
}
</tbody>
</table>
</div>
<div class="flex items-center flex-wrap overflow-auto" *ngIf="employeeSyncFilter().length > 0">
<div class="d-flex justify-content-end p-2">
<select class="custom-select m-r-5 border-color-gray-full-focus" style="width: auto"
[(ngModel)]="pageSizeModal" (ngModelChange)="pageModal=0">
<option *ngFor="let item of [10,50,100]" [ngValue]="item">
{{"รายการต่อหน้า"}}: {{item}}
</option>
</select>
</div>
<div class="mb-2 sm:mb-0">
<div>
{{'Showing' | translate}} {{employeeSyncFilter().length}} {{'entries'
| translate}} <i class="bi bi-arrow-right ms-2 font-semibold"></i>
</div>
</div>
<div class="ms-auto">
<nav aria-label="Page navigation">
<ul class="ti-pagination mb-0">
<li *ngIf="pageModal > 0" class="page-item {{pageModal==0 ? 'disabled' : ''}}"><a
class="page-link px-3 py-[0.375rem] cursor-pointer"
(click)="pageModal = pageModal - 1; ">{{'Previous' | translate}}</a>
</li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="pageModal > 0" (click)="pageModal = pageModal - 1; ">{{pageModal}}</a>
</li>
<li class="page-item"><a class="page-link active px-3 py-[0.375rem]"
href="javascript:void(0);">{{pageModal
+ 1}}</a>
</li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="(pageModal + 1) * pageSizeModal < employeeSyncFilter().length"
(click)="pageModal = pageModal + 1; ">{{pageModal + 2}}</a></li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="(pageModal + 2) * pageSizeModal < employeeSyncFilter().length"
(click)="pageModal = pageModal + 2; ">{{pageModal + 3}}</a></li>
<li *ngIf="(pageModal + 1) * pageSizeModal < employeeSyncFilter().length" class="page-item"><a
class="page-link px-3 py-[0.375rem] cursor-pointer" (click)="pageModal = pageModal + 1; ">
{{'Next'| translate}}
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div class="box-footer" style="display: flex;justify-content: end;">
<button type="button" class="hs-dropdown-toggle ti-btn ti-btn-light align-middle"
(click)="employeeModalRef?.close()">
{{'Cancel' | translate}}
</button>
<button type="button" class="ti-btn bg-primary text-white !font-medium"
[class.ti-btn-disabled]="!state.employeeSync.selectedIds.length"
[disabled]="!state.employeeSync.selectedIds.length" (click)="syncProfile()">
{{'ซิงค์พนักงาน' | translate}}</button>
</div>
</div>
</div>
</ng-template>
\ No newline at end of file
.bg-input-readonly {
background-color: #e5e7eb;
cursor: not-allowed;
}
.\!bg-input-readonly {
background-color: #e5e7eb !important;
cursor: not-allowed !important;
}
\ No newline at end of file
import { ChangeDetectorRef, Component, ElementRef, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { SharedModule } from '../../../shared/shared.module';
import { CommonModule } from '@angular/common';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import { UserService } from '../../services/mylearn/user.service';
import {
HrcompanyModel,
MyHrcompanyModel,
} from '../../models/mylearn/myhrcompany.model';
import { MyhrcompanyService } from '../../services/mylearn/myhrcompany.service';
import swal from 'sweetalert';
import { FormsModule } from '@angular/forms';
import { Router } from '@angular/router';
import { ResponseModel } from '../../models/response.model.';
import { MyZeemeCompanyModel, ZeemeCompanyModel } from '../../models/mylearn/zeeme-company.model';
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
import { FileItem, FileUploader, FileUploadModule, ParsedResponseHeaders } from 'ng2-file-upload';
import { environment } from '../../../../environments/environment';
import { TokenService } from '../../../shared/services/token.service';
import { forkJoin } from 'rxjs';
import { EmployeeSyncModel, MyEmployeeSyncModel } from '../../models/mylearn/employee-sync.model';
@Component({
selector: 'app-employee-manage',
templateUrl: './employee-manage.component.html',
styleUrls: ['./employee-manage.component.scss'],
standalone: true,
imports: [CommonModule, SharedModule, TranslateModule, FormsModule, FileUploadModule],
})
export class EmployeeManageComponent implements OnInit {
baseUrlMylearn = environment.baseUrlMylearn
search = ''
page = 0
pageIndex = 10
state = {
hrCompany: {
loading: false,
list: [] as HrcompanyModel[],
selectedIds: [] as string[]
},
employeeSync: {
loading: false,
list: [] as EmployeeSyncModel[],
selectedIds: [] as string[]
},
};
@ViewChild('employeeModal') employeeModal?: TemplateRef<any>;
employeeModalRef?: MatDialogRef<any>;
searchModal = ''
pageModal = 0
pageSizeModal = 10
constructor(
private myhrcompanyservice: MyhrcompanyService,
private userService: UserService,
public translate: TranslateService,
private router: Router,
private modal: MatDialog,
private tokenService: TokenService,
private cdr: ChangeDetectorRef
) { }
ngOnInit(): void {
this.getHrCompanyList()
}
getHrCompanyList() {
this.state.hrCompany.loading = true
this.myhrcompanyservice.getList().subscribe({
next: (result) => {
this.state.hrCompany.list = result.map(e => new MyHrcompanyModel(e)).filter(e => e.companySource == 'ZeeMe')
this.state.hrCompany.loading = false
this.cdr.markForCheck()
},
error: (err) => {
this.state.hrCompany.loading = false
swal('ข้อผิดพลาด', 'ไม่สามารถดึงข้อมูลบริษัทได้', 'error');
this.cdr.markForCheck()
}
});
}
hrCompanyListFilter() {
return this.state.hrCompany.list.filter(e =>
e.companyCode.toLowerCase().includes(this.search.toLowerCase()) ||
e.companyName.toLowerCase().includes(this.search.toLowerCase()) ||
e.branchName.toLowerCase().includes(this.search.toLowerCase()) ||
e.companySource.toLowerCase().includes(this.search.toLowerCase()))
}
getZeemeEmployeeProfileSyncList(companyId: string) {
this.state.employeeSync.loading = true
this.myhrcompanyservice.getZeemeEmployeeProfileSyncList(companyId).subscribe({
next: (result) => {
this.state.employeeSync.list = result.map(e => new MyEmployeeSyncModel(e))
this.state.employeeSync.loading = false
this.cdr.markForCheck()
},
error: (err) => {
this.state.employeeSync.loading = false
this.cdr.markForCheck()
}
})
}
employeeSyncFilter() {
return this.state.employeeSync.list.filter(e =>
e.employeeId.toLowerCase().includes(this.searchModal.toLowerCase()) ||
e.companyName.toLowerCase().includes(this.searchModal.toLowerCase()) ||
e.branchName.toLowerCase().includes(this.searchModal.toLowerCase()) ||
e.firstname.toLowerCase().includes(this.searchModal.toLowerCase()) ||
e.lastname.toLowerCase().includes(this.searchModal.toLowerCase()) ||
e.firstEngName.toLowerCase().includes(this.searchModal.toLowerCase()) ||
e.lastEngName.toLowerCase().includes(this.searchModal.toLowerCase()))
}
toggleSelect(key: keyof typeof this.state, idField: string, item: any, event: Event) {
const checked = (event.target as HTMLInputElement).checked;
const target = this.state[key];
const id = item[idField];
const input = event.target as HTMLInputElement;
if (input && 'checked' in input) {
const checked = input.checked;
if (checked) {
if (!target.selectedIds.includes(id)) target.selectedIds.push(id);
} else {
target.selectedIds = target.selectedIds.filter(x => x !== id);
}
} else {
if (target.selectedIds.includes(id)) {
target.selectedIds = target.selectedIds.filter(x => x !== id);
} else {
target.selectedIds.push(id);
}
}
}
toggleSelectAll(key: keyof typeof this.state, idField: string, event: Event) {
const checked = (event.target as HTMLInputElement).checked;
const target = this.state[key];
if (checked) {
target.selectedIds = target.list.map(item => item[idField as keyof typeof item]);
} else {
target.selectedIds = [];
}
}
openEmployeeModal(item: HrcompanyModel) {
this.getZeemeEmployeeProfileSyncList(item.companyId)
this.pageModal = 0;
this.pageSizeModal = 10;
if (this.employeeModal) {
this.employeeModalRef = this.modal.open(this.employeeModal, {
width: '1500px',
height: '700px',
maxWidth: 'none',
disableClose: true,
data: {}
});
this.employeeModalRef.afterClosed().subscribe(result => {
});
}
}
syncProfile() {
const selectedItems = this.state.employeeSync.list.filter(item =>
this.state.employeeSync.selectedIds.includes(item.employeeId)
).map(e => new MyEmployeeSyncModel(e))
swal({
title: 'คุณแน่ใจหรือไม่?',
text: 'คุณต้องการบันทึกหรือไม่',
icon: 'warning',
dangerMode: false,
buttons: ['ยกเลิก', 'ยืนยัน'],
}).then((willSave: any) => {
if (willSave) {
this.myhrcompanyservice.syncProfile(selectedItems).subscribe({
next: (result) => {
this.employeeModalRef?.close()
swal('บันทึกสำเร็จ!!', 'บันทึกข้อมูลสมาชิก', 'success');
this.state.employeeSync.selectedIds = []
this.ngOnInit();
},
error: (err) => {
swal('ข้อผิดพลาด!!', 'ไม่สามารถบันทึก/อัปเดตข้อมูลได้', 'error');
}
})
}
});
}
}
......@@ -30,12 +30,11 @@
(click)="deleteSelect()"><i class="ri-delete-bin-line font-semibold align-middle"></i>{{ 'Delete' |
translate}}
</a> -->
<div>
<a href="javascript:void(0);" class="hs-dropdown-toggle ti-btn ti-btn-primary-full me-2" (click)="newHrcompanyModel()" data-hs-overlay="#modal-detail">
<i class="ri-add-line font-semibold align-middle">
</i>{{ "Create Company" | translate}}
<a href="javascript:void(0);" class="hs-dropdown-toggle ti-btn ti-btn-primary-full me-2"
(click)="newHrcompanyModel()" data-hs-overlay="#modal-detail">
<i class="ri-add-line font-semibold align-middle">
</i>{{ "Create Company" | translate}}
</a>
</div>
<div>
......@@ -64,7 +63,8 @@
<tbody>
@if (filterList.length > 0) {
@for (item of filterList; track item.companyId) {
<tr class="border border-defaultborder dark:border-defaultborder/10 cursor-pointer"> <!-- (click)="goToDetail(item.companyId)" -->
<tr class="border border-defaultborder dark:border-defaultborder/10 cursor-pointer">
<!-- (click)="goToDetail(item.companyId)" -->
<td class="product-checkbox">
<input class="form-check-input" type="checkbox" [checked]="selectedItems.get(item.companyId) || false"
(change)="onCheckboxChange(item.companyId)" aria-label="...">
......@@ -72,10 +72,19 @@
<td>
<div class="flex items-center">
<span class="p-3 me-1" style="width: 200px;">
@if(item.companySource=='MyLearn'){
<img
[src]="item.pictureUrl === '' ? 'assets/images/media/default-pic-gX.png' : item.pictureUrl"
[src]="item.logo ?baseUrlMylearn+'/files/image/'+item.logo : 'assets/images/media/default-pic-gX.png' "
id="profile-img" class="border-radius-1"
style="width: 100px; height: 100px; object-fit: cover;">
} @else if(item.companySource=='ZeeMe'){
<img [src]="item.pictureUrl ? item.pictureUrl:'assets/images/media/default-pic-gX.png'"
id="profile-img" class="border-radius-1"
style="width: 100px; height: 100px; object-fit: cover;">
} @else{
<img [src]="'assets/images/media/default-pic-gX.png'" id="profile-img" class="border-radius-1"
style="width: 100px; height: 100px; object-fit: cover;">
}
</span>
</div>
</td>
......@@ -194,10 +203,11 @@
<div class="ti-modal-header">
<h6 class="modal-title text-[1rem] font-semibold text-defaulttextcolor" id="mail-ComposeLabel">
{{('Form Create Company' | translate)}}
{{('Form Create Company' | translate)}}
</h6>
<button type="button" class="hs-dropdown-toggle !text-[1rem] !font-semibold !text-defaulttextcolor" data-hs-overlay="#modal-detail" #closeModal>
<button type="button" class="hs-dropdown-toggle !text-[1rem] !font-semibold !text-defaulttextcolor"
data-hs-overlay="#modal-detail" #closeModal>
<span class="sr-only">{{'Close' | translate}}</span>
<i class="ri-close-line"></i>
</button>
......@@ -205,55 +215,80 @@
<div class="ti-modal-body px-4">
<div class="grid grid-cols-12 gap-4">
<div class="xl:col-span-12 col-span-12 my-2" >
<div class="xl:col-span-12 col-span-12 my-2">
<label for="deal-title" class="form-label">{{ 'Company Source' | translate}}</label>
@if(action=='add'||(selectHrcompanyModel.companySource=='MyLearn' && action=='edit')){
<div class="flex items-center gap-2 mb-2">
<input type="radio" class="custom-control-input cursor-pointer" name="myLearn" id="myLearnCompany"
[checked]="selectHrcompanyModel.companySource=='MyLearn'"
(click)="newHrcompanyModel();companySourceChange('MyLearn')">
<label class="custom-control-label cursor-pointer font-bold" for="myLearnCompany">
MyLearn
</label>
</div>
}
@if(action=='add'||(selectHrcompanyModel.companySource=='ZeeMe' && action=='edit')){
<div class="flex items-center gap-2 mb-2">
<input type="radio" class="custom-control-input cursor-pointer" name="zeeme" id="zeemeCompany"
[checked]="selectHrcompanyModel.companySource=='ZeeMe'"
(click)=" (selectHrcompanyModel.companySource!='ZeeMe' ? openCompanyModal(): null); companySourceChange('ZeeMe')">
<label class="custom-control-label cursor-pointer font-bold" for="zeemeCompany"
style="align-items: center;">
ZeeMe
</label>
@if(selectHrcompanyModel.companySource=='ZeeMe' && action=='add'){
<label class="custom-control-label cursor-pointer text-info"
style="align-items: center;text-decoration: underline" (click)="openCompanyModal()">
{{ 'เปลี่ยนบริษัท' | translate}}
</label>
}
</div>
}
</div>
@if(selectHrcompanyModel.companySource=='MyLearn'){
<div class="xl:col-span-12 col-span-12 my-2">
<span style="display: flex; justify-content: center;">
<div class="relative">
<label class="form-label !m-0" style="justify-content:center;width: 100%;">
{{ 'Logo Company' | translate}}
</label>
<img
[src]="selectHrcompanyModel.logo ? baseUrlMylearn+'/files/image/'+selectHrcompanyModel.logo :'assets/images/media/default-pic-gX.png'"
id="profile-img" class="border-radius-1" style="max-width:200px;max-height:200px;object-fit: cover;"
[ngStyle]="{'width': (selectHrcompanyModel.logo ? 'auto':'100px'),'height': (selectHrcompanyModel.logo ? 'auto':'100px')}">
<input #logoInputRef ng2FileSelect [uploader]="uploaderLogo" type="file" name="logo" id="logo"
class="hidden" />
<i class="ri-pencil-line cursor-pointer absolute" style="right: -20px;bottom: -5px;font-size: 15px;"
(click)="logoInputRef.click()"></i>
@if(selectHrcompanyModel.logo){
<i class="ri-delete-bin-6-line cursor-pointer absolute"
style="right: -35px;bottom: -5px;font-size: 15px;" (click)="clearLogo(logoInputRef)"></i>
}
</div>
</span>
</div>
<div class="xl:col-span-12 col-span-12 my-2">
<label for="companyCode" class="form-label">{{'Company Code' | translate}}</label>
<input type="text" class="form-control" id="companyCode" placeholder="" [(ngModel)]="selectHrcompanyModel.companyCode"
[disabled]="action === 'edit'" [ngClass]="{'!bg-input-readonly':action === 'edit'}" >
<input type="text" class="form-control" id="companyCode" placeholder=""
[(ngModel)]="selectHrcompanyModel.companyCode" [disabled]="action === 'edit'"
[ngClass]="{'!bg-input-readonly':action === 'edit'}">
<div class="text-danger" *ngIf="!selectHrcompanyModel.companyCode">
{{'Please fill in information' | translate}}
</div>
</div>
<div class="xl:col-span-12 col-span-12 my-2" *ngIf="statusHrcompanyModel=='add'">
<label for="deal-title" class="form-label">{{ 'Company Name' | translate}}</label>
<input type="text" class="form-control" id="deal-title" placeholder="" [(ngModel)]="selectHrcompanyModel.companyName">
<input type="text" class="form-control" id="deal-title" placeholder=""
[(ngModel)]="selectHrcompanyModel.companyName">
<div class="text-danger" *ngIf="!selectHrcompanyModel.companyName">
{{'Please fill in information' | translate}}
</div>
</div>
<!-- <div class="xl:col-span-12 col-span-12 my-2" *ngIf="statusHrcompanyModel=='add'">
<label for="deal-title" class="form-label">{{ 'อีเมลบริษัท' | translate}}</label>
<input type="text"
class="form-control"
id="deal-title"
name="companyEmail"
placeholder=""
required
pattern="^[^\s@]+@[^\s@]+\.[^\s@]+$"
[(ngModel)]="selectHrcompanyModel.companyEmail"
[ngModelOptions]="{ updateOn: 'change' }"
#companyEmailCtrl="ngModel">
<div class="text-danger" *ngIf="companyEmailCtrl.errors?.['required']">
{{ 'Please fill in information' | translate }}
</div>
<div class="text-danger" *ngIf="companyEmailCtrl.errors?.['pattern']">
{{ 'รูปแบบอีเมลไม่ถูกต้อง' | translate }}
</div>
</div> -->
<div class="xl:col-span-12 col-span-12 my-2" *ngIf="statusHrcompanyModel=='add'">
<label for="deal-title" class="form-label">{{ 'Company Email' | translate}}</label>
<input type="text"
class="form-control"
id="deal-title"
name="companyEmail"
placeholder=""
[(ngModel)]="selectHrcompanyModel.companyEmail"
(blur)="onCheckCompanyEmail()">
<input type="text" class="form-control" id="deal-title" name="companyEmail" placeholder=""
[(ngModel)]="selectHrcompanyModel.companyEmail" (blur)="onCheckCompanyEmail()">
<div class="text-danger" *ngIf="validateEmail === 'required'">
{{ 'Please fill in information' | translate }}
......@@ -265,44 +300,199 @@
{{ 'Unable To Use Email' | translate }}
</div>
</div>
<div class="xl:col-span-12 col-span-12 my-2" *ngIf="statusHrcompanyModel=='add'">
<label for="deal-title" class="form-label">{{ 'Logo Company' | translate}}</label>
<input type="text" class="form-control" id="deal-title" placeholder="" [(ngModel)]="selectHrcompanyModel.logo">
</div>
<div class="xl:col-span-12 col-span-12 my-2" *ngIf="statusHrcompanyModel=='add'">
<label for="deal-title" class="form-label">{{ 'Company Address' | translate}}</label>
<input type="text" class="form-control" id="deal-title" placeholder="" [(ngModel)]="selectHrcompanyModel.companyAddr">
<input type="text" class="form-control" id="deal-title" placeholder=""
[(ngModel)]="selectHrcompanyModel.companyAddr">
</div>
<div class="xl:col-span-12 col-span-12 my-2" *ngIf="statusHrcompanyModel=='add'">
<label for="deal-title" class="form-label">{{ 'Company Tel' | translate}}</label>
<input type="text" class="form-control" id="deal-title" placeholder="" [(ngModel)]="selectHrcompanyModel.companyTel">
<input type="text" class="form-control" id="deal-title" placeholder=""
[(ngModel)]="selectHrcompanyModel.companyTel">
</div>
}
@if(selectHrcompanyModel.companySource=='ZeeMe'){
<div class="xl:col-span-12 col-span-12 my-2">
<span style="display: flex; justify-content: center;">
<div class="relative">
<label class="form-label !m-0" style="justify-content:center;width: 100%;">
{{ 'Logo Company' | translate}}
</label>
<img
[src]="selectHrcompanyModel.pictureUrl ?selectHrcompanyModel.pictureUrl:'assets/images/media/default-pic-gX.png'"
id="pictureUrl" class="border-radius-1" style="max-width:200px;max-height:200px;object-fit: cover;"
[ngStyle]="{'width': (selectHrcompanyModel.pictureUrl ? 'auto':'100px'),'height': (selectHrcompanyModel.pictureUrl ? 'auto':'100px')}">
</div>
</span>
</div>
<div class="xl:col-span-12 col-span-12 my-2">
<label for="companyCode" class="form-label">{{'Company Code' | translate}}</label>
<input type="text" class="form-control !bg-input-readonly" disabled id="companyCode"
[(ngModel)]="selectHrcompanyModel.companyCode">
</div>
<div class="xl:col-span-12 col-span-12 my-2" *ngIf="statusHrcompanyModel=='add'">
<label for="deal-title" class="form-label">{{ 'Company Source' | translate}}</label>
<select class="form-control" [(ngModel)]="selectHrcompanyModel.companySource" id="companySource" disabled>
<option value="ZeeMe">ZeeMe</option>
<option value="MyLearn">MyLearn</option>
</select>
<div class="text-danger" *ngIf="!selectHrcompanyModel.companySource">
{{'Please fill in information' | translate}}
<label for="name" class="form-label">{{ 'Company Name' | translate}}</label>
<input type="text" class="form-control !bg-input-readonly" disabled id="name"
[(ngModel)]="selectHrcompanyModel.companyName">
</div>
<div class="xl:col-span-12 col-span-12 my-2" *ngIf="statusHrcompanyModel=='add'">
<label for="email" class="form-label">{{ 'Company Email' | translate}}</label>
<input type="text" class="form-control" id="email" name="companyEmail"
[(ngModel)]="selectHrcompanyModel.companyEmail" (ngModelChange)="onCheckCompanyEmail()">
<div class="text-danger" *ngIf="validateEmail === 'required'">
{{ 'Please fill in information' | translate }}
</div>
<div class="text-danger" *ngIf="validateEmail === 'pattern'">
{{ 'Invalid Email Format' | translate }}
</div>
<div class="text-danger" *ngIf="validateEmail === 'un-usable'">
{{ 'Unable To Use Email' | translate }}
</div>
</div>
}
</div>
<div class="ti-modal-footer">
<button type="button" class="hs-dropdown-toggle ti-btn ti-btn-light align-middle"
data-hs-overlay="#modal-detail">
{{'Cancel' | translate}}
</button>
<button type="button" (click)="saveHrcompanyModel()" class="ti-btn bg-primary text-white !font-medium"
<button type="button" (click)="saveHrcompanyModel()" class="ti-btn bg-primary text-white !font-medium"
[class.ti-btn-disabled]="!selectHrcompanyModel.companyCode || !selectHrcompanyModel.companyName || !selectHrcompanyModel.companyEmail|| (validateEmail !== 'usable')"
[disabled]="!selectHrcompanyModel.companyCode || !selectHrcompanyModel.companyName || !selectHrcompanyModel.companyEmail || (validateEmail !== 'usable')">
{{'Save Data Company' | translate}}</button>
<button type="button" (click)="generateUsersAdmin(selectHrcompanyModel.companyId)" class="ti-btn bg-primary text-white !font-medium"
<button type="button" (click)="generateUsersAdmin(selectHrcompanyModel.companyId)"
class="ti-btn bg-primary text-white !font-medium"
[class.ti-btn-disabled]="!selectHrcompanyModel.companyCode || !selectHrcompanyModel.companyName || !selectHrcompanyModel.companyEmail|| (validateEmail !== 'usable') || !isEnabledBtnAdmin"
[disabled]="!selectHrcompanyModel.companyCode || !selectHrcompanyModel.companyName || !selectHrcompanyModel.companyEmail || (validateEmail !== 'usable') || !isEnabledBtnAdmin">
{{'Create Data AdminCompany' | translate}}</button>
</div>
</div>
</div>
</div>
</div>
<ng-template #companyModal let-dialogRef>
<div class="grid grid-cols-12 gap-6">
<div class="xl:col-span-12 col-span-12">
<div class="box-header justify-between">
<div class="box-title">
รายการบริษัท
</div>
<button type="button" class="hs-dropdown-toggle !text-[1rem] !font-semibold !text-defaulttextcolor"
(click)="companyModalRef?.close()">
<span class="sr-only">{{'Close' | translate}}</span>
<i class="ri-close-line"></i>
</button>
</div>
<div class="box-body" style="padding: 20px;">
<div class="box">
<div class="box-header justify-between">
<div class="box-title">
{{ 'All List' | translate}} <span
class="badge bg-light text-default rounded-full ms-1 text-[0.75rem] align-middle">{{companyFilter().length}}</span>
</div>
<div class="flex flex-wrap gap-2">
<div>
<input class="form-control form-control" type="text" placeholder="ค้นหาบริษัท" [(ngModel)]='searchModal'
(ngModelChange)="pageModal=0">
</div>
</div>
</div>
<div class="table-responsive">
<table class="table whitespace-nowrap min-w-full ti-custom-table-hover">
<thead>
<tr class="border-b border-defaultborder">
<th class="text-center" scope="col">รหัสบริษัท</th>
<th class="text-center" scope="col">ชื่อบริษัท</th>
<th class="text-center" scope="col">สถานะ</th>
</tr>
</thead>
<tbody id="tableBody">
@if(!company.loading && companyFilter().length){
@for (items of companyFilter() | slice: pageModal * pageSizeModal : (pageModal + 1) * pageSizeModal;
track $index) {
<tr (click)="selectCompany(items);companyModalRef?.close()"
class="border border-defaultborder dark:border-defaultborder/10 cursor-pointer">
<td class="font-16 font-medium">
{{items.companyCode}}
</td>
<td class="font-16 font-medium">
{{items.companyName}}
</td>
<td class="font-16 font-medium">
{{items.companyStatus}}
</td>
</tr>
}
} @else {
<tr>
<td [attr.colspan]="3" class="text-center py-4">
@if(company.loading){
<p>กำลังโหลดข้อมูล หรือไม่มีข้อมูลเลย...</p>
} @else{
<p>ไม่พบข้อมูลที่ค้นหา...</p>
}
</td>
</tr>
}
</tbody>
</table>
</div>
<div class="flex items-center flex-wrap overflow-auto" *ngIf="companyFilter().length > 0">
<div class="d-flex justify-content-end p-2">
<select class="custom-select m-r-5 border-color-gray-full-focus" style="width: auto"
[(ngModel)]="pageSizeModal" (ngModelChange)="pageModal=0">
<option *ngFor="let item of [10,50,100]" [ngValue]="item">
{{"รายการต่อหน้า"}}: {{item}}
</option>
</select>
</div>
<div class="mb-2 sm:mb-0">
<div>
{{'Showing' | translate}} {{companyFilter().length}} {{'entries'
| translate}} <i class="bi bi-arrow-right ms-2 font-semibold"></i>
</div>
</div>
<div class="ms-auto">
<nav aria-label="Page navigation">
<ul class="ti-pagination mb-0">
<li *ngIf="pageModal > 0" class="page-item {{pageModal==0 ? 'disabled' : ''}}"><a
class="page-link px-3 py-[0.375rem] cursor-pointer"
(click)="pageModal = pageModal - 1; ">{{'Previous' | translate}}</a>
</li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="pageModal > 0" (click)="pageModal = pageModal - 1; ">{{pageModal}}</a>
</li>
<li class="page-item"><a class="page-link active px-3 py-[0.375rem]"
href="javascript:void(0);">{{pageModal
+ 1}}</a>
</li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="(pageModal + 1) * pageSizeModal < companyFilter().length"
(click)="pageModal = pageModal + 1; ">{{pageModal + 2}}</a></li>
<li class="page-item"><a class="page-link px-3 py-[0.375rem]" href="javascript:void(0);"
*ngIf="(pageModal + 2) * pageSizeModal < companyFilter().length"
(click)="pageModal = pageModal + 2; ">{{pageModal + 3}}</a></li>
<li *ngIf="(pageModal + 1) * pageSizeModal < companyFilter().length" class="page-item"><a
class="page-link px-3 py-[0.375rem] cursor-pointer" (click)="pageModal = pageModal + 1; ">
{{'Next'| translate}}
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div class="box-footer" style="display: flex;justify-content: end;">
<button type="button" class="hs-dropdown-toggle ti-btn ti-btn-light align-middle"
(click)="companyModalRef?.close()">
{{'Cancel' | translate}}
</button>
</div>
</div>
</div>
</ng-template>
\ No newline at end of file
.bg-input-readonly {
background-color: #e5e7eb;
cursor: not-allowed;
}
.\!bg-input-readonly {
background-color: #e5e7eb !important;
cursor: not-allowed !important;
}
\ No newline at end of file
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
import { ChangeDetectorRef, Component, ElementRef, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { SharedModule } from '../../../shared/shared.module';
import { CommonModule } from '@angular/common';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
......@@ -12,13 +12,19 @@ import swal from 'sweetalert';
import { FormsModule } from '@angular/forms';
import { Router } from '@angular/router';
import { ResponseModel } from '../../models/response.model.';
import { MyZeemeCompanyModel, ZeemeCompanyModel } from '../../models/mylearn/zeeme-company.model';
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
import { FileItem, FileUploader, FileUploadModule, ParsedResponseHeaders } from 'ng2-file-upload';
import { environment } from '../../../../environments/environment';
import { TokenService } from '../../../shared/services/token.service';
import { forkJoin } from 'rxjs';
@Component({
selector: 'app-myhrcompany',
templateUrl: './myhrcompany.component.html',
styleUrls: ['./myhrcompany.component.scss'],
standalone: true,
imports: [CommonModule, SharedModule, TranslateModule, FormsModule],
imports: [CommonModule, SharedModule, TranslateModule, FormsModule, FileUploadModule],
})
export class MyhrcompanyComponent implements OnInit {
HrcompanyList: HrcompanyModel[] = [];
......@@ -32,7 +38,7 @@ export class MyhrcompanyComponent implements OnInit {
validateEmail: string = 'required'; // '' | 'required' | 'pattern' | 'un-usable' | 'usable'
isEnabledBtnAdmin: boolean = false;
companyId: string;
companyId: string = '';
action = 'new';
_searchTerm = '';
......@@ -54,15 +60,56 @@ export class MyhrcompanyComponent implements OnInit {
this.updatePagedItems();
}
}
@ViewChild('companyModal') companyModal!: TemplateRef<any>;
@ViewChild('logoInputRef') logoInputRef!: ElementRef;
companyModalRef?: MatDialogRef<any>;
tableHover: Map<string, boolean> = new Map<string, boolean>()
buttonHover: Map<string, boolean> = new Map<string, boolean>()
pageModal = 0
pageSizeModal = 10
company: { loading: boolean, list: ZeemeCompanyModel[] } = { loading: false, list: [] }
uploaderLogo?: FileUploader
searchModal = ''
baseUrlMylearn = environment.baseUrlMylearn
constructor(
private myhrcompanyservice: MyhrcompanyService,
private userService: UserService,
public translate: TranslateService,
private router: Router
) {}
private router: Router,
private modal: MatDialog,
private tokenService: TokenService,
private cdr: ChangeDetectorRef
) { this.uploadConfig() }
ngOnInit(): void {
this.getListMyHRCompany();
this.getCompanyList()
}
getCompanyList() {
this.company.loading = true
forkJoin({
hrCompany: this.myhrcompanyservice.getList(),
zeemeCompany: this.myhrcompanyservice.getZeemeCompanyList()
}).subscribe({
next: (result) => {
this.MyhrcompanyList = result.hrCompany.map(
(x: HrcompanyModel) => new MyHrcompanyModel(x, this.translate)
)
this.HrcompanyList = this.MyhrcompanyList;
this.updatePagedItems();
this.getMyHRCompanyExternal();
const hrCompany = new Set(result.hrCompany.map(o => o.companyId));
this.company.list = result.zeemeCompany.map(e => new MyZeemeCompanyModel(e)).filter(o => !hrCompany.has(o.companyId));
this.company.loading = false
this.cdr.markForCheck()
},
error: (err) => {
this.company.loading = false
swal('ข้อผิดพลาด', 'ไม่สามารถดึงข้อมูลบริษัทได้', 'error');
this.cdr.markForCheck()
}
});
}
onCheckboxChange(companyId: string) {
......@@ -102,22 +149,7 @@ export class MyhrcompanyComponent implements OnInit {
this.filterList = this.HrcompanyList.slice(startIndex, endIndex);
}
getListMyHRCompany() {
this.myhrcompanyservice.getList().subscribe({
next: (response: HrcompanyModel[]) => {
this.MyhrcompanyList = response.map(
(x: HrcompanyModel) => new MyHrcompanyModel(x, this.translate)
);
this.HrcompanyList = this.MyhrcompanyList;
this.updatePagedItems();
this.getMyHRCompanyExternal();
},
error: (error) => {
console.error('error cant get article', error);
swal('ข้อผิดพลาด', 'ไม่สามารถดึงข้อมูลบริษัทได้', 'error');
},
});
}
getMyHRCompanyExternal() {
const externalCompanyId = '5f3c2b6e-8d7a-4b2f-a3e6-9f1d8c4e7b0a';
......@@ -128,7 +160,6 @@ export class MyhrcompanyComponent implements OnInit {
this.updatePagedItems();
},
error: (error) => {
console.error("error can't get external company", error);
swal(
'เกิดข้อผิดพลาด',
'ไม่สามารถดึงข้อมูล external company ได้',
......@@ -144,7 +175,6 @@ export class MyhrcompanyComponent implements OnInit {
const company = new MyHrcompanyModel(response, this.translate);
},
error: (error) => {
console.error("error can't get myhrcompany by Id");
swal('เกิดข้อผิดพลาด', 'ไม่สามารถดึงข้อมูลบริษัทได้', 'error');
},
});
......@@ -154,10 +184,13 @@ export class MyhrcompanyComponent implements OnInit {
this.router.navigate(['/mylearn/myhrcompany/manage-course', companyId]);
}
companySourceChange(companySource: 'MyLearn' | 'ZeeMe') {
this.selectHrcompanyModel.companySource = companySource
}
newHrcompanyModel() {
this.action = 'add';
this.statusHrcompanyModel = 'add';
this.selectHrcompanyModel = new MyHrcompanyModel();
this.selectHrcompanyModel.companyId = '';
this.selectHrcompanyModel.companyCode = '';
......@@ -185,8 +218,6 @@ export class MyhrcompanyComponent implements OnInit {
viewHrcompanyModel(item: HrcompanyModel) {
this.action = 'edit';
this.selectHrcompanyModel = new MyHrcompanyModel(item);
console.log('viewHrcompanyModel is:', this.selectHrcompanyModel);
if (this.selectHrcompanyModel.companyEmail === '') {
this.validateEmail = 'required';
} else {
......@@ -196,10 +227,6 @@ export class MyhrcompanyComponent implements OnInit {
}
saveHrcompanyModel() {
console.log(
'Before Save, selectHrcompanyModel is:',
this.selectHrcompanyModel
);
swal({
title: 'คุณแน่ใจหรือไม่?',
text: 'คุณต้องการบันทึกหรือไม่',
......@@ -213,13 +240,11 @@ export class MyhrcompanyComponent implements OnInit {
.postMyHRcompany(this.selectHrcompanyModel, action)
.subscribe(
(result) => {
console.log(result);
swal('บันทึกสำเร็จ!!', 'บันทึกข้อมูลสมาชิก', 'success');
this.ngOnInit();
this.childModal?.nativeElement.click();
},
(error) => {
console.error('เกิดข้อผิดพลาดในการบันทึก/อัปเดต:', error);
swal('ข้อผิดพลาด!!', 'ไม่สามารถบันทึก/อัปเดตข้อมูลได้', 'error');
}
);
......@@ -320,8 +345,8 @@ export class MyhrcompanyComponent implements OnInit {
if (response.success === true) {
const userResult = response.resultObject as any;
const msg = "User : " + (userResult ? userResult.username : '') + '\n' +
"Password : " + (userResult ? userResult.password : '') + '\n';
swal('บันทึกสำเร็จ!!', 'สร้าง User Admin เรียบร้อย\n\n '+ msg, 'success');
"Password : " + (userResult ? userResult.password : '') + '\n';
swal('บันทึกสำเร็จ!!', 'สร้าง User Admin เรียบร้อย\n\n ' + msg, 'success');
this.ngOnInit();
} else if (
response.success === false &&
......@@ -353,4 +378,102 @@ export class MyhrcompanyComponent implements OnInit {
},
});
}
openCompanyModal() {
this.pageModal = 0;
this.pageSizeModal = 10;
this.companyModalRef = this.modal.open(this.companyModal, {
width: '1500px',
height: '700px',
maxWidth: 'none',
disableClose: true,
data: {}
});
this.companyModalRef.afterClosed().subscribe(result => {
});
}
companyFilter() {
return this.company.list.filter(e => e.companyCode.toLowerCase().includes(this.searchModal.toLowerCase()) ||
e.companyName.toLowerCase().includes(this.searchModal.toLowerCase()) ||
e.companyStatus.toLowerCase().includes(this.searchModal.toLowerCase()))
}
selectCompany(body: ZeemeCompanyModel) {
this.selectHrcompanyModel.companyId = body.companyId
this.selectHrcompanyModel.companyCode = body.companyCode;
this.selectHrcompanyModel.companyName = body.companyName;
this.selectHrcompanyModel.pictureUrl = body.pictureCompany;
}
uploadConfig() {
this.uploaderLogo = new FileUploader({
url: this.baseUrlMylearn + "/files/upload-image",
isHTML5: true,
authToken: this.tokenService.getToken()!,
});
this.uploaderLogo.onAfterAddingFile = (fileItem: FileItem) => {
fileItem.withCredentials = false;
// this.uploadErrorMsg = "";
while (this.uploaderLogo!.queue.length > 1) {
this.uploaderLogo!.queue[0].remove();
}
if (fileItem.file.size > 5000000) {
// this.uploadErrorMsg = "maximum file size 5mb.";
swal("Opp!!", "ไม่สามารถอัพโหลดได้", "info");
fileItem.isCancel = true;
return;
}
if (fileItem.file.type!.indexOf("image") === -1) {
// this.uploadErrorMsg = "please upload image only.";
swal("Opp!!", "ไม่สามารถอัพโหลดได้", "info");
fileItem.isCancel = true;
return;
}
fileItem.upload();
};
this.uploaderLogo.onCompleteItem = (
item: FileItem,
response: string,
status: number,
headers: ParsedResponseHeaders
) => {
if (item.isSuccess) {
const res = JSON.parse(response);
this.selectHrcompanyModel.logo = res.resultObject;
swal(res.message, "บันทึกสำเร็จ", "success");
} else {
// this.uploadErrorMsg = "cannot upload file.";
console.log('123')
swal("Opp!!", "ไม่สามารถอัพโหลดได้", "info");
}
};
}
triggerFileInput(): void {
if (this.logoInputRef) {
this.logoInputRef.nativeElement.click();
}
}
clearLogo(input: HTMLInputElement) {
this.selectHrcompanyModel.logo = '';
input.value = '';
if (this.uploaderLogo) {
this.uploaderLogo.clearQueue();
}
}
}
......@@ -19,6 +19,10 @@ export const MYLEARN_ROUTES: Routes = [
loadComponent: () => import('./myhrcompany/myhrcompany.component').then((m) => m.MyhrcompanyComponent),
},
{
path: 'employee-manage',
loadComponent: () => import('./employee-manage/employee-manage.component').then((m) => m.EmployeeManageComponent),
},
{
path: 'management-user',
loadComponent: () => import('./management-user/management-user.component').then((m) => m.ManagementUserComponent),
},
......
......@@ -5,6 +5,8 @@ import { environment } from '../../../../environments/environment';
import { HrcompanyModel } from '../../models/mylearn/myhrcompany.model';
import { AlertModel } from '../../models/alert.model';
import { ResponseModel } from '../../models/response.model.';
import { ZeemeCompanyModel } from '../../models/mylearn/zeeme-company.model';
import { EmployeeSyncModel } from '../../models/mylearn/employee-sync.model';
@Injectable({
providedIn: 'root',
......@@ -12,7 +14,7 @@ import { ResponseModel } from '../../models/response.model.';
export class MyhrcompanyService {
api = '/myhrcompany';
urlApi = environment.baseUrlMylearn + '/myhrcompany';
constructor(private http: HttpClient) {}
constructor(private http: HttpClient) { }
getCompany() {
return this.http.get<HrcompanyModel>(this.urlApi);
......@@ -40,4 +42,23 @@ export class MyhrcompanyService {
return this.http.get<ResponseModel>(`${this.urlApi}/generate-usersadmin?companyId=${companyId}`
);
}
getZeemeCompanyList(): Observable<ZeemeCompanyModel[]> {
return this.http.get<ZeemeCompanyModel[]>(`https://zeeme.myhr.co.th/ZeemeApi/rest/company/list`);
}
getZeemeCompanyConfig(companyId: string): Observable<any[]> {
return this.http.get<any[]>(`https://zeeme.myhr.co.th/ZeemeApi/rest/company/config-myhr/${companyId}`);
}
getZeemeEmployeeProfileSyncList(companyId: string): Observable<EmployeeSyncModel[]> {
return this.http.get<EmployeeSyncModel[]>(`https://zeeme.myhr.co.th/ZeemeApi/rest/employee/profile-sync/${companyId}`);
}
getZeemeEmployeeProfileSync(companyId: string, memberId: string): Observable<EmployeeSyncModel> {
return this.http.get<EmployeeSyncModel>(`https://zeeme.myhr.co.th/ZeemeApi/rest/employee/profile-sync/${companyId}/${memberId}`);
}
syncProfile(employeeSync: EmployeeSyncModel[]): Observable<ResponseModel> {
return this.http.put<ResponseModel>(`${environment.baseUrlMylearn}/sync/profile/v2`, employeeSync);
}
}
......@@ -30,7 +30,9 @@ export class HttpRequestInterceptor {
let token: string | null = null;
// ใช้ fixed token หาก url เป็น portal.myhr.co.th
if (fullUrl.startsWith(environment.url)) {
if (fullUrl.startsWith('https://zeeme.myhr.co.th/ZeemeApi/rest')) {
token = `Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJBdXRoIiwidWlkIjoiNWRhY2ZhNzAtZmNmMy0xMWU4LWIyM2UtODVlNjZkMDgwNzk5IiwiaXNzIjoiQ29tcHV0ZXIgU2NpZW5jZSBDb3Jwb3JhdGlvbiBMaW1pdGVkIiwiZGV2aWNlbm8iOiJzc3Nzc3NzIiwibWVtYmVySWQiOiI1ZGFjZmE3MC1mY2YzLTExZTgtYjIzZS04NWU2NmQwODA3OTkifQ.KghztZYthsmjaZ36vc6gOa0HJHLT3_i0sKJ_HY4OAaY`;
} else if (fullUrl.startsWith(environment.url)) {
token = `Bearer ${environment.portalFixedToken}`;
} else if (this.tokenService.getAppToken()) {
token = `Bearer ${this.tokenService.getAppToken()}`;
......
......@@ -325,6 +325,7 @@ export class NavService implements OnDestroy {
children: [
{ path: '/portal-manage/mylearn/mylearn-pdpa-manage', title: 'จัดการ PDPA', type: 'link' },
{ path: '/portal-manage/mylearn/myhrcompany', title: 'จัดการบริษัท', type: 'link' },
{ path: '/portal-manage/mylearn/employee-manage', title: 'จัดการพนักงาน', type: 'link' },
{ path: '/portal-manage/mylearn/management-user', title: 'การจัดการผู้ใช้งาน', type: 'link' },
{ path: '/portal-manage/mylearn/course-transfer', title: 'โอนย้ายคอร์ส', type: 'link' },
{ path: '/portal-manage/mylearn/timeout-screen-manage', title: 'จัดการเวลาหน้าจอ', type: 'link' },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment