bug fixed
This commit is contained in:
parent
aa4bcf9c43
commit
1400048991
83
package-lock.json
generated
83
package-lock.json
generated
|
@ -1771,9 +1771,9 @@
|
||||||
"integrity": "sha512-FDg7WLiq5Y5aPxC66LXKQOnqily1zcaUdtl3ZMGU3HfENod/d6aFarqFZOw5y0C+OZQ1LB+jIKa+AP0V4zC0Ug=="
|
"integrity": "sha512-FDg7WLiq5Y5aPxC66LXKQOnqily1zcaUdtl3ZMGU3HfENod/d6aFarqFZOw5y0C+OZQ1LB+jIKa+AP0V4zC0Ug=="
|
||||||
},
|
},
|
||||||
"@ucap/core": {
|
"@ucap/core": {
|
||||||
"version": "0.0.4",
|
"version": "0.0.5",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/core/-/core-0.0.4.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/core/-/core-0.0.5.tgz",
|
||||||
"integrity": "sha512-pghZ8oC0IKuD3c/ztAbkUFWaJMHyjRNtWKhOcOl6hFr9ttvmzAZNfXfOm5Wp30ROOXWDITYrjVQ4OC/vte7GHg=="
|
"integrity": "sha512-Qg9Sgm1go7VCTtHCt8ihUeMxzZSIx2ZvhAE/XRKlHCOUm5hMUlIEvpp5gDPmlN+LBg+DtgZul7fi9G7iGiB7sA=="
|
||||||
},
|
},
|
||||||
"@ucap/logger": {
|
"@ucap/logger": {
|
||||||
"version": "0.0.7",
|
"version": "0.0.7",
|
||||||
|
@ -1951,9 +1951,14 @@
|
||||||
"integrity": "sha512-U/tpzUgXSGrWzetmmqEcLYYzgCUEew3C0CcfYSr+ajkt4AvHqcFijqXARVHXVahfAkMXZU69/8etDhzWmOcvGw=="
|
"integrity": "sha512-U/tpzUgXSGrWzetmmqEcLYYzgCUEew3C0CcfYSr+ajkt4AvHqcFijqXARVHXVahfAkMXZU69/8etDhzWmOcvGw=="
|
||||||
},
|
},
|
||||||
"@ucap/ng-ui-authentication": {
|
"@ucap/ng-ui-authentication": {
|
||||||
"version": "0.0.8",
|
"version": "0.0.14",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-ui-authentication/-/ng-ui-authentication-0.0.8.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-ui-authentication/-/ng-ui-authentication-0.0.14.tgz",
|
||||||
"integrity": "sha512-n6pV113DuSD5TV4jAwrY/JJlhcBtNLHEFTTxrQ8QhFIMz9hgbRC6x4R/LF8q9kzx0BWQcgxGdfgY1oN3YoqGtg=="
|
"integrity": "sha512-wejkhebthEUub9nGigu9/fENB7hwOHrYTDq4dPmitxKeb3o1RNdbjAzaEB0QlVmLF+/ReydWZqr2d4d8Dus+/g=="
|
||||||
|
},
|
||||||
|
"@ucap/ng-ui-organization": {
|
||||||
|
"version": "0.0.2",
|
||||||
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/ng-ui-organization/-/ng-ui-organization-0.0.2.tgz",
|
||||||
|
"integrity": "sha512-xywle2jhGaaNxkH+9VLvIOxfFzdLMf5nGP7fqW9gPSZiK51OR5s81UwWoXCeQRfnJuUX+6U97LoY7KAO5c0LLA=="
|
||||||
},
|
},
|
||||||
"@ucap/ng-ui-skin-default": {
|
"@ucap/ng-ui-skin-default": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
|
@ -1966,29 +1971,29 @@
|
||||||
"integrity": "sha512-r74sXWxe6dHD/tiJ4VcWQ+oRD2yDbIFNJtsO7NyI/pMRILXyUX5qUDl53SEPL4m1vSFGXztIDyQ6DSi7UYcWCw=="
|
"integrity": "sha512-r74sXWxe6dHD/tiJ4VcWQ+oRD2yDbIFNJtsO7NyI/pMRILXyUX5qUDl53SEPL4m1vSFGXztIDyQ6DSi7UYcWCw=="
|
||||||
},
|
},
|
||||||
"@ucap/pi": {
|
"@ucap/pi": {
|
||||||
"version": "0.0.4",
|
"version": "0.0.5",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/pi/-/pi-0.0.4.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/pi/-/pi-0.0.5.tgz",
|
||||||
"integrity": "sha512-faQQ8cV3GFChN84yUwfWq/KL2WKT0QaNS8hsVI9qWRXSqRaIkA9AGxZM9u/YhUB1NGMIQDz6hyJ/iD9B9l8JFA=="
|
"integrity": "sha512-nWev387pHxeBHtOu0EvRTVQ0/JeJL44Ew0PzQaiqHsC5mghkJ6ok7z22nk9nmuZ7lONxGJmW7CHT8X8lyviZJg=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol": {
|
"@ucap/protocol": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.4",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol/-/protocol-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol/-/protocol-0.0.4.tgz",
|
||||||
"integrity": "sha512-+lk492tb+vXeXJfINiW63Po9gytuA9EZwriZiYApHhLG0DeTUnL/FjWMspGNG7vHlhp2kld3zJlThZ45jz/YQQ=="
|
"integrity": "sha512-ChkRjoJQqfwVj6Itv/OnI3jtFUP8W/5b6kVLgyq1cOITdxata3/nH9NB2DFFxSpKs4fVTulMvJ/qOBSY2jku0Q=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-authentication": {
|
"@ucap/protocol-authentication": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-authentication/-/protocol-authentication-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-authentication/-/protocol-authentication-0.0.3.tgz",
|
||||||
"integrity": "sha512-DSnoPvWAfLLWb8WMfCX72vJHvNrj5GKM90p6mo8GUML1F9s440ovaSpNmiLkq32TPhJeFvGI6R8oqdQzI1lASg=="
|
"integrity": "sha512-/rqlHbqZr5phu5ytwviBntw240Ia/99tS4GCY4eMHj8GCWzH3qAayRFS+PSYK/3DfD+Wx6sTCwtE4yVIo/b9pw=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-buddy": {
|
"@ucap/protocol-buddy": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-buddy/-/protocol-buddy-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-buddy/-/protocol-buddy-0.0.3.tgz",
|
||||||
"integrity": "sha512-HvwU2DCGrloB0U3jnGqfORmCu+j/sV/4VsAZooCX6kTzP8r+SF2PvgSLm87KzMhCV3BjOR7vhwl/bu7CDh75iQ=="
|
"integrity": "sha512-Nn86QUXUDF6R8kiV5DqbRoiBgEb0sVn5FuslZNbNcG3hNLmu3EtPuxeHDDwyNaojiBC4tCHB/SyJyL6V7VTAqA=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-event": {
|
"@ucap/protocol-event": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-event/-/protocol-event-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-event/-/protocol-event-0.0.3.tgz",
|
||||||
"integrity": "sha512-qEVyzf0aMm0yVqhLlLOjD9WgfAo+BMtxtyGc4oFSjIMhUPLxiX0DQ5r5f+SH2YDYUjKZD37NjhXbq3CCSeXfTA=="
|
"integrity": "sha512-9vEIpbgJk1yCkXPNJn/d2zxcIfNuZXTG3wOwNE7tBgPabQ3zmWn2Mgn6n8pDIPiY8HynHwx5Xe6Cyl6kMZQREA=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-file": {
|
"@ucap/protocol-file": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
|
@ -1996,14 +2001,14 @@
|
||||||
"integrity": "sha512-/uLPgJBe4Upu/hkiUCXJb1x0/QtTUaxMfm/6tSdErZsFgUB0rlBKEO87N+waM1PwFGARbIBIvdT5E1Q9Tn7jUA=="
|
"integrity": "sha512-/uLPgJBe4Upu/hkiUCXJb1x0/QtTUaxMfm/6tSdErZsFgUB0rlBKEO87N+waM1PwFGARbIBIvdT5E1Q9Tn7jUA=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-group": {
|
"@ucap/protocol-group": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-group/-/protocol-group-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-group/-/protocol-group-0.0.3.tgz",
|
||||||
"integrity": "sha512-ZkUA9mEphYwsRjuwQ7bQZ7e+suSi+wiLG+NMwj8fwhCoEUkxASBuSgYKIo2RyuMgew8Oei535t6UpokGYKTS+A=="
|
"integrity": "sha512-40iDldQy99bwbcOKAxHZjcK4SJku7V2x8vEQx1unWdb34VvOSl7YmS1/PzK3UWl799G3pYVVh9cDYmI16Q6zsQ=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-info": {
|
"@ucap/protocol-info": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-info/-/protocol-info-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-info/-/protocol-info-0.0.3.tgz",
|
||||||
"integrity": "sha512-yonCF0rFtfwQYk7pPtcGHo/hhXe9xuxdGFoBd8iGDJSxNJDr4s/j/dsLTCiyWRTS/H9K+8A2cABCrfpGn0KVTA=="
|
"integrity": "sha512-q1csFIShCYcKjplswr65jZcV8R/ktD13SS5TLMgFbMz4zBpyk2QSPcgI0e3ts7jHOz0bG14Iw7j1Lc9G+xlRUA=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-inner": {
|
"@ucap/protocol-inner": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
|
@ -2026,9 +2031,9 @@
|
||||||
"integrity": "sha512-xfzEFchd9FYPbj21UtZo0WwS+LhDPTwSaCnWQHGRtFg3waDAgaEjKRhaCNlUuxXhHWuSnKBHUS50HsQTojUArQ=="
|
"integrity": "sha512-xfzEFchd9FYPbj21UtZo0WwS+LhDPTwSaCnWQHGRtFg3waDAgaEjKRhaCNlUuxXhHWuSnKBHUS50HsQTojUArQ=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-room": {
|
"@ucap/protocol-room": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-room/-/protocol-room-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-room/-/protocol-room-0.0.3.tgz",
|
||||||
"integrity": "sha512-wb381vwN8G6WYs/qwN+8HrsmVwwGfH8bJ4P+zndHx39KUtAiOHn90k60FE7l7Fz0gvrN/WAzgwTD6UbdbdvkxA=="
|
"integrity": "sha512-+f7dpBbMflrcXTGVVhOH62GFa/H08mXqxj8AXRJ2n7pCmb+v5f4+mfmCu1vCTuBfwObisXeARlOhWaVIJpMXzw=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-service": {
|
"@ucap/protocol-service": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
|
@ -2036,9 +2041,9 @@
|
||||||
"integrity": "sha512-KUI5RBeJ3Wfkvw4P0Mxg9hc6FRyQi0CgVl1fkVV0POiVg38VyLBDROjF4PWJ9OpPbd1UF/azWvcm/04XqBryjg=="
|
"integrity": "sha512-KUI5RBeJ3Wfkvw4P0Mxg9hc6FRyQi0CgVl1fkVV0POiVg38VyLBDROjF4PWJ9OpPbd1UF/azWvcm/04XqBryjg=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-status": {
|
"@ucap/protocol-status": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-status/-/protocol-status-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-status/-/protocol-status-0.0.3.tgz",
|
||||||
"integrity": "sha512-h8Kw+aZkwbHmf/Xknz3//f0RqZYTOmVr98mfLAhW5EHQDR9Lf0YZXIUAsIvHQ1NPI3nEK5/SJnOPDesZKwqLmw=="
|
"integrity": "sha512-PmepRcuLEqNqA0N3068bxTsEdk1xL8NaE54rBONiGwRhQQfFXDKMpao+dJAAJpKMpTf5NzlvlLuT2x2eh6IBnA=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-sync": {
|
"@ucap/protocol-sync": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
|
@ -2046,9 +2051,9 @@
|
||||||
"integrity": "sha512-Uu0V8kPb0FXg+zmEjLRN3T+O1tJ17PbrJEDN/YDEkrTs0TsKFANSeCZLqGOx0tk5e/eFpDtfNguXpPI1iCQmwg=="
|
"integrity": "sha512-Uu0V8kPb0FXg+zmEjLRN3T+O1tJ17PbrJEDN/YDEkrTs0TsKFANSeCZLqGOx0tk5e/eFpDtfNguXpPI1iCQmwg=="
|
||||||
},
|
},
|
||||||
"@ucap/protocol-umg": {
|
"@ucap/protocol-umg": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-umg/-/protocol-umg-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/protocol-umg/-/protocol-umg-0.0.3.tgz",
|
||||||
"integrity": "sha512-PC9+c13YMoIyY+Pm3q9LQUYGePnPOmf56+n3EnztPyfcmqHOH0UL+7HqMByg+SjMKY5j+BCI6gFMnlKTtQK3Yw=="
|
"integrity": "sha512-zggPmkLcBlTVnEr1qRnnx1Dam8m+7cPCaWLPdeABtiymAYBzXr3uJAtxe4/k0q46WFUHq5J/GkmbnSonH9dUKg=="
|
||||||
},
|
},
|
||||||
"@ucap/web-socket": {
|
"@ucap/web-socket": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
|
@ -2056,9 +2061,9 @@
|
||||||
"integrity": "sha512-hKAEsIzMhUuR8u26ENkuIAh4Xp8ltzBlZggxhqtLifP8KbgQdWD3w3+1M1697MPni8q42+Q/ZH/1IHLdi8KB7w=="
|
"integrity": "sha512-hKAEsIzMhUuR8u26ENkuIAh4Xp8ltzBlZggxhqtLifP8KbgQdWD3w3+1M1697MPni8q42+Q/ZH/1IHLdi8KB7w=="
|
||||||
},
|
},
|
||||||
"@ucap/web-storage": {
|
"@ucap/web-storage": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.3",
|
||||||
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/web-storage/-/web-storage-0.0.2.tgz",
|
"resolved": "http://10.81.13.221:8081/nexus/repository/npm-all/@ucap/web-storage/-/web-storage-0.0.3.tgz",
|
||||||
"integrity": "sha512-KyZlFCmEfEsMo9h1fI2mZjULfpE9PEybf1Ax5N5cR4H/IZRSYsA+pCEgV+u9RAxIn0h/fI+y2sg60bpheorEIA=="
|
"integrity": "sha512-JRRCXFmTD8D82OoUZTiAbYk/R4feTAgie16kAcnVBnf2vc6yc8s6llFmREWDWhKMrhyLnYIK9A1oLElSNrmHUQ=="
|
||||||
},
|
},
|
||||||
"@webassemblyjs/ast": {
|
"@webassemblyjs/ast": {
|
||||||
"version": "1.8.5",
|
"version": "1.8.5",
|
||||||
|
|
29
package.json
29
package.json
|
@ -37,7 +37,7 @@
|
||||||
"@ucap/api-message": "~0.0.3",
|
"@ucap/api-message": "~0.0.3",
|
||||||
"@ucap/api-prompt": "~0.0.3",
|
"@ucap/api-prompt": "~0.0.3",
|
||||||
"@ucap/api-public": "~0.0.3",
|
"@ucap/api-public": "~0.0.3",
|
||||||
"@ucap/core": "~0.0.4",
|
"@ucap/core": "~0.0.5",
|
||||||
"@ucap/logger": "~0.0.7",
|
"@ucap/logger": "~0.0.7",
|
||||||
"@ucap/native": "~0.0.6",
|
"@ucap/native": "~0.0.6",
|
||||||
"@ucap/native-browser": "~0.0.5",
|
"@ucap/native-browser": "~0.0.5",
|
||||||
|
@ -74,27 +74,28 @@
|
||||||
"@ucap/ng-store-organization": "~0.0.3",
|
"@ucap/ng-store-organization": "~0.0.3",
|
||||||
"@ucap/ng-web-storage": "~0.0.1",
|
"@ucap/ng-web-storage": "~0.0.1",
|
||||||
"@ucap/ng-ui": "~0.0.3",
|
"@ucap/ng-ui": "~0.0.3",
|
||||||
"@ucap/ng-ui-authentication": "~0.0.8",
|
"@ucap/ng-ui-organization": "~0.0.2",
|
||||||
|
"@ucap/ng-ui-authentication": "~0.0.14",
|
||||||
"@ucap/ng-ui-skin-default": "~0.0.1",
|
"@ucap/ng-ui-skin-default": "~0.0.1",
|
||||||
"@ucap/pi": "~0.0.4",
|
"@ucap/pi": "~0.0.5",
|
||||||
"@ucap/protocol": "~0.0.2",
|
"@ucap/protocol": "~0.0.4",
|
||||||
"@ucap/protocol-authentication": "~0.0.2",
|
"@ucap/protocol-authentication": "~0.0.3",
|
||||||
"@ucap/protocol-buddy": "~0.0.2",
|
"@ucap/protocol-buddy": "~0.0.3",
|
||||||
"@ucap/protocol-event": "~0.0.2",
|
"@ucap/protocol-event": "~0.0.3",
|
||||||
"@ucap/protocol-file": "~0.0.2",
|
"@ucap/protocol-file": "~0.0.2",
|
||||||
"@ucap/protocol-group": "~0.0.2",
|
"@ucap/protocol-group": "~0.0.3",
|
||||||
"@ucap/protocol-info": "~0.0.2",
|
"@ucap/protocol-info": "~0.0.3",
|
||||||
"@ucap/protocol-inner": "~0.0.2",
|
"@ucap/protocol-inner": "~0.0.2",
|
||||||
"@ucap/protocol-option": "~0.0.4",
|
"@ucap/protocol-option": "~0.0.3",
|
||||||
"@ucap/protocol-ping": "~0.0.2",
|
"@ucap/protocol-ping": "~0.0.2",
|
||||||
"@ucap/protocol-query": "~0.0.2",
|
"@ucap/protocol-query": "~0.0.2",
|
||||||
"@ucap/protocol-room": "~0.0.2",
|
"@ucap/protocol-room": "~0.0.3",
|
||||||
"@ucap/protocol-service": "~0.0.2",
|
"@ucap/protocol-service": "~0.0.2",
|
||||||
"@ucap/protocol-status": "~0.0.2",
|
"@ucap/protocol-status": "~0.0.3",
|
||||||
"@ucap/protocol-sync": "~0.0.2",
|
"@ucap/protocol-sync": "~0.0.2",
|
||||||
"@ucap/protocol-umg": "~0.0.2",
|
"@ucap/protocol-umg": "~0.0.3",
|
||||||
"@ucap/web-socket": "~0.0.2",
|
"@ucap/web-socket": "~0.0.2",
|
||||||
"@ucap/web-storage": "~0.0.2",
|
"@ucap/web-storage": "~0.0.3",
|
||||||
"autolinker": "^3.13.0",
|
"autolinker": "^3.13.0",
|
||||||
"axios": "^0.19.2",
|
"axios": "^0.19.2",
|
||||||
"classlist.js": "^1.1.20150312",
|
"classlist.js": "^1.1.20150312",
|
||||||
|
|
|
@ -44,6 +44,8 @@ import { AuthenticationStoreModule } from '@ucap/ng-store-authentication';
|
||||||
import { GroupStoreModule } from '@ucap/ng-store-group';
|
import { GroupStoreModule } from '@ucap/ng-store-group';
|
||||||
import { ChatStoreModule } from '@ucap/ng-store-chat';
|
import { ChatStoreModule } from '@ucap/ng-store-chat';
|
||||||
|
|
||||||
|
import { OrganizationUiModule } from '@ucap/ng-ui-organization';
|
||||||
|
|
||||||
import { AppLayoutsModule } from '@app/layouts/layouts.module';
|
import { AppLayoutsModule } from '@app/layouts/layouts.module';
|
||||||
|
|
||||||
import { AppProviderModule } from '@app/app-provider.module';
|
import { AppProviderModule } from '@app/app-provider.module';
|
||||||
|
@ -107,6 +109,8 @@ import { environment } from '@environments';
|
||||||
GroupStoreModule.forRoot({ useMyDeptGroup: true, fixedGroupSeqs: [] }),
|
GroupStoreModule.forRoot({ useMyDeptGroup: true, fixedGroupSeqs: [] }),
|
||||||
ChatStoreModule.forRoot({}),
|
ChatStoreModule.forRoot({}),
|
||||||
|
|
||||||
|
OrganizationUiModule.forRoot({}),
|
||||||
|
|
||||||
AppProviderModule,
|
AppProviderModule,
|
||||||
AppRoutingModule,
|
AppRoutingModule,
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
[loginId]="userStore?.loginId"
|
[loginId]="userStore?.loginId"
|
||||||
[disable]="disableLoginForm"
|
[disable]="disableLoginForm"
|
||||||
[processing]="loginProcessing"
|
[processing]="loginProcessing"
|
||||||
|
[loginTry]="loginTry"
|
||||||
(login)="onLogin($event)"
|
(login)="onLogin($event)"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { MatCheckbox } from '@angular/material/checkbox';
|
||||||
import { Store, select } from '@ngrx/store';
|
import { Store, select } from '@ngrx/store';
|
||||||
|
|
||||||
import { Company } from '@ucap/api-external';
|
import { Company } from '@ucap/api-external';
|
||||||
|
import { LoginTry } from '@ucap/pi';
|
||||||
|
|
||||||
import { LogService } from '@ucap/ng-logger';
|
import { LogService } from '@ucap/ng-logger';
|
||||||
import { I18nService } from '@ucap/ng-i18n';
|
import { I18nService } from '@ucap/ng-i18n';
|
||||||
|
@ -19,7 +20,7 @@ import { LoginActions } from '@ucap/ng-store-authentication';
|
||||||
import { UserStore } from '@app/models/user-store';
|
import { UserStore } from '@app/models/user-store';
|
||||||
import { LoginSession } from '@app/models/login-session';
|
import { LoginSession } from '@app/models/login-session';
|
||||||
import { AppKey } from '@app/types/app-key.type';
|
import { AppKey } from '@app/types/app-key.type';
|
||||||
import { take } from 'rxjs/operators';
|
import { take, filter } from 'rxjs/operators';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-sections-account-login',
|
selector: 'app-sections-account-login',
|
||||||
|
@ -52,8 +53,10 @@ export class LoginSectionComponent implements OnInit, OnDestroy {
|
||||||
companyList: Company[];
|
companyList: Company[];
|
||||||
disableLoginForm = false;
|
disableLoginForm = false;
|
||||||
loginProcessing = false;
|
loginProcessing = false;
|
||||||
|
loginTry: LoginTry;
|
||||||
|
|
||||||
private companyListSubscription: Subscription;
|
private companyListSubscription: Subscription;
|
||||||
|
private loginTrySubscription: Subscription;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private piService: PiService,
|
private piService: PiService,
|
||||||
|
@ -69,6 +72,8 @@ export class LoginSectionComponent implements OnInit, OnDestroy {
|
||||||
AppKey.LoginSession
|
AppKey.LoginSession
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.loginTry = this.sessionStorageService.get<LoginTry>(AppKey.LoginTry);
|
||||||
|
|
||||||
this.protocolService.disconnect();
|
this.protocolService.disconnect();
|
||||||
|
|
||||||
this.store.dispatch(
|
this.store.dispatch(
|
||||||
|
@ -82,12 +87,21 @@ export class LoginSectionComponent implements OnInit, OnDestroy {
|
||||||
.subscribe(companyList => {
|
.subscribe(companyList => {
|
||||||
this.companyList = companyList;
|
this.companyList = companyList;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.loginTrySubscription = this.sessionStorageService.changed$
|
||||||
|
.pipe(filter(param => AppKey.LoginTry === param.key))
|
||||||
|
.subscribe(param => {
|
||||||
|
this.loginTry = param.value as LoginTry;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
if (!!this.companyListSubscription) {
|
if (!!this.companyListSubscription) {
|
||||||
this.companyListSubscription.unsubscribe();
|
this.companyListSubscription.unsubscribe();
|
||||||
}
|
}
|
||||||
|
if (!!this.loginTrySubscription) {
|
||||||
|
this.loginTrySubscription.unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onLogin(event: {
|
onLogin(event: {
|
||||||
|
@ -113,9 +127,7 @@ export class LoginSectionComponent implements OnInit, OnDestroy {
|
||||||
.subscribe(
|
.subscribe(
|
||||||
res => {
|
res => {
|
||||||
if ('success' !== res.status.toLowerCase()) {
|
if ('success' !== res.status.toLowerCase()) {
|
||||||
this.store.dispatch(
|
this.onWebLoginFailure(event, res.status);
|
||||||
LoginActions.webLoginFailure({ error: res.status })
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
this.store.dispatch(
|
this.store.dispatch(
|
||||||
|
@ -132,7 +144,7 @@ export class LoginSectionComponent implements OnInit, OnDestroy {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error => {
|
error => {
|
||||||
this.store.dispatch(LoginActions.webLoginFailure({ error }));
|
this.onWebLoginFailure(event, error);
|
||||||
},
|
},
|
||||||
() => {
|
() => {
|
||||||
this.disableLoginForm = false;
|
this.disableLoginForm = false;
|
||||||
|
@ -144,4 +156,18 @@ export class LoginSectionComponent implements OnInit, OnDestroy {
|
||||||
onClickForgotPassword(lng: string) {
|
onClickForgotPassword(lng: string) {
|
||||||
this.i18nService.changeLanguage(lng);
|
this.i18nService.changeLanguage(lng);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private onWebLoginFailure(
|
||||||
|
event: {
|
||||||
|
companyCode: string;
|
||||||
|
loginId: string;
|
||||||
|
loginPw: string;
|
||||||
|
notValid: () => void;
|
||||||
|
},
|
||||||
|
error: any
|
||||||
|
) {
|
||||||
|
this.store.dispatch(LoginActions.webLoginFailure({ error }));
|
||||||
|
|
||||||
|
event.notValid();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ export class AppAuthenticationService {
|
||||||
const loginSession = this.sessionStorageService.get<LoginSession>(
|
const loginSession = this.sessionStorageService.get<LoginSession>(
|
||||||
AppKey.LoginSession
|
AppKey.LoginSession
|
||||||
);
|
);
|
||||||
return null !== loginSession && !!loginSession.loginId;
|
return !!loginSession && !!loginSession.loginId;
|
||||||
}
|
}
|
||||||
|
|
||||||
async login(
|
async login(
|
||||||
|
@ -41,7 +41,15 @@ export class AppAuthenticationService {
|
||||||
rememberMe: boolean,
|
rememberMe: boolean,
|
||||||
autoLogin: boolean
|
autoLogin: boolean
|
||||||
) {
|
) {
|
||||||
loginSession = { ...loginSession, localeCode: LocaleCode.Korean };
|
const prevLoginSession = this.sessionStorageService.get<LoginSession>(
|
||||||
|
AppKey.LoginSession
|
||||||
|
);
|
||||||
|
|
||||||
|
loginSession = {
|
||||||
|
...prevLoginSession,
|
||||||
|
...loginSession,
|
||||||
|
localeCode: LocaleCode.Korean
|
||||||
|
};
|
||||||
const encLoginPw = PasswordUtil.encrypt(loginSession.loginPw);
|
const encLoginPw = PasswordUtil.encrypt(loginSession.loginPw);
|
||||||
|
|
||||||
this.sessionStorageService.set<LoginSession>(AppKey.LoginSession, {
|
this.sessionStorageService.set<LoginSession>(AppKey.LoginSession, {
|
||||||
|
|
|
@ -4,8 +4,12 @@ import { DeviceType, DesktopType } from '@ucap/core';
|
||||||
import { NativeService, NativeType, OsType } from '@ucap/native';
|
import { NativeService, NativeType, OsType } from '@ucap/native';
|
||||||
|
|
||||||
import { I18nService } from '@ucap/ng-i18n';
|
import { I18nService } from '@ucap/ng-i18n';
|
||||||
|
import { LogService } from '@ucap/ng-logger';
|
||||||
import { UCAP_NATIVE_SERVICE } from '@ucap/ng-native';
|
import { UCAP_NATIVE_SERVICE } from '@ucap/ng-native';
|
||||||
import { SessionStorageService } from '@ucap/ng-web-storage';
|
import { SessionStorageService } from '@ucap/ng-web-storage';
|
||||||
|
import { DateService } from '@ucap/ng-ui';
|
||||||
|
import { TranslateService } from '@ucap/ng-ui-organization';
|
||||||
|
|
||||||
import { LoginSession } from '@app/models/login-session';
|
import { LoginSession } from '@app/models/login-session';
|
||||||
import { AppKey } from '@app/types/app-key.type';
|
import { AppKey } from '@app/types/app-key.type';
|
||||||
|
|
||||||
|
@ -14,6 +18,9 @@ export class AppService {
|
||||||
constructor(
|
constructor(
|
||||||
private sessionStorageService: SessionStorageService,
|
private sessionStorageService: SessionStorageService,
|
||||||
private i18nService: I18nService,
|
private i18nService: I18nService,
|
||||||
|
private translateService: TranslateService,
|
||||||
|
private dateService: DateService,
|
||||||
|
private logService: LogService,
|
||||||
@Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService
|
@Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
@ -53,6 +60,9 @@ export class AppService {
|
||||||
desktopType
|
desktopType
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.dateService.setDefaultTimezone('Asia/Seoul');
|
||||||
|
this.dateService.use('Asia/Seoul');
|
||||||
|
|
||||||
resolve();
|
resolve();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
reject(error);
|
reject(error);
|
||||||
|
@ -96,6 +106,8 @@ export class AppService {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
this.dateService.setLocale(this.i18nService.currentLng);
|
||||||
|
|
||||||
resolve();
|
resolve();
|
||||||
})
|
})
|
||||||
.catch(reason => {
|
.catch(reason => {
|
||||||
|
@ -103,6 +115,16 @@ export class AppService {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return Promise.all([initSession, initI18n]);
|
const initOrganization = new Promise<void>(async (resolve, reject) => {
|
||||||
|
try {
|
||||||
|
this.translateService.setDefaultLang('ko');
|
||||||
|
this.translateService.use('ko');
|
||||||
|
resolve();
|
||||||
|
} catch (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return Promise.all([initSession, initI18n, initOrganization]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +1,130 @@
|
||||||
import { map, exhaustMap } from 'rxjs/operators';
|
import { interval, timer } from 'rxjs';
|
||||||
|
import { map, exhaustMap, tap, takeUntil } from 'rxjs/operators';
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable, Inject } from '@angular/core';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
import { Actions, createEffect, ofType } from '@ngrx/effects';
|
import { Actions, createEffect, ofType } from '@ngrx/effects';
|
||||||
|
|
||||||
|
import { LoginTry } from '@ucap/pi';
|
||||||
|
|
||||||
import { LoginResponse } from '@ucap/protocol-authentication';
|
import { LoginResponse } from '@ucap/protocol-authentication';
|
||||||
|
import { NativeService } from '@ucap/native';
|
||||||
|
|
||||||
|
import { LogService } from '@ucap/ng-logger';
|
||||||
import { SessionStorageService } from '@ucap/ng-web-storage';
|
import { SessionStorageService } from '@ucap/ng-web-storage';
|
||||||
|
import { UCAP_NATIVE_SERVICE } from '@ucap/ng-native';
|
||||||
import { LoginActions } from '@ucap/ng-store-authentication';
|
import { LoginActions } from '@ucap/ng-store-authentication';
|
||||||
|
|
||||||
import { AppKey } from '@app/types/app-key.type';
|
import { AppKey } from '@app/types/app-key.type';
|
||||||
|
import { AppAuthenticationService } from '@app/services/app-authentication.service';
|
||||||
|
|
||||||
|
import { environment } from '@environments';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class Effects {
|
export class Effects {
|
||||||
|
readonly intervalForRetry =
|
||||||
|
environment.productConfig.authentication.intervalForRetry;
|
||||||
|
readonly maxTryCount = environment.productConfig.authentication.maxTryCount;
|
||||||
|
|
||||||
|
webLoginSuccess$ = createEffect(
|
||||||
|
() =>
|
||||||
|
this.actions$.pipe(
|
||||||
|
ofType(LoginActions.webLoginSuccess),
|
||||||
|
tap(params => {
|
||||||
|
this.nativeService.checkForUpdates(params.login2Response.version);
|
||||||
|
this.appAuthenticationService.login(
|
||||||
|
{
|
||||||
|
companyCode: params.companyCode,
|
||||||
|
loginId: params.loginId,
|
||||||
|
loginPw: params.loginPw
|
||||||
|
},
|
||||||
|
params.rememberMe,
|
||||||
|
params.autoLogin
|
||||||
|
);
|
||||||
|
this.router.navigate(['/']);
|
||||||
|
})
|
||||||
|
),
|
||||||
|
{ dispatch: false }
|
||||||
|
);
|
||||||
|
|
||||||
|
webLoginFailure$ = createEffect(
|
||||||
|
() =>
|
||||||
|
this.actions$.pipe(
|
||||||
|
ofType(LoginActions.webLoginFailure),
|
||||||
|
tap(params => {
|
||||||
|
let loginTry = this.sessionStorageService.get<LoginTry>(
|
||||||
|
AppKey.LoginTry
|
||||||
|
);
|
||||||
|
loginTry = loginTry || {
|
||||||
|
failCount: 0,
|
||||||
|
lastFailTime: null,
|
||||||
|
remainTimeForNextTry: null
|
||||||
|
};
|
||||||
|
|
||||||
|
if (null === loginTry.lastFailTime) {
|
||||||
|
loginTry = {
|
||||||
|
failCount: loginTry.failCount + 1,
|
||||||
|
lastFailTime: new Date().getTime(),
|
||||||
|
remainTimeForNextTry: null
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
const diff = Math.round(
|
||||||
|
(new Date().getTime() - loginTry.lastFailTime) / 1000
|
||||||
|
);
|
||||||
|
|
||||||
|
if (diff > this.intervalForRetry) {
|
||||||
|
loginTry = {
|
||||||
|
failCount: 1,
|
||||||
|
lastFailTime: new Date().getTime(),
|
||||||
|
remainTimeForNextTry: null
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
loginTry.failCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.maxTryCount <= loginTry.failCount) {
|
||||||
|
loginTry.remainTimeForNextTry = this.intervalForRetry;
|
||||||
|
|
||||||
|
const waitTimer$ = timer(1000 * this.intervalForRetry);
|
||||||
|
interval(1000)
|
||||||
|
.pipe(takeUntil(waitTimer$))
|
||||||
|
.subscribe(
|
||||||
|
v => {
|
||||||
|
loginTry.remainTimeForNextTry = this.intervalForRetry - v;
|
||||||
|
this.sessionStorageService.set<LoginTry>(
|
||||||
|
AppKey.LoginTry,
|
||||||
|
loginTry
|
||||||
|
);
|
||||||
|
},
|
||||||
|
error => {},
|
||||||
|
() => {
|
||||||
|
loginTry = {
|
||||||
|
failCount: 0,
|
||||||
|
lastFailTime: null,
|
||||||
|
remainTimeForNextTry: null
|
||||||
|
};
|
||||||
|
this.sessionStorageService.set<LoginTry>(
|
||||||
|
AppKey.LoginTry,
|
||||||
|
loginTry
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.sessionStorageService.set<LoginTry>(AppKey.LoginTry, loginTry);
|
||||||
|
})
|
||||||
|
),
|
||||||
|
{ dispatch: false }
|
||||||
|
);
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private actions$: Actions,
|
private actions$: Actions,
|
||||||
private sessionStorageService: SessionStorageService
|
private sessionStorageService: SessionStorageService,
|
||||||
|
@Inject(UCAP_NATIVE_SERVICE) private nativeService: NativeService,
|
||||||
|
private appAuthenticationService: AppAuthenticationService,
|
||||||
|
private router: Router,
|
||||||
|
private logService: LogService
|
||||||
) {}
|
) {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
export enum AppKey {
|
export enum AppKey {
|
||||||
|
LoginTry = 'ucap::LG::LOGIN_TRY',
|
||||||
LoginSession = 'ucap::LG::LOGIN_SESSION',
|
LoginSession = 'ucap::LG::LOGIN_SESSION',
|
||||||
LogoutSession = 'ucap::LG::LOGOUT_SESSION',
|
LogoutSession = 'ucap::LG::LOGOUT_SESSION',
|
||||||
UserStore = 'ucap::LG::USER_STORE',
|
UserStore = 'ucap::LG::USER_STORE',
|
||||||
|
|
|
@ -12,9 +12,11 @@
|
||||||
"loginPw": "Login Password"
|
"loginPw": "Login Password"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"requireCompany": "",
|
"requireCompany": "Company is required.",
|
||||||
"requireLoginId": "",
|
"requireLoginId": "ID is required.",
|
||||||
"requireLoginPw": ""
|
"requireLoginPw": "password is required.",
|
||||||
|
"failed": "Failed to login",
|
||||||
|
"attemptsExceeded": "Password error count exceeded."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,11 @@
|
||||||
"loginPw": "로그인 비밀번호"
|
"loginPw": "로그인 비밀번호"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"requireCompany": "",
|
"requireCompany": "회사를 입력해 주세요.",
|
||||||
"requireLoginId": "",
|
"requireLoginId": "아이디를 입력해 주세요.",
|
||||||
"requireLoginPw": ""
|
"requireLoginPw": "비밀번호를 입력해 주세요.",
|
||||||
|
"failed": "로그인에 실패하였습니다.",
|
||||||
|
"attemptsExceeded": "비밀번호 오류 횟수 초과입니다."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,9 @@ export const environment: Environment = {
|
||||||
authentication: {
|
authentication: {
|
||||||
usePrivateInformationAgree: false,
|
usePrivateInformationAgree: false,
|
||||||
useRememberMe: true,
|
useRememberMe: true,
|
||||||
useAutoLogin: true
|
useAutoLogin: true,
|
||||||
|
maxTryCount: 5,
|
||||||
|
intervalForRetry: 1 * 60
|
||||||
},
|
},
|
||||||
profile: {
|
profile: {
|
||||||
editableProfileImage: false
|
editableProfileImage: false
|
||||||
|
|
|
@ -64,7 +64,9 @@ export const environment: Environment = {
|
||||||
authentication: {
|
authentication: {
|
||||||
usePrivateInformationAgree: false,
|
usePrivateInformationAgree: false,
|
||||||
useRememberMe: true,
|
useRememberMe: true,
|
||||||
useAutoLogin: true
|
useAutoLogin: true,
|
||||||
|
maxTryCount: 5,
|
||||||
|
intervalForRetry: 1 * 60
|
||||||
},
|
},
|
||||||
profile: {
|
profile: {
|
||||||
editableProfileImage: false
|
editableProfileImage: false
|
||||||
|
|
|
@ -67,7 +67,9 @@ export const environment: Environment = {
|
||||||
authentication: {
|
authentication: {
|
||||||
usePrivateInformationAgree: false,
|
usePrivateInformationAgree: false,
|
||||||
useRememberMe: true,
|
useRememberMe: true,
|
||||||
useAutoLogin: true
|
useAutoLogin: true,
|
||||||
|
maxTryCount: 5,
|
||||||
|
intervalForRetry: 1 * 60
|
||||||
},
|
},
|
||||||
profile: {
|
profile: {
|
||||||
editableProfileImage: false
|
editableProfileImage: false
|
||||||
|
|
|
@ -61,6 +61,8 @@ export interface Environment {
|
||||||
usePrivateInformationAgree: boolean;
|
usePrivateInformationAgree: boolean;
|
||||||
useRememberMe: boolean;
|
useRememberMe: boolean;
|
||||||
useAutoLogin: boolean;
|
useAutoLogin: boolean;
|
||||||
|
maxTryCount: number;
|
||||||
|
intervalForRetry: number;
|
||||||
};
|
};
|
||||||
profile: {
|
profile: {
|
||||||
/** 내 프로필 이미지 수정 가능 여부 */
|
/** 내 프로필 이미지 수정 가능 여부 */
|
||||||
|
|
|
@ -5,16 +5,14 @@
|
||||||
"outDir": "./dist/out-tsc",
|
"outDir": "./dist/out-tsc",
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"declaration": false,
|
"declaration": false,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
"downlevelIteration": true,
|
"downlevelIteration": true,
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
"module": "esnext",
|
"module": "esnext",
|
||||||
"moduleResolution": "node",
|
"moduleResolution": "node",
|
||||||
"importHelpers": true,
|
"importHelpers": true,
|
||||||
"target": "es2015",
|
"target": "es2015",
|
||||||
"lib": [
|
"lib": ["es2018", "dom"],
|
||||||
"es2018",
|
|
||||||
"dom"
|
|
||||||
],
|
|
||||||
"types": ["node"],
|
"types": ["node"],
|
||||||
"paths": {
|
"paths": {
|
||||||
"@app/*": ["src/app/*"],
|
"@app/*": ["src/app/*"],
|
||||||
|
|
Loading…
Reference in New Issue
Block a user