Merge pull request #1422 from eikek/improve-item-selection

Improve item selection
This commit is contained in:
mergify[bot]
2022-02-27 22:34:16 +00:00
committed by GitHub
33 changed files with 1197 additions and 730 deletions

View File

@ -26,7 +26,8 @@ case class CookieData(auth: AuthToken) {
domain = None, domain = None,
path = Some(path.asString), path = Some(path.asString),
httpOnly = true, httpOnly = true,
secure = sec secure = sec,
sameSite = Some(SameSite.Strict)
) )
} }

View File

@ -24,7 +24,8 @@ case class RememberCookieData(token: RememberToken) {
path = Some(path.asString), path = Some(path.asString),
httpOnly = true, httpOnly = true,
secure = sec, secure = sec,
maxAge = Some(config.valid.seconds) maxAge = Some(config.valid.seconds),
sameSite = Some(SameSite.Strict)
) )
} }

View File

@ -26,7 +26,8 @@ final case class ShareCookieData(token: ShareToken) {
httpOnly = true, httpOnly = true,
secure = sec, secure = sec,
maxAge = None, maxAge = None,
expires = None expires = None,
sameSite = Some(SameSite.Strict)
) )
} }

View File

@ -425,57 +425,57 @@
"dev": true "dev": true
}, },
"cssnano": { "cssnano": {
"version": "5.0.16", "version": "5.0.17",
"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.16.tgz", "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.17.tgz",
"integrity": "sha512-ryhRI9/B9VFCwPbb1z60LLK5/ldoExi7nwdnJzpkLZkm2/r7j2X3jfY+ZvDVJhC/0fPZlrAguYdHNFg0iglPKQ==", "integrity": "sha512-fmjLP7k8kL18xSspeXTzRhaFtRI7DL9b8IcXR80JgtnWBpvAzHT7sCR/6qdn0tnxIaINUN6OEQu83wF57Gs3Xw==",
"dev": true, "dev": true,
"requires": { "requires": {
"cssnano-preset-default": "^5.1.11", "cssnano-preset-default": "^5.1.12",
"lilconfig": "^2.0.3", "lilconfig": "^2.0.3",
"yaml": "^1.10.2" "yaml": "^1.10.2"
} }
}, },
"cssnano-preset-default": { "cssnano-preset-default": {
"version": "5.1.11", "version": "5.1.12",
"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.11.tgz", "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.12.tgz",
"integrity": "sha512-ETet5hqHxmzQq2ynXMOQofKuLm7VOjMiOB7E2zdtm/hSeCKlD9fabzIUV4GoPcRyJRHi+4kGf0vsfGYbQ4nmPw==", "integrity": "sha512-rO/JZYyjW1QNkWBxMGV28DW7d98UDLaF759frhli58QFehZ+D/LSmwQ2z/ylBAe2hUlsIWTq6NYGfQPq65EF9w==",
"dev": true, "dev": true,
"requires": { "requires": {
"css-declaration-sorter": "^6.0.3", "css-declaration-sorter": "^6.0.3",
"cssnano-utils": "^3.0.1", "cssnano-utils": "^3.0.2",
"postcss-calc": "^8.2.0", "postcss-calc": "^8.2.0",
"postcss-colormin": "^5.2.4", "postcss-colormin": "^5.2.5",
"postcss-convert-values": "^5.0.3", "postcss-convert-values": "^5.0.4",
"postcss-discard-comments": "^5.0.2", "postcss-discard-comments": "^5.0.3",
"postcss-discard-duplicates": "^5.0.2", "postcss-discard-duplicates": "^5.0.3",
"postcss-discard-empty": "^5.0.2", "postcss-discard-empty": "^5.0.3",
"postcss-discard-overridden": "^5.0.3", "postcss-discard-overridden": "^5.0.4",
"postcss-merge-longhand": "^5.0.5", "postcss-merge-longhand": "^5.0.6",
"postcss-merge-rules": "^5.0.5", "postcss-merge-rules": "^5.0.6",
"postcss-minify-font-values": "^5.0.3", "postcss-minify-font-values": "^5.0.4",
"postcss-minify-gradients": "^5.0.5", "postcss-minify-gradients": "^5.0.6",
"postcss-minify-params": "^5.0.4", "postcss-minify-params": "^5.0.5",
"postcss-minify-selectors": "^5.1.2", "postcss-minify-selectors": "^5.1.3",
"postcss-normalize-charset": "^5.0.2", "postcss-normalize-charset": "^5.0.3",
"postcss-normalize-display-values": "^5.0.2", "postcss-normalize-display-values": "^5.0.3",
"postcss-normalize-positions": "^5.0.3", "postcss-normalize-positions": "^5.0.4",
"postcss-normalize-repeat-style": "^5.0.3", "postcss-normalize-repeat-style": "^5.0.4",
"postcss-normalize-string": "^5.0.3", "postcss-normalize-string": "^5.0.4",
"postcss-normalize-timing-functions": "^5.0.2", "postcss-normalize-timing-functions": "^5.0.3",
"postcss-normalize-unicode": "^5.0.3", "postcss-normalize-unicode": "^5.0.4",
"postcss-normalize-url": "^5.0.4", "postcss-normalize-url": "^5.0.5",
"postcss-normalize-whitespace": "^5.0.3", "postcss-normalize-whitespace": "^5.0.4",
"postcss-ordered-values": "^5.0.4", "postcss-ordered-values": "^5.0.5",
"postcss-reduce-initial": "^5.0.2", "postcss-reduce-initial": "^5.0.3",
"postcss-reduce-transforms": "^5.0.3", "postcss-reduce-transforms": "^5.0.4",
"postcss-svgo": "^5.0.3", "postcss-svgo": "^5.0.4",
"postcss-unique-selectors": "^5.0.3" "postcss-unique-selectors": "^5.0.4"
} }
}, },
"cssnano-utils": { "cssnano-utils": {
"version": "3.0.1", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.1.tgz", "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.2.tgz",
"integrity": "sha512-VNCHL364lh++/ono+S3j9NlUK+d97KNkxI77NlqZU2W3xd2/qmyN61dsa47pTpb55zuU4G4lI7qFjAXZJH1OAQ==", "integrity": "sha512-KhprijuQv2sP4kT92sSQwhlK3SJTbDIsxcfIEySB0O+3m9esFOai7dP9bMx5enHAh2MwarVIcnwiWoOm01RIbQ==",
"dev": true "dev": true
}, },
"csso": { "csso": {
@ -979,9 +979,9 @@
"dev": true "dev": true
}, },
"nanoid": { "nanoid": {
"version": "3.2.0", "version": "3.3.1",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
"dev": true "dev": true
}, },
"node-releases": { "node-releases": {
@ -1090,24 +1090,42 @@
"dev": true "dev": true
}, },
"postcss": { "postcss": {
"version": "8.4.6", "version": "8.4.7",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz",
"integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==",
"dev": true, "dev": true,
"requires": { "requires": {
"nanoid": "^3.2.0", "nanoid": "^3.3.1",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
"source-map-js": "^1.0.2" "source-map-js": "^1.0.2"
} }
}, },
"postcss-calc": { "postcss-calc": {
"version": "8.2.3", "version": "8.2.4",
"resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.3.tgz", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz",
"integrity": "sha512-EGM2EBBWqP57N0E7N7WOLT116PJ39dwHVU01WO4XPPQLJfkL2xVgkMZ+TZvCfapj/uJH07UEfKHQNPHzSw/14Q==", "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-selector-parser": "^6.0.2", "postcss-selector-parser": "^6.0.9",
"postcss-value-parser": "^4.0.2" "postcss-value-parser": "^4.2.0"
},
"dependencies": {
"postcss-selector-parser": {
"version": "6.0.9",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz",
"integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==",
"dev": true,
"requires": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
}
},
"postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
}
} }
}, },
"postcss-cli": { "postcss-cli": {
@ -1131,9 +1149,9 @@
} }
}, },
"postcss-colormin": { "postcss-colormin": {
"version": "5.2.4", "version": "5.2.5",
"resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.4.tgz", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.5.tgz",
"integrity": "sha512-rYlC5015aNqVQt/B6Cy156g7sH5tRUJGmT9xeagYthtKehetbKx7jHxhyLpulP4bs4vbp8u/B2rac0J7S7qPQg==", "integrity": "sha512-+X30aDaGYq81mFqwyPpnYInsZQnNpdxMX0ajlY7AExCexEFkPVV+KrO7kXwayqEWL2xwEbNQ4nUO0ZsRWGnevg==",
"dev": true, "dev": true,
"requires": { "requires": {
"browserslist": "^4.16.6", "browserslist": "^4.16.6",
@ -1151,9 +1169,9 @@
} }
}, },
"postcss-convert-values": { "postcss-convert-values": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.4.tgz",
"integrity": "sha512-fVkjHm2T0PSMqXUCIhHNWVGjhB9mHEWX2GboVs7j3iCgr6FpIl9c/IdXy0PHWZSQ9LFTRgmj98amxJE6KOnlsA==", "integrity": "sha512-bugzSAyjIexdObovsPZu/sBCTHccImJxLyFgeV0MmNBm/Lw5h5XnjfML6gzEmJ3A6nyfCW7hb1JXzcsA4Zfbdw==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -1168,27 +1186,27 @@
} }
}, },
"postcss-discard-comments": { "postcss-discard-comments": {
"version": "5.0.2", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.2.tgz", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.3.tgz",
"integrity": "sha512-6VQ3pYTsJHEsN2Bic88Aa7J/Brn4Bv8j/rqaFQZkH+pcVkKYwxCIvoMQkykEW7fBjmofdTnQgcivt5CCBJhtrg==", "integrity": "sha512-6W5BemziRoqIdAKT+1QjM4bNcJAQ7z7zk073730NHg4cUXh3/rQHHj7pmYxUB9aGhuRhBiUf0pXvIHkRwhQP0Q==",
"dev": true "dev": true
}, },
"postcss-discard-duplicates": { "postcss-discard-duplicates": {
"version": "5.0.2", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.2.tgz", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.3.tgz",
"integrity": "sha512-LKY81YjUjc78p6rbXIsnppsaFo8XzCoMZkXVILJU//sK0DgPkPSpuq/cZvHss3EtdKvWNYgWzQL+wiJFtEET4g==", "integrity": "sha512-vPtm1Mf+kp7iAENTG7jI1MN1lk+fBqL5y+qxyi4v3H+lzsXEdfS3dwUZD45KVhgzDEgduur8ycB4hMegyMTeRw==",
"dev": true "dev": true
}, },
"postcss-discard-empty": { "postcss-discard-empty": {
"version": "5.0.2", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.2.tgz", "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.3.tgz",
"integrity": "sha512-SxBsbTjlsKUvZLL+dMrdWauuNZU8TBq5IOL/DHa6jBUSXFEwmDqeXRfTIK/FQpPTa8MJMxEHjSV3UbiuyLARPQ==", "integrity": "sha512-xGJugpaXKakwKI7sSdZjUuN4V3zSzb2Y0LOlmTajFbNinEjTfVs9PFW2lmKBaC/E64WwYppfqLD03P8l9BuueA==",
"dev": true "dev": true
}, },
"postcss-discard-overridden": { "postcss-discard-overridden": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.4.tgz",
"integrity": "sha512-yRTXknIZA4k8Yo4FiF1xbsLj/VBxfXEWxJNIrtIy6HC9KQ4xJxcPtoaaskh6QptCGrrcGnhKsTsENTRPZOBu4g==", "integrity": "sha512-3j9QH0Qh1KkdxwiZOW82cId7zdwXVQv/gRXYDnwx5pBtR1sTkU4cXRK9lp5dSdiM0r0OICO/L8J6sV1/7m0kHg==",
"dev": true "dev": true
}, },
"postcss-import": { "postcss-import": {
@ -1223,13 +1241,13 @@
} }
}, },
"postcss-merge-longhand": { "postcss-merge-longhand": {
"version": "5.0.5", "version": "5.0.6",
"resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.5.tgz", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.6.tgz",
"integrity": "sha512-R2BCPJJ/U2oh1uTWEYn9CcJ7MMcQ1iIbj9wfr2s/zHu5om5MP/ewKdaunpfJqR1WYzqCsgnXuRoVXPAzxdqy8g==", "integrity": "sha512-rkmoPwQO6ymJSmWsX6l2hHeEBQa7C4kJb9jyi5fZB1sE8nSCv7sqchoYPixRwX/yvLoZP2y6FA5kcjiByeJqDg==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0", "postcss-value-parser": "^4.2.0",
"stylehacks": "^5.0.2" "stylehacks": "^5.0.3"
}, },
"dependencies": { "dependencies": {
"postcss-value-parser": { "postcss-value-parser": {
@ -1241,21 +1259,21 @@
} }
}, },
"postcss-merge-rules": { "postcss-merge-rules": {
"version": "5.0.5", "version": "5.0.6",
"resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.5.tgz", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.6.tgz",
"integrity": "sha512-3Oa26/Pb9VOFVksJjFG45SNoe4nhGvJ2Uc6TlRimqF8uhfOCEhVCaJ3rvEat5UFOn2UZqTY5Da8dFgCh3Iq0Ug==", "integrity": "sha512-nzJWJ9yXWp8AOEpn/HFAW72WKVGD2bsLiAmgw4hDchSij27bt6TF+sIK0cJUBAYT3SGcjtGGsOR89bwkkMuMgQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"browserslist": "^4.16.6", "browserslist": "^4.16.6",
"caniuse-api": "^3.0.0", "caniuse-api": "^3.0.0",
"cssnano-utils": "^3.0.1", "cssnano-utils": "^3.0.2",
"postcss-selector-parser": "^6.0.5" "postcss-selector-parser": "^6.0.5"
} }
}, },
"postcss-minify-font-values": { "postcss-minify-font-values": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.4.tgz",
"integrity": "sha512-bC45rVzEwsLhv/cL1eCjoo2OOjbSk9I7HKFBYnBvtyuIZlf7uMipMATXtA0Fc3jwPo3wuPIW1jRJWKzflMh1sA==", "integrity": "sha512-RN6q3tyuEesvyCYYFCRGJ41J1XFvgV+dvYGHr0CeHv8F00yILlN8Slf4t8XW4IghlfZYCeyRrANO6HpJ948ieA==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -1270,13 +1288,13 @@
} }
}, },
"postcss-minify-gradients": { "postcss-minify-gradients": {
"version": "5.0.5", "version": "5.0.6",
"resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.5.tgz", "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.6.tgz",
"integrity": "sha512-/YjvXs8PepsoiZAIpjstOO4IHKwFAqYNqbA1yVdqklM84tbUUneh6omJxGlRlF3mi6K5Pa067Mg6IwqEnYC8Zg==", "integrity": "sha512-E/dT6oVxB9nLGUTiY/rG5dX9taugv9cbLNTFad3dKxOO+BQg25Q/xo2z2ddG+ZB1CbkZYaVwx5blY8VC7R/43A==",
"dev": true, "dev": true,
"requires": { "requires": {
"colord": "^2.9.1", "colord": "^2.9.1",
"cssnano-utils": "^3.0.1", "cssnano-utils": "^3.0.2",
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
}, },
"dependencies": { "dependencies": {
@ -1289,13 +1307,13 @@
} }
}, },
"postcss-minify-params": { "postcss-minify-params": {
"version": "5.0.4", "version": "5.0.5",
"resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.4.tgz", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.5.tgz",
"integrity": "sha512-Z0vjod9lRZEmEPfEmA2sCfjbfEEFKefMD3RDIQSUfXK4LpCyWkX1CniUgyNvnjJFLDPSxtgKzozhHhPHKoeGkg==", "integrity": "sha512-YBNuq3Rz5LfLFNHb9wrvm6t859b8qIqfXsWeK7wROm3jSKNpO1Y5e8cOyBv6Acji15TgSrAwb3JkVNCqNyLvBg==",
"dev": true, "dev": true,
"requires": { "requires": {
"browserslist": "^4.16.6", "browserslist": "^4.16.6",
"cssnano-utils": "^3.0.1", "cssnano-utils": "^3.0.2",
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
}, },
"dependencies": { "dependencies": {
@ -1308,9 +1326,9 @@
} }
}, },
"postcss-minify-selectors": { "postcss-minify-selectors": {
"version": "5.1.2", "version": "5.1.3",
"resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.2.tgz", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.3.tgz",
"integrity": "sha512-gpn1nJDMCf3g32y/7kl+jsdamhiYT+/zmEt57RoT9GmzlixBNRPohI7k8UIHelLABhdLf3MSZhtM33xuH5eQOQ==", "integrity": "sha512-9RJfTiQEKA/kZhMaEXND893nBqmYQ8qYa/G+uPdVnXF6D/FzpfI6kwBtWEcHx5FqDbA79O9n6fQJfrIj6M8jvQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-selector-parser": "^6.0.5" "postcss-selector-parser": "^6.0.5"
@ -1326,15 +1344,15 @@
} }
}, },
"postcss-normalize-charset": { "postcss-normalize-charset": {
"version": "5.0.2", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.2.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.3.tgz",
"integrity": "sha512-fEMhYXzO8My+gC009qDc/3bgnFP8Fv1Ic8uw4ec4YTlhIOw63tGPk1YFd7fk9bZUf1DAbkhiL/QPWs9JLqdF2g==", "integrity": "sha512-iKEplDBco9EfH7sx4ut7R2r/dwTnUqyfACf62Unc9UiyFuI7uUqZZtY+u+qp7g8Qszl/U28HIfcsI3pEABWFfA==",
"dev": true "dev": true
}, },
"postcss-normalize-display-values": { "postcss-normalize-display-values": {
"version": "5.0.2", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.3.tgz",
"integrity": "sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw==", "integrity": "sha512-FIV5FY/qs4Ja32jiDb5mVj5iWBlS3N8tFcw2yg98+8MkRgyhtnBgSC0lxU+16AMHbjX5fbSJgw5AXLMolonuRQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -1349,9 +1367,9 @@
} }
}, },
"postcss-normalize-positions": { "postcss-normalize-positions": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.4.tgz",
"integrity": "sha512-U+rmhjrNBvIGYqr/1tD4wXPFFMKUbXsYXvlUCzLi0tOCUS6LoeEAnmVXXJY/MEB/1CKZZwBSs2tmzGawcygVBA==", "integrity": "sha512-qynirjBX0Lc73ROomZE3lzzmXXTu48/QiEzKgMeqh28+MfuHLsuqC9po4kj84igZqqFGovz8F8hf44hA3dPYmQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -1366,9 +1384,9 @@
} }
}, },
"postcss-normalize-repeat-style": { "postcss-normalize-repeat-style": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.4.tgz",
"integrity": "sha512-uk1+xYx0AMbA3nLSNhbDrqbf/rx+Iuq5tVad2VNyaxxJzx79oGieJ6D9F6AfOL2GtiIbP7vTYlpYHtG+ERFXTg==", "integrity": "sha512-Innt+wctD7YpfeDR7r5Ik6krdyppyAg2HBRpX88fo5AYzC1Ut/l3xaxACG0KsbX49cO2n5EB13clPwuYVt8cMA==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -1383,9 +1401,9 @@
} }
}, },
"postcss-normalize-string": { "postcss-normalize-string": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.4.tgz",
"integrity": "sha512-Mf2V4JbIDboNGQhW6xW0YREDiYXoX3WrD3EjKkjvnpAJ6W4qqjLnK/c9aioyVFaWWHVdP5zVRw/9DI5S3oLDFw==", "integrity": "sha512-Dfk42l0+A1CDnVpgE606ENvdmksttLynEqTQf5FL3XGQOyqxjbo25+pglCUvziicTxjtI2NLUR6KkxyUWEVubQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -1400,9 +1418,9 @@
} }
}, },
"postcss-normalize-timing-functions": { "postcss-normalize-timing-functions": {
"version": "5.0.2", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.3.tgz",
"integrity": "sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg==", "integrity": "sha512-QRfjvFh11moN4PYnJ7hia4uJXeFotyK3t2jjg8lM9mswleGsNw2Lm3I5wO+l4k1FzK96EFwEVn8X8Ojrp2gP4g==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -1417,9 +1435,9 @@
} }
}, },
"postcss-normalize-unicode": { "postcss-normalize-unicode": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.4.tgz",
"integrity": "sha512-uNC7BmS/7h6to2UWa4RFH8sOTzu2O9dVWPE/F9Vm9GdhONiD/c1kNaCLbmsFHlKWcEx7alNUChQ+jH/QAlqsQw==", "integrity": "sha512-W79Regn+a+eXTzB+oV/8XJ33s3pDyFTND2yDuUCo0Xa3QSy1HtNIfRVPXNubHxjhlqmMFADr3FSCHT84ITW3ig==",
"dev": true, "dev": true,
"requires": { "requires": {
"browserslist": "^4.16.6", "browserslist": "^4.16.6",
@ -1435,9 +1453,9 @@
} }
}, },
"postcss-normalize-url": { "postcss-normalize-url": {
"version": "5.0.4", "version": "5.0.5",
"resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.5.tgz",
"integrity": "sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg==", "integrity": "sha512-Ws3tX+PcekYlXh+ycAt0wyzqGthkvVtZ9SZLutMVvHARxcpu4o7vvXcNoiNKyjKuWecnjS6HDI3fjBuDr5MQxQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"normalize-url": "^6.0.1", "normalize-url": "^6.0.1",
@ -1453,9 +1471,9 @@
} }
}, },
"postcss-normalize-whitespace": { "postcss-normalize-whitespace": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.4.tgz",
"integrity": "sha512-333JWRnX655fSoUbufJ10HJop3c8mrpKkCCUnEmgz/Cb/QEtW+/TMZwDAUt4lnwqP6tCCk0x0b58jqvDgiQm/A==", "integrity": "sha512-wsnuHolYZjMwWZJoTC9jeI2AcjA67v4UuidDrPN9RnX8KIZfE+r2Nd6XZRwHVwUiHmRvKQtxiqo64K+h8/imaw==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -1470,12 +1488,12 @@
} }
}, },
"postcss-ordered-values": { "postcss-ordered-values": {
"version": "5.0.4", "version": "5.0.5",
"resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.4.tgz", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.5.tgz",
"integrity": "sha512-taKtGDZtyYUMVYkg+MuJeBUiTF6cGHZmo/qcW7ibvW79UlyKuSHbo6dpCIiqI+j9oJsXWzP+ovIxoyLDOeQFdw==", "integrity": "sha512-mfY7lXpq+8bDEHfP+muqibDPhZ5eP9zgBEF9XRvoQgXcQe2Db3G1wcvjbnfjXG6wYsl+0UIjikqq4ym1V2jGMQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"cssnano-utils": "^3.0.1", "cssnano-utils": "^3.0.2",
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
}, },
"dependencies": { "dependencies": {
@ -1603,9 +1621,9 @@
} }
}, },
"postcss-reduce-initial": { "postcss-reduce-initial": {
"version": "5.0.2", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz", "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.3.tgz",
"integrity": "sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==", "integrity": "sha512-c88TkSnQ/Dnwgb4OZbKPOBbCaauwEjbECP5uAuFPOzQ+XdjNjRH7SG0dteXrpp1LlIFEKK76iUGgmw2V0xeieA==",
"dev": true, "dev": true,
"requires": { "requires": {
"browserslist": "^4.16.6", "browserslist": "^4.16.6",
@ -1613,9 +1631,9 @@
} }
}, },
"postcss-reduce-transforms": { "postcss-reduce-transforms": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.4.tgz",
"integrity": "sha512-yDnTUab5i7auHiNwdcL1f+pBnqQFf+7eC4cbC7D8Lc1FkvNZhtpkdad+9U4wDdFb84haupMf0rA/Zc5LcTe/3A==", "integrity": "sha512-VIJB9SFSaL8B/B7AXb7KHL6/GNNbbCHslgdzS9UDfBZYIA2nx8NLY7iD/BXFSO/1sRUILzBTfHCoW5inP37C5g==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.2.0" "postcss-value-parser": "^4.2.0"
@ -1654,19 +1672,27 @@
} }
}, },
"postcss-svgo": { "postcss-svgo": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.4.tgz",
"integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", "integrity": "sha512-yDKHvULbnZtIrRqhZoA+rxreWpee28JSRH/gy9727u0UCgtpv1M/9WEWY3xySlFa0zQJcqf6oCBJPR5NwkmYpg==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-value-parser": "^4.1.0", "postcss-value-parser": "^4.2.0",
"svgo": "^2.7.0" "svgo": "^2.7.0"
},
"dependencies": {
"postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
}
} }
}, },
"postcss-unique-selectors": { "postcss-unique-selectors": {
"version": "5.0.3", "version": "5.0.4",
"resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.3.tgz", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.4.tgz",
"integrity": "sha512-V5tX2hadSSn+miVCluuK1IDGy+7jAXSOfRZ2DQ+s/4uQZb/orDYBjH0CHgFrXsRw78p4QTuEFA9kI6C956UnHQ==", "integrity": "sha512-5ampwoSDJCxDPoANBIlMgoBcYUHnhaiuLYJR5pj1DLnYQvMRVyFuTA5C3Bvt+aHtiqWpJkD/lXT50Vo1D0ZsAQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"postcss-selector-parser": "^6.0.5" "postcss-selector-parser": "^6.0.5"
@ -1796,9 +1822,9 @@
} }
}, },
"stylehacks": { "stylehacks": {
"version": "5.0.2", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.2.tgz", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.3.tgz",
"integrity": "sha512-114zeJdOpTrbQYRD4OU5UWJ99LKUaqCPJTU1HQ/n3q3BwmllFN8kHENaLnOeqVq6AhXrWfxHNZTl33iJ4oy3cQ==", "integrity": "sha512-ENcUdpf4yO0E1rubu8rkxI+JGQk4CgjchynZ4bDBJDfqdy+uhTRSWb8/F3Jtu+Bw5MW45Po3/aQGeIyyxgQtxg==",
"dev": true, "dev": true,
"requires": { "requires": {
"browserslist": "^4.16.6", "browserslist": "^4.16.6",
@ -1836,9 +1862,9 @@
} }
}, },
"tailwindcss": { "tailwindcss": {
"version": "3.0.18", "version": "3.0.23",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.18.tgz", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz",
"integrity": "sha512-ihPTpEyA5ANgZbwKlgrbfnzOp9R5vDHFWmqxB1PT8NwOGCOFVVMl+Ps1cQQ369acaqqf1BEF77roCwK0lvNmTw==", "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==",
"dev": true, "dev": true,
"requires": { "requires": {
"arg": "^5.0.1", "arg": "^5.0.1",
@ -1854,13 +1880,14 @@
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
"normalize-path": "^3.0.0", "normalize-path": "^3.0.0",
"object-hash": "^2.2.0", "object-hash": "^2.2.0",
"postcss": "^8.4.6",
"postcss-js": "^4.0.0", "postcss-js": "^4.0.0",
"postcss-load-config": "^3.1.0", "postcss-load-config": "^3.1.0",
"postcss-nested": "5.0.6", "postcss-nested": "5.0.6",
"postcss-selector-parser": "^6.0.9", "postcss-selector-parser": "^6.0.9",
"postcss-value-parser": "^4.2.0", "postcss-value-parser": "^4.2.0",
"quick-lru": "^5.1.1", "quick-lru": "^5.1.1",
"resolve": "^1.21.0" "resolve": "^1.22.0"
}, },
"dependencies": { "dependencies": {
"chokidar": { "chokidar": {

View File

@ -7,12 +7,12 @@
"@fortawesome/fontawesome-free": "^6.0.0", "@fortawesome/fontawesome-free": "^6.0.0",
"@tailwindcss/forms": "^0.4.0", "@tailwindcss/forms": "^0.4.0",
"autoprefixer": "^10.4.2", "autoprefixer": "^10.4.2",
"cssnano": "^5.0.16", "cssnano": "^5.0.17",
"flag-icon-css": "^3.5.0", "flag-icon-css": "^3.5.0",
"postcss": "^8.4.6", "postcss": "^8.4.7",
"postcss-cli": "^9.1.0", "postcss-cli": "^9.1.0",
"postcss-import": "^14.0.2", "postcss-import": "^14.0.2",
"postcss-purgecss": "^2.0.3", "postcss-purgecss": "^2.0.3",
"tailwindcss": "^3.0.18" "tailwindcss": "^3.0.23"
} }
} }

View File

@ -1727,42 +1727,42 @@ mergeItems flags items receive =
reprocessMultiple : reprocessMultiple :
Flags Flags
-> Set String -> List String
-> (Result Http.Error BasicResult -> msg) -> (Result Http.Error BasicResult -> msg)
-> Cmd msg -> Cmd msg
reprocessMultiple flags items receive = reprocessMultiple flags items receive =
Http2.authPost Http2.authPost
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/reprocess" { url = flags.config.baseUrl ++ "/api/v1/sec/items/reprocess"
, account = getAccount flags , account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (Set.toList items |> IdList)) , body = Http.jsonBody (Api.Model.IdList.encode (IdList items))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder , expect = Http.expectJson receive Api.Model.BasicResult.decoder
} }
confirmMultiple : confirmMultiple :
Flags Flags
-> Set String -> List String
-> (Result Http.Error BasicResult -> msg) -> (Result Http.Error BasicResult -> msg)
-> Cmd msg -> Cmd msg
confirmMultiple flags ids receive = confirmMultiple flags ids receive =
Http2.authPut Http2.authPut
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/confirm" { url = flags.config.baseUrl ++ "/api/v1/sec/items/confirm"
, account = getAccount flags , account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids))) , body = Http.jsonBody (Api.Model.IdList.encode (IdList ids))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder , expect = Http.expectJson receive Api.Model.BasicResult.decoder
} }
unconfirmMultiple : unconfirmMultiple :
Flags Flags
-> Set String -> List String
-> (Result Http.Error BasicResult -> msg) -> (Result Http.Error BasicResult -> msg)
-> Cmd msg -> Cmd msg
unconfirmMultiple flags ids receive = unconfirmMultiple flags ids receive =
Http2.authPut Http2.authPut
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/unconfirm" { url = flags.config.baseUrl ++ "/api/v1/sec/items/unconfirm"
, account = getAccount flags , account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids))) , body = Http.jsonBody (Api.Model.IdList.encode (IdList ids))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder , expect = Http.expectJson receive Api.Model.BasicResult.decoder
} }
@ -1937,28 +1937,28 @@ setConcEquipmentMultiple flags data receive =
deleteAllItems : deleteAllItems :
Flags Flags
-> Set String -> List String
-> (Result Http.Error BasicResult -> msg) -> (Result Http.Error BasicResult -> msg)
-> Cmd msg -> Cmd msg
deleteAllItems flags ids receive = deleteAllItems flags ids receive =
Http2.authPost Http2.authPost
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/deleteAll" { url = flags.config.baseUrl ++ "/api/v1/sec/items/deleteAll"
, account = getAccount flags , account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids))) , body = Http.jsonBody (Api.Model.IdList.encode (IdList ids))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder , expect = Http.expectJson receive Api.Model.BasicResult.decoder
} }
restoreAllItems : restoreAllItems :
Flags Flags
-> Set String -> List String
-> (Result Http.Error BasicResult -> msg) -> (Result Http.Error BasicResult -> msg)
-> Cmd msg -> Cmd msg
restoreAllItems flags ids receive = restoreAllItems flags ids receive =
Http2.authPost Http2.authPost
{ url = flags.config.baseUrl ++ "/api/v1/sec/items/restoreAll" { url = flags.config.baseUrl ++ "/api/v1/sec/items/restoreAll"
, account = getAccount flags , account = getAccount flags
, body = Http.jsonBody (Api.Model.IdList.encode (IdList (Set.toList ids))) , body = Http.jsonBody (Api.Model.IdList.encode (IdList ids))
, expect = Http.expectJson receive Api.Model.BasicResult.decoder , expect = Http.expectJson receive Api.Model.BasicResult.decoder
} }

View File

@ -19,6 +19,7 @@ import Api.Model.VersionInfo exposing (VersionInfo)
import Browser exposing (UrlRequest) import Browser exposing (UrlRequest)
import Browser.Navigation exposing (Key) import Browser.Navigation exposing (Key)
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemIds exposing (ItemIds)
import Data.ServerEvent exposing (ServerEvent) import Data.ServerEvent exposing (ServerEvent)
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
import Data.UiTheme exposing (UiTheme) import Data.UiTheme exposing (UiTheme)
@ -69,6 +70,7 @@ type alias Model =
, langMenuOpen : Bool , langMenuOpen : Bool
, showNewItemsArrived : Bool , showNewItemsArrived : Bool
, jobsWaiting : Int , jobsWaiting : Int
, selectedItems : ItemIds
} }
@ -133,6 +135,7 @@ init key url flags_ settings =
, langMenuOpen = False , langMenuOpen = False
, showNewItemsArrived = False , showNewItemsArrived = False
, jobsWaiting = 0 , jobsWaiting = 0
, selectedItems = Data.ItemIds.empty
} }
, Cmd.batch , Cmd.batch
[ Cmd.map DashboardMsg dbc [ Cmd.map DashboardMsg dbc

View File

@ -15,7 +15,9 @@ import App.Data exposing (..)
import Browser exposing (UrlRequest(..)) import Browser exposing (UrlRequest(..))
import Browser.Navigation as Nav import Browser.Navigation as Nav
import Data.AppEvent exposing (AppEvent(..)) import Data.AppEvent exposing (AppEvent(..))
import Data.Environment as Env
import Data.Flags import Data.Flags
import Data.ItemIds exposing (ItemIds)
import Data.ServerEvent exposing (ServerEvent(..)) import Data.ServerEvent exposing (ServerEvent(..))
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
import Data.UiTheme import Data.UiTheme
@ -346,6 +348,15 @@ updateWithSub msg model =
) )
modelEnv : Model -> Env.Update
modelEnv model =
{ key = model.key
, selectedItems = model.selectedItems
, flags = model.flags
, settings = model.uiSettings
}
applyClientSettings : Messages -> Model -> UiSettings -> ( Model, Cmd Msg, Sub Msg ) applyClientSettings : Messages -> Model -> UiSettings -> ( Model, Cmd Msg, Sub Msg )
applyClientSettings texts model settings = applyClientSettings texts model settings =
let let
@ -368,6 +379,18 @@ applyClientSettings texts model settings =
{ model | uiSettings = settings } { model | uiSettings = settings }
applySelectionChange : Messages -> Model -> ItemIds -> ( Model, Cmd Msg, Sub Msg )
applySelectionChange texts model newSelection =
if model.selectedItems == newSelection then
( { model | selectedItems = newSelection }, Cmd.none, Sub.none )
else
Util.Update.andThen2
[ updateSearch texts Page.Search.Data.ItemSelectionChanged
]
{ model | selectedItems = newSelection }
updateDashboard : Messages -> Page.Dashboard.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg ) updateDashboard : Messages -> Page.Dashboard.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateDashboard texts lmsg model = updateDashboard texts lmsg model =
let let
@ -427,17 +450,16 @@ updateItemDetail texts lmsg model =
result = result =
Page.ItemDetail.Update.update Page.ItemDetail.Update.update
model.key
model.flags
inav inav
model.uiSettings (modelEnv model)
lmsg lmsg
model.itemDetailModel model.itemDetailModel
model_ = ( model_, cmd_, sub_ ) =
{ model applySelectionChange
| itemDetailModel = result.model texts
} { model | itemDetailModel = result.model }
result.selectedItems
( hm, hc, hs ) = ( hm, hc, hs ) =
updateSearch texts (Page.Search.Data.SetLinkTarget result.linkTarget) model_ updateSearch texts (Page.Search.Data.SetLinkTarget result.linkTarget) model_
@ -451,8 +473,8 @@ updateItemDetail texts lmsg model =
( hm, hc, hs ) ( hm, hc, hs )
in in
( hm1 ( hm1
, Cmd.batch [ Cmd.map ItemDetailMsg result.cmd, hc, hc1 ] , Cmd.batch [ Cmd.map ItemDetailMsg result.cmd, hc, hc1, cmd_ ]
, Sub.batch [ Sub.map ItemDetailMsg result.sub, hs, hs1 ] , Sub.batch [ Sub.map ItemDetailMsg result.sub, hs, hs1, sub_ ]
) )
@ -576,7 +598,7 @@ updateLogin lmsg model =
updateSearch : Messages -> Page.Search.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg ) updateSearch : Messages -> Page.Search.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
updateSearch texts lmsg model = updateSearch texts lmsg model =
let let
( mid, bmId ) = ( lastViewItemId, bookmarkId ) =
case model.page of case model.page of
SearchPage bId -> SearchPage bId ->
( Util.Maybe.fromString model.itemDetailModel.detail.item.id, bId ) ( Util.Maybe.fromString model.itemDetailModel.detail.item.id, bId )
@ -584,11 +606,11 @@ updateSearch texts lmsg model =
_ -> _ ->
( Nothing, Nothing ) ( Nothing, Nothing )
result = env =
Page.Search.Update.update bmId mid model.key model.flags texts.search model.uiSettings lmsg model.searchModel modelEnv model
model_ = result =
{ model | searchModel = result.model } Page.Search.Update.update texts.search bookmarkId lastViewItemId env lmsg model.searchModel
lc = lc =
case result.appEvent of case result.appEvent of
@ -597,15 +619,13 @@ updateSearch texts lmsg model =
AppNothing -> AppNothing ->
Cmd.none Cmd.none
( model_, cmd_, sub_ ) =
applySelectionChange texts { model | searchModel = result.model } result.selectedItems
in in
( model_ ( model_
, Cmd.batch , Cmd.batch [ Cmd.map SearchMsg result.cmd, lc, cmd_ ]
[ Cmd.map SearchMsg result.cmd , Sub.batch [ Sub.map SearchMsg result.sub, sub_ ]
, lc
]
, Sub.batch
[ Sub.map SearchMsg result.sub
]
) )

View File

@ -10,6 +10,7 @@ module App.View2 exposing (view)
import Api.Model.AuthResult exposing (AuthResult) import Api.Model.AuthResult exposing (AuthResult)
import App.Data exposing (..) import App.Data exposing (..)
import Comp.Basic as B import Comp.Basic as B
import Data.Environment as Env
import Data.Flags import Data.Flags
import Data.Icons as Icons import Data.Icons as Icons
import Data.UiSettings import Data.UiSettings
@ -485,6 +486,15 @@ dropdownMenu =
" absolute right-0 bg-white dark:bg-slate-800 border dark:border-slate-700 dark:text-slate-300 shadow-lg opacity-1 transition duration-200 min-w-max " " absolute right-0 bg-white dark:bg-slate-800 border dark:border-slate-700 dark:text-slate-300 shadow-lg opacity-1 transition duration-200 min-w-max "
modelEnv : Model -> Env.View
modelEnv model =
{ sidebarVisible = model.sidebarVisible
, flags = model.flags
, settings = model.uiSettings
, selectedItems = model.selectedItems
}
viewDashboard : Messages -> Model -> List (Html Msg) viewDashboard : Messages -> Model -> List (Html Msg)
viewDashboard texts model = viewDashboard texts model =
[ Html.map DashboardMsg [ Html.map DashboardMsg
@ -549,17 +559,18 @@ viewShareDetail texts shareId itemId model =
viewSearch : Messages -> Maybe String -> Model -> List (Html Msg) viewSearch : Messages -> Maybe String -> Model -> List (Html Msg)
viewSearch texts bmId model = viewSearch texts bmId model =
let
env =
modelEnv model
in
[ Html.map SearchMsg [ Html.map SearchMsg
(Search.viewSidebar texts.search (Search.viewSidebar texts.search
model.sidebarVisible env
model.flags
model.uiSettings
model.searchModel model.searchModel
) )
, Html.map SearchMsg , Html.map SearchMsg
(Search.viewContent texts.search (Search.viewContent texts.search
model.flags env
model.uiSettings
model.searchModel model.searchModel
) )
] ]
@ -685,19 +696,19 @@ viewItemDetail texts id model =
let let
inav = inav =
Page.Search.Data.itemNav id model.searchModel Page.Search.Data.itemNav id model.searchModel
env =
modelEnv model
in in
[ Html.map ItemDetailMsg [ Html.map ItemDetailMsg
(ItemDetail.viewSidebar texts.itemDetail (ItemDetail.viewSidebar texts.itemDetail
model.sidebarVisible env
model.flags
model.uiSettings
model.itemDetailModel model.itemDetailModel
) )
, Html.map ItemDetailMsg , Html.map ItemDetailMsg
(ItemDetail.viewContent texts.itemDetail (ItemDetail.viewContent texts.itemDetail
inav inav
model.flags env
model.uiSettings
model.itemDetailModel model.itemDetailModel
) )
] ]

View File

@ -24,6 +24,7 @@ import Data.Fields
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.Icons as Icons import Data.Icons as Icons
import Data.ItemArrange exposing (ItemArrange) import Data.ItemArrange exposing (ItemArrange)
import Data.ItemIds exposing (ItemIdChange, ItemIds)
import Data.ItemSelection exposing (ItemSelection) import Data.ItemSelection exposing (ItemSelection)
import Data.ItemTemplate as IT import Data.ItemTemplate as IT
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
@ -49,7 +50,7 @@ type alias Model =
type Msg type Msg
= CyclePreview ItemLight = CyclePreview ItemLight
| ToggleSelectItem (Set String) String | ToggleSelectItem ItemIds String
| ItemDDMsg DD.Msg | ItemDDMsg DD.Msg
| SetLinkTarget LinkTarget | SetLinkTarget LinkTarget
| ToggleRowOpen String | ToggleRowOpen String
@ -70,7 +71,7 @@ type alias ViewConfig =
type alias UpdateResult = type alias UpdateResult =
{ model : Model { model : Model
, dragModel : DD.Model , dragModel : DD.Model
, selection : ItemSelection , selection : ItemIdChange
, linkTarget : LinkTarget , linkTarget : LinkTarget
, toggleRow : Maybe String , toggleRow : Maybe String
} }
@ -117,25 +118,21 @@ update : DD.Model -> Msg -> Model -> UpdateResult
update ddm msg model = update ddm msg model =
case msg of case msg of
ToggleRowOpen id -> ToggleRowOpen id ->
UpdateResult model ddm Data.ItemSelection.Inactive LinkNone (Just id) UpdateResult model ddm Data.ItemIds.noChange LinkNone (Just id)
ItemDDMsg lm -> ItemDDMsg lm ->
let let
ddd = ddd =
DD.update lm ddm DD.update lm ddm
in in
UpdateResult model ddd.model Data.ItemSelection.Inactive LinkNone Nothing UpdateResult model ddd.model Data.ItemIds.noChange LinkNone Nothing
ToggleSelectItem ids id -> ToggleSelectItem ids id ->
let let
newSet = newSet =
if Set.member id ids then Data.ItemIds.toggle ids id
Set.remove id ids
else
Set.insert id ids
in in
UpdateResult model ddm (Data.ItemSelection.Active newSet) LinkNone Nothing UpdateResult model ddm newSet LinkNone Nothing
CyclePreview item -> CyclePreview item ->
let let
@ -147,12 +144,12 @@ update ddm msg model =
in in
UpdateResult { model | previewAttach = next } UpdateResult { model | previewAttach = next }
ddm ddm
Data.ItemSelection.Inactive Data.ItemIds.noChange
LinkNone LinkNone
Nothing Nothing
SetLinkTarget target -> SetLinkTarget target ->
UpdateResult model ddm Data.ItemSelection.Inactive target Nothing UpdateResult model ddm Data.ItemIds.noChange target Nothing
@ -532,7 +529,7 @@ viewCard texts cfg settings flags model item =
mkCardAction : Texts -> ViewConfig -> UiSettings -> ItemLight -> List (Attribute Msg) mkCardAction : Texts -> ViewConfig -> UiSettings -> ItemLight -> List (Attribute Msg)
mkCardAction texts cfg settings item = mkCardAction texts cfg _ item =
case cfg.selection of case cfg.selection of
Data.ItemSelection.Inactive -> Data.ItemSelection.Inactive ->
case cfg.arrange of case cfg.arrange of
@ -977,7 +974,7 @@ isSelected : ViewConfig -> String -> Bool
isSelected cfg id = isSelected cfg id =
case cfg.selection of case cfg.selection of
Data.ItemSelection.Active ids -> Data.ItemSelection.Active ids ->
Set.member id ids Data.ItemIds.isMember ids id
Data.ItemSelection.Inactive -> Data.ItemSelection.Inactive ->
False False

View File

@ -25,6 +25,7 @@ import Comp.ItemCard
import Comp.LinkTarget exposing (LinkTarget) import Comp.LinkTarget exposing (LinkTarget)
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemArrange exposing (ItemArrange) import Data.ItemArrange exposing (ItemArrange)
import Data.ItemIds exposing (ItemIdChange)
import Data.ItemSelection exposing (ItemSelection) import Data.ItemSelection exposing (ItemSelection)
import Data.Items import Data.Items
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
@ -83,7 +84,7 @@ type alias UpdateResult =
{ model : Model { model : Model
, cmd : Cmd Msg , cmd : Cmd Msg
, dragModel : DD.Model , dragModel : DD.Model
, selection : ItemSelection , selection : ItemIdChange
, linkTarget : LinkTarget , linkTarget : LinkTarget
, toggleOpenRow : Maybe String , toggleOpenRow : Maybe String
} }
@ -105,7 +106,7 @@ updateDrag dm _ msg model =
UpdateResult newModel UpdateResult newModel
Cmd.none Cmd.none
dm dm
Data.ItemSelection.Inactive Data.ItemIds.noChange
Comp.LinkTarget.LinkNone Comp.LinkTarget.LinkNone
Nothing Nothing
@ -114,7 +115,7 @@ updateDrag dm _ msg model =
UpdateResult model UpdateResult model
Cmd.none Cmd.none
dm dm
Data.ItemSelection.Inactive Data.ItemIds.noChange
Comp.LinkTarget.LinkNone Comp.LinkTarget.LinkNone
Nothing Nothing
@ -126,7 +127,7 @@ updateDrag dm _ msg model =
UpdateResult newModel UpdateResult newModel
Cmd.none Cmd.none
dm dm
Data.ItemSelection.Inactive Data.ItemIds.noChange
Comp.LinkTarget.LinkNone Comp.LinkTarget.LinkNone
Nothing Nothing
@ -153,7 +154,7 @@ updateDrag dm _ msg model =
UpdateResult { model | results = removeItemById id model.results } UpdateResult { model | results = removeItemById id model.results }
Cmd.none Cmd.none
dm dm
Data.ItemSelection.Inactive Data.ItemIds.noChange
Comp.LinkTarget.LinkNone Comp.LinkTarget.LinkNone
Nothing Nothing

View File

@ -12,10 +12,10 @@ module Comp.ItemDetail exposing
, view2 , view2
) )
import Browser.Navigation as Nav
import Comp.ItemDetail.Model exposing (Msg(..), UpdateResult) import Comp.ItemDetail.Model exposing (Msg(..), UpdateResult)
import Comp.ItemDetail.Update import Comp.ItemDetail.Update
import Comp.ItemDetail.View2 import Comp.ItemDetail.View2
import Data.Environment as Env
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemNav exposing (ItemNav) import Data.ItemNav exposing (ItemNav)
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
@ -33,11 +33,11 @@ emptyModel =
Comp.ItemDetail.Model.emptyModel Comp.ItemDetail.Model.emptyModel
update : Nav.Key -> Flags -> ItemNav -> UiSettings -> Msg -> Model -> UpdateResult update : ItemNav -> Env.Update -> Msg -> Model -> UpdateResult
update = update =
Comp.ItemDetail.Update.update Comp.ItemDetail.Update.update
view2 : Texts -> Flags -> ItemNav -> UiSettings -> Model -> Html Msg view2 : Texts -> ItemNav -> Env.View -> Model -> Html Msg
view2 = view2 =
Comp.ItemDetail.View2.view Comp.ItemDetail.View2.view

View File

@ -24,8 +24,8 @@ import Api.Model.ItemsAndRefs exposing (ItemsAndRefs)
import Api.Model.ReferenceList exposing (ReferenceList) import Api.Model.ReferenceList exposing (ReferenceList)
import Data.Direction exposing (Direction) import Data.Direction exposing (Direction)
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemIds exposing (ItemIds)
import Http import Http
import Set exposing (Set)
type FormChange type FormChange
@ -49,14 +49,14 @@ type FormChange
multiUpdate : multiUpdate :
Flags Flags
-> Set String -> ItemIds
-> FormChange -> FormChange
-> (Result Http.Error BasicResult -> msg) -> (Result Http.Error BasicResult -> msg)
-> Cmd msg -> Cmd msg
multiUpdate flags ids change receive = multiUpdate flags ids change receive =
let let
items = items =
Set.toList ids Data.ItemIds.toList ids
in in
case change of case change of
CustomValueChange field value -> CustomValueChange field value ->
@ -159,10 +159,10 @@ multiUpdate flags ids change receive =
ConfirmChange flag -> ConfirmChange flag ->
if flag then if flag then
Api.confirmMultiple flags ids receive Api.confirmMultiple flags items receive
else else
Api.unconfirmMultiple flags ids receive Api.unconfirmMultiple flags items receive
NoFormChange -> NoFormChange ->
Cmd.none Cmd.none

View File

@ -57,6 +57,7 @@ import Comp.SimpleTextInput
import Comp.TagDropdown import Comp.TagDropdown
import Data.Direction exposing (Direction) import Data.Direction exposing (Direction)
import Data.Fields exposing (Field) import Data.Fields exposing (Field)
import Data.ItemIds exposing (ItemIdChange)
import DatePicker exposing (DatePicker) import DatePicker exposing (DatePicker)
import Dict exposing (Dict) import Dict exposing (Dict)
import File exposing (File) import File exposing (File)
@ -367,6 +368,7 @@ type Msg
| ToggleShowQrAttach String | ToggleShowQrAttach String
| PrintElement String | PrintElement String
| SetNameMsg Comp.SimpleTextInput.Msg | SetNameMsg Comp.SimpleTextInput.Msg
| ToggleSelectItem
type SaveNameState type SaveNameState
@ -381,22 +383,23 @@ type alias UpdateResult =
, sub : Sub Msg , sub : Sub Msg
, linkTarget : LinkTarget , linkTarget : LinkTarget
, removedItem : Maybe String , removedItem : Maybe String
, selectionChange : ItemIdChange
} }
resultModel : Model -> UpdateResult resultModel : Model -> UpdateResult
resultModel model = resultModel model =
UpdateResult model Cmd.none Sub.none Comp.LinkTarget.LinkNone Nothing UpdateResult model Cmd.none Sub.none Comp.LinkTarget.LinkNone Nothing Data.ItemIds.noChange
resultModelCmd : ( Model, Cmd Msg ) -> UpdateResult resultModelCmd : ( Model, Cmd Msg ) -> UpdateResult
resultModelCmd ( model, cmd ) = resultModelCmd ( model, cmd ) =
UpdateResult model cmd Sub.none Comp.LinkTarget.LinkNone Nothing UpdateResult model cmd Sub.none Comp.LinkTarget.LinkNone Nothing Data.ItemIds.noChange
resultModelCmdSub : ( Model, Cmd Msg, Sub Msg ) -> UpdateResult resultModelCmdSub : ( Model, Cmd Msg, Sub Msg ) -> UpdateResult
resultModelCmdSub ( model, cmd, sub ) = resultModelCmdSub ( model, cmd, sub ) =
UpdateResult model cmd sub Comp.LinkTarget.LinkNone Nothing UpdateResult model cmd sub Comp.LinkTarget.LinkNone Nothing Data.ItemIds.noChange
personMatchesOrg : Model -> Bool personMatchesOrg : Model -> Bool

View File

@ -20,7 +20,6 @@ import Api.Model.OptionalDate exposing (OptionalDate)
import Api.Model.OptionalId exposing (OptionalId) import Api.Model.OptionalId exposing (OptionalId)
import Api.Model.OptionalText exposing (OptionalText) import Api.Model.OptionalText exposing (OptionalText)
import Api.Model.StringList exposing (StringList) import Api.Model.StringList exposing (StringList)
import Browser.Navigation as Nav
import Comp.AttachmentMeta import Comp.AttachmentMeta
import Comp.CustomFieldMultiInput import Comp.CustomFieldMultiInput
import Comp.DatePicker import Comp.DatePicker
@ -58,10 +57,12 @@ import Comp.SimpleTextInput
import Comp.TagDropdown import Comp.TagDropdown
import Data.CustomFieldChange exposing (CustomFieldChange(..)) import Data.CustomFieldChange exposing (CustomFieldChange(..))
import Data.Direction import Data.Direction
import Data.Environment as Env
import Data.EquipmentOrder import Data.EquipmentOrder
import Data.Fields exposing (Field) import Data.Fields exposing (Field)
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.FolderOrder import Data.FolderOrder
import Data.ItemIds
import Data.ItemNav exposing (ItemNav) import Data.ItemNav exposing (ItemNav)
import Data.PersonOrder import Data.PersonOrder
import Data.PersonUse import Data.PersonUse
@ -74,7 +75,6 @@ import Http
import Page exposing (Page(..)) import Page exposing (Page(..))
import Ports import Ports
import Set exposing (Set) import Set exposing (Set)
import Time
import Util.File exposing (makeFileId) import Util.File exposing (makeFileId)
import Util.List import Util.List
import Util.Maybe import Util.Maybe
@ -82,8 +82,8 @@ import Util.String
import Util.Tag import Util.Tag
update : Nav.Key -> Flags -> ItemNav -> UiSettings -> Msg -> Model -> UpdateResult update : ItemNav -> Env.Update -> Msg -> Model -> UpdateResult
update key flags inav settings msg model = update inav env msg model =
case msg of case msg of
Init -> Init ->
let let
@ -91,10 +91,10 @@ update key flags inav settings msg model =
Comp.DatePicker.init Comp.DatePicker.init
( im, ic ) = ( im, ic ) =
Comp.ItemMail.init flags Comp.ItemMail.init env.flags
( cm, cc ) = ( cm, cc ) =
Comp.CustomFieldMultiInput.init flags Comp.CustomFieldMultiInput.init env.flags
in in
resultModelCmd resultModelCmd
( { model ( { model
@ -106,30 +106,26 @@ update key flags inav settings msg model =
, customFieldsModel = cm , customFieldsModel = cm
} }
, Cmd.batch , Cmd.batch
[ getOptions flags [ getOptions env.flags
, Cmd.map ItemDatePickerMsg dpc , Cmd.map ItemDatePickerMsg dpc
, Cmd.map DueDatePickerMsg dpc , Cmd.map DueDatePickerMsg dpc
, Cmd.map ItemMailMsg ic , Cmd.map ItemMailMsg ic
, Cmd.map CustomFieldMsg cc , Cmd.map CustomFieldMsg cc
, Api.getSentMails flags model.item.id SentMailsResp , Api.getSentMails env.flags model.item.id SentMailsResp
] ]
) )
SetItem item -> SetItem item ->
let let
res1 = res1 =
update key update inav
flags env
inav
settings
(TagDropdownMsg (Comp.TagDropdown.setSelected item.tags)) (TagDropdownMsg (Comp.TagDropdown.setSelected item.tags))
model model
res2 = res2 =
update key update inav
flags env
inav
settings
(DirDropdownMsg (DirDropdownMsg
(Comp.Dropdown.SetSelection (Comp.Dropdown.SetSelection
(Data.Direction.fromString item.direction (Data.Direction.fromString item.direction
@ -141,10 +137,8 @@ update key flags inav settings msg model =
res1.model res1.model
res3 = res3 =
update key update inav
flags env
inav
settings
(OrgDropdownMsg (OrgDropdownMsg
(Comp.Dropdown.SetSelection (Comp.Dropdown.SetSelection
(item.corrOrg (item.corrOrg
@ -156,10 +150,8 @@ update key flags inav settings msg model =
res2.model res2.model
res4 = res4 =
update key update inav
flags env
inav
settings
(CorrPersonMsg (CorrPersonMsg
(Comp.Dropdown.SetSelection (Comp.Dropdown.SetSelection
(item.corrPerson (item.corrPerson
@ -171,10 +163,8 @@ update key flags inav settings msg model =
res3.model res3.model
res5 = res5 =
update key update inav
flags env
inav
settings
(ConcPersonMsg (ConcPersonMsg
(Comp.Dropdown.SetSelection (Comp.Dropdown.SetSelection
(item.concPerson (item.concPerson
@ -186,10 +176,8 @@ update key flags inav settings msg model =
res4.model res4.model
res6 = res6 =
update key update inav
flags env
inav
settings
(ConcEquipMsg (ConcEquipMsg
(Comp.Dropdown.SetSelection (Comp.Dropdown.SetSelection
(item.concEquipment (item.concEquipment
@ -201,13 +189,11 @@ update key flags inav settings msg model =
res5.model res5.model
res7 = res7 =
update key flags inav settings AddFilesReset res6.model update inav env AddFilesReset res6.model
res8 = res8 =
update key update inav
flags env
inav
settings
(FolderDropdownMsg (FolderDropdownMsg
(Comp.Dropdown.SetSelection (Comp.Dropdown.SetSelection
(item.folder (item.folder
@ -219,16 +205,14 @@ update key flags inav settings msg model =
res7.model res7.model
res9 = res9 =
update key update inav
flags env
inav
settings
(CustomFieldMsg (Comp.CustomFieldMultiInput.setValues item.customfields)) (CustomFieldMsg (Comp.CustomFieldMultiInput.setValues item.customfields))
res8.model res8.model
proposalCmd = proposalCmd =
if item.state == "created" then if item.state == "created" then
Api.getItemProposals flags item.id GetProposalResp Api.getItemProposals env.flags item.id GetProposalResp
else else
Cmd.none Cmd.none
@ -265,11 +249,11 @@ update key flags inav settings msg model =
, res7.cmd , res7.cmd
, res8.cmd , res8.cmd
, res9.cmd , res9.cmd
, getOptions flags , getOptions env.flags
, proposalCmd , proposalCmd
, Api.getSentMails flags item.id SentMailsResp , Api.getSentMails env.flags item.id SentMailsResp
, Api.getPersons flags "" Data.PersonOrder.NameAsc GetPersonResp , Api.getPersons env.flags "" Data.PersonOrder.NameAsc GetPersonResp
, Cmd.map CustomFieldMsg (Comp.CustomFieldMultiInput.initCmd flags) , Cmd.map CustomFieldMsg (Comp.CustomFieldMultiInput.initCmd env.flags)
] ]
, sub = , sub =
Sub.batch Sub.batch
@ -285,6 +269,7 @@ update key flags inav settings msg model =
] ]
, linkTarget = Comp.LinkTarget.LinkNone , linkTarget = Comp.LinkTarget.LinkNone
, removedItem = Nothing , removedItem = Nothing
, selectionChange = Data.ItemIds.noChange
} }
SetActiveAttachment pos -> SetActiveAttachment pos ->
@ -322,7 +307,7 @@ update key flags inav settings msg model =
resultModel model resultModel model
else else
resultModelCmd ( model, Api.itemDetail flags model.item.id GetItemResp ) resultModelCmd ( model, Api.itemDetail env.flags model.item.id GetItemResp )
FolderDropdownMsg m -> FolderDropdownMsg m ->
let let
@ -337,7 +322,7 @@ update key flags inav settings msg model =
save = save =
if isDropdownChangeMsg m then if isDropdownChangeMsg m then
setFolder flags newModel idref setFolder env.flags newModel idref
else else
Cmd.none Cmd.none
@ -354,7 +339,7 @@ update key flags inav settings msg model =
save = save =
if Comp.TagDropdown.isChangeMsg m then if Comp.TagDropdown.isChangeMsg m then
saveTags flags newModel saveTags env.flags newModel
else else
Cmd.none Cmd.none
@ -371,7 +356,7 @@ update key flags inav settings msg model =
save = save =
if isDropdownChangeMsg m then if isDropdownChangeMsg m then
setDirection flags newModel setDirection env.flags newModel
else else
Cmd.none Cmd.none
@ -393,7 +378,7 @@ update key flags inav settings msg model =
save = save =
if isDropdownChangeMsg m then if isDropdownChangeMsg m then
setCorrOrg flags newModel idref setCorrOrg env.flags newModel idref
else else
Cmd.none Cmd.none
@ -413,7 +398,7 @@ update key flags inav settings msg model =
save = save =
if isDropdownChangeMsg m then if isDropdownChangeMsg m then
setCorrPerson flags newModel idref setCorrPerson env.flags newModel idref
else else
Cmd.none Cmd.none
@ -433,7 +418,7 @@ update key flags inav settings msg model =
save = save =
if isDropdownChangeMsg m then if isDropdownChangeMsg m then
setConcPerson flags newModel idref setConcPerson env.flags newModel idref
else else
Cmd.none Cmd.none
@ -453,7 +438,7 @@ update key flags inav settings msg model =
save = save =
if isDropdownChangeMsg m then if isDropdownChangeMsg m then
setConcEquip flags newModel idref setConcEquip env.flags newModel idref
else else
Cmd.none Cmd.none
@ -468,7 +453,7 @@ update key flags inav settings msg model =
( setter, value, save ) = ( setter, value, save ) =
case result.change of case result.change of
Comp.SimpleTextInput.ValueUpdated v -> Comp.SimpleTextInput.ValueUpdated v ->
( setName flags { model | nameModel = Maybe.withDefault "" v }, v, Saving ) ( setName env.flags { model | nameModel = Maybe.withDefault "" v }, v, Saving )
Comp.SimpleTextInput.ValueUnchanged -> Comp.SimpleTextInput.ValueUnchanged ->
( Cmd.none, Nothing, model.nameState ) ( Cmd.none, Nothing, model.nameState )
@ -478,6 +463,7 @@ update key flags inav settings msg model =
, sub = Sub.map SetNameMsg result.sub , sub = Sub.map SetNameMsg result.sub
, linkTarget = Comp.LinkTarget.LinkNone , linkTarget = Comp.LinkTarget.LinkNone
, removedItem = Nothing , removedItem = Nothing
, selectionChange = Data.ItemIds.noChange
} }
SetNotes str -> SetNotes str ->
@ -509,22 +495,22 @@ update key flags inav settings msg model =
resultModel model resultModel model
SaveNotes -> SaveNotes ->
resultModelCmd ( model, setNotes flags model ) resultModelCmd ( model, setNotes env.flags model )
ConfirmItem -> ConfirmItem ->
let let
resetCmds = resetCmds =
resetHiddenFields settings flags model.item.id ResetHiddenMsg resetHiddenFields env.settings env.flags model.item.id ResetHiddenMsg
in in
resultModelCmd resultModelCmd
( { model | mobileItemMenuOpen = False } ( { model | mobileItemMenuOpen = False }
, Cmd.batch (Api.setConfirmed flags model.item.id SaveResp :: resetCmds) , Cmd.batch (Api.setConfirmed env.flags model.item.id SaveResp :: resetCmds)
) )
UnconfirmItem -> UnconfirmItem ->
resultModelCmd resultModelCmd
( { model | mobileItemMenuOpen = False } ( { model | mobileItemMenuOpen = False }
, Api.setUnconfirmed flags model.item.id SaveResp , Api.setUnconfirmed env.flags model.item.id SaveResp
) )
ItemDatePickerMsg m -> ItemDatePickerMsg m ->
@ -538,13 +524,13 @@ update key flags inav settings msg model =
newModel = newModel =
{ model | itemDatePicker = dp, itemDate = Just (Comp.DatePicker.midOfDay date) } { model | itemDatePicker = dp, itemDate = Just (Comp.DatePicker.midOfDay date) }
in in
resultModelCmd ( newModel, setDate flags newModel newModel.itemDate ) resultModelCmd ( newModel, setDate env.flags newModel newModel.itemDate )
_ -> _ ->
resultModel { model | itemDatePicker = dp } resultModel { model | itemDatePicker = dp }
RemoveDate -> RemoveDate ->
resultModelCmd ( { model | itemDate = Nothing }, setDate flags model Nothing ) resultModelCmd ( { model | itemDate = Nothing }, setDate env.flags model Nothing )
DueDatePickerMsg m -> DueDatePickerMsg m ->
let let
@ -557,18 +543,18 @@ update key flags inav settings msg model =
newModel = newModel =
{ model | dueDatePicker = dp, dueDate = Just (Comp.DatePicker.midOfDay date) } { model | dueDatePicker = dp, dueDate = Just (Comp.DatePicker.midOfDay date) }
in in
resultModelCmd ( newModel, setDueDate flags newModel newModel.dueDate ) resultModelCmd ( newModel, setDueDate env.flags newModel newModel.dueDate )
_ -> _ ->
resultModel { model | dueDatePicker = dp } resultModel { model | dueDatePicker = dp }
RemoveDueDate -> RemoveDueDate ->
resultModelCmd ( { model | dueDate = Nothing }, setDueDate flags model Nothing ) resultModelCmd ( { model | dueDate = Nothing }, setDueDate env.flags model Nothing )
DeleteItemConfirmed -> DeleteItemConfirmed ->
let let
cmd = cmd =
Api.deleteItem flags model.item.id (DeleteResp model.item.id) Api.deleteItem env.flags model.item.id (DeleteResp model.item.id)
in in
resultModelCmd ( { model | itemModal = Nothing }, cmd ) resultModelCmd ( { model | itemModal = Nothing }, cmd )
@ -583,22 +569,22 @@ update key flags inav settings msg model =
} }
SetCorrOrgSuggestion idname -> SetCorrOrgSuggestion idname ->
resultModelCmd ( model, setCorrOrg flags model (Just idname) ) resultModelCmd ( model, setCorrOrg env.flags model (Just idname) )
SetCorrPersonSuggestion idname -> SetCorrPersonSuggestion idname ->
resultModelCmd ( model, setCorrPerson flags model (Just idname) ) resultModelCmd ( model, setCorrPerson env.flags model (Just idname) )
SetConcPersonSuggestion idname -> SetConcPersonSuggestion idname ->
resultModelCmd ( model, setConcPerson flags model (Just idname) ) resultModelCmd ( model, setConcPerson env.flags model (Just idname) )
SetConcEquipSuggestion idname -> SetConcEquipSuggestion idname ->
resultModelCmd ( model, setConcEquip flags model (Just idname) ) resultModelCmd ( model, setConcEquip env.flags model (Just idname) )
SetItemDateSuggestion date -> SetItemDateSuggestion date ->
resultModelCmd ( model, setDate flags model (Just date) ) resultModelCmd ( model, setDate env.flags model (Just date) )
SetDueDateSuggestion date -> SetDueDateSuggestion date ->
resultModelCmd ( model, setDueDate flags model (Just date) ) resultModelCmd ( model, setDueDate env.flags model (Just date) )
GetFolderResp (Ok fs) -> GetFolderResp (Ok fs) ->
let let
@ -613,7 +599,7 @@ update key flags inav settings msg model =
|> List.map mkIdName |> List.map mkIdName
|> Comp.Dropdown.SetOptions |> Comp.Dropdown.SetOptions
in in
update key flags inav settings (FolderDropdownMsg opts) model_ update inav env (FolderDropdownMsg opts) model_
GetFolderResp (Err _) -> GetFolderResp (Err _) ->
resultModel model resultModel model
@ -636,7 +622,7 @@ update key flags inav settings msg model =
opts = opts =
Comp.Dropdown.SetOptions orgs.items Comp.Dropdown.SetOptions orgs.items
in in
update key flags inav settings (OrgDropdownMsg opts) model update inav env (OrgDropdownMsg opts) model
GetOrgResp (Err _) -> GetOrgResp (Err _) ->
resultModel model resultModel model
@ -673,18 +659,14 @@ update key flags inav settings msg model =
{ model | allPersons = personDict } { model | allPersons = personDict }
res1 = res1 =
update key update inav
flags env
inav
settings
(CorrPersonMsg (Comp.Dropdown.SetOptions corrRefs)) (CorrPersonMsg (Comp.Dropdown.SetOptions corrRefs))
model_ model_
res2 = res2 =
update key update inav
flags env
inav
settings
(ConcPersonMsg (Comp.Dropdown.SetOptions concRefs)) (ConcPersonMsg (Comp.Dropdown.SetOptions concRefs))
res1.model res1.model
in in
@ -693,6 +675,7 @@ update key flags inav settings msg model =
, sub = Sub.batch [ res1.sub, res2.sub ] , sub = Sub.batch [ res1.sub, res2.sub ]
, linkTarget = Comp.LinkTarget.LinkNone , linkTarget = Comp.LinkTarget.LinkNone
, removedItem = Nothing , removedItem = Nothing
, selectionChange = Data.ItemIds.noChange
} }
GetPersonResp (Err _) -> GetPersonResp (Err _) ->
@ -706,14 +689,14 @@ update key flags inav settings msg model =
equips.items equips.items
) )
in in
update key flags inav settings (ConcEquipMsg opts) model update inav env (ConcEquipMsg opts) model
GetEquipResp (Err _) -> GetEquipResp (Err _) ->
resultModel model resultModel model
SaveResp (Ok res) -> SaveResp (Ok res) ->
if res.success then if res.success then
resultModelCmd ( model, Api.itemDetail flags model.item.id GetItemResp ) resultModelCmd ( model, Api.itemDetail env.flags model.item.id GetItemResp )
else else
resultModel model resultModel model
@ -742,10 +725,10 @@ update key flags inav settings msg model =
result_ = result_ =
case inav.next of case inav.next of
Just id -> Just id ->
resultModelCmd ( model, Page.set key (ItemDetailPage id) ) resultModelCmd ( model, Page.set env.key (ItemDetailPage id) )
Nothing -> Nothing ->
resultModelCmd ( model, Page.set key (SearchPage Nothing) ) resultModelCmd ( model, Page.set env.key (SearchPage Nothing) )
in in
{ result_ | removedItem = Just removedId } { result_ | removedItem = Just removedId }
@ -756,7 +739,7 @@ update key flags inav settings msg model =
resultModel model resultModel model
GetItemResp (Ok item) -> GetItemResp (Ok item) ->
update key flags inav settings (SetItem item) model update inav env (SetItem item) model
GetItemResp (Err _) -> GetItemResp (Err _) ->
resultModel model resultModel model
@ -770,7 +753,7 @@ update key flags inav settings msg model =
ItemMailMsg m -> ItemMailMsg m ->
let let
( im, ic, fa ) = ( im, ic, fa ) =
Comp.ItemMail.update flags m model.itemMail Comp.ItemMail.update env.flags m model.itemMail
in in
case fa of case fa of
Comp.ItemMail.FormNone -> Comp.ItemMail.FormNone ->
@ -798,7 +781,7 @@ update key flags inav settings msg model =
( { model | mailSending = True } ( { model | mailSending = True }
, Cmd.batch , Cmd.batch
[ Cmd.map ItemMailMsg ic [ Cmd.map ItemMailMsg ic
, Api.sendMail flags mail SendMailResp , Api.sendMail env.flags mail SendMailResp
] ]
) )
@ -850,7 +833,7 @@ update key flags inav settings msg model =
MailSendFailed br.message MailSendFailed br.message
} }
, if br.success then , if br.success then
Api.itemDetail flags model.item.id GetItemResp Api.itemDetail env.flags model.item.id GetItemResp
else else
Cmd.none Cmd.none
@ -895,7 +878,7 @@ update key flags inav settings msg model =
Nothing -> Nothing ->
let let
( am, ac ) = ( am, ac ) =
Comp.AttachmentMeta.init flags id Comp.AttachmentMeta.init env.flags id
nextMeta = nextMeta =
Dict.insert id am model.attachMeta Dict.insert id am model.attachMeta
@ -925,7 +908,7 @@ update key flags inav settings msg model =
DeleteAttachConfirmed attachId -> DeleteAttachConfirmed attachId ->
let let
cmd = cmd =
Api.deleteAttachment flags attachId DeleteAttachResp Api.deleteAttachment env.flags attachId DeleteAttachResp
in in
resultModelCmd ( { model | attachModal = Nothing }, cmd ) resultModelCmd ( { model | attachModal = Nothing }, cmd )
@ -934,7 +917,7 @@ update key flags inav settings msg model =
DeleteAttachResp (Ok res) -> DeleteAttachResp (Ok res) ->
if res.success then if res.success then
update key flags inav settings ReloadItem model update inav env ReloadItem model
else else
resultModel model resultModel model
@ -980,7 +963,7 @@ update key flags inav settings msg model =
SelectView svm -> SelectView svm ->
let let
cmd = cmd =
Api.deleteAttachments flags svm.ids DeleteAttachResp Api.deleteAttachments env.flags svm.ids DeleteAttachResp
in in
resultModelCmd ( { model | attachModal = Nothing, viewMode = SimpleView }, cmd ) resultModelCmd ( { model | attachModal = Nothing, viewMode = SimpleView }, cmd )
@ -1029,7 +1012,7 @@ update key flags inav settings msg model =
List.map makeFileId model.selectedFiles List.map makeFileId model.selectedFiles
uploads = uploads =
Cmd.batch (Api.uploadAmend flags model.item.id model.selectedFiles AddFilesUploadResp) Cmd.batch (Api.uploadAmend env.flags model.item.id model.selectedFiles AddFilesUploadResp)
tracker = tracker =
Sub.batch <| List.map (\id -> Http.track id (AddFilesProgress id)) fileids Sub.batch <| List.map (\id -> Http.track id (AddFilesProgress id)) fileids
@ -1112,7 +1095,7 @@ update key flags inav settings msg model =
case result of case result of
Just ( src, trg, _ ) -> Just ( src, trg, _ ) ->
if src /= trg then if src /= trg then
Api.moveAttachmentBefore flags Api.moveAttachmentBefore env.flags
model.item.id model.item.id
(MoveAttachment src trg) (MoveAttachment src trg)
SaveResp SaveResp
@ -1130,7 +1113,7 @@ update key flags inav settings msg model =
Just mm -> Just mm ->
let let
( mm_, mc_, mv ) = ( mm_, mc_, mv ) =
Comp.DetailEdit.update flags lm mm Comp.DetailEdit.update env.flags lm mm
( model_, cmd_ ) = ( model_, cmd_ ) =
case mv of case mv of
@ -1138,7 +1121,7 @@ update key flags inav settings msg model =
( { model | modalEdit = Nothing }, Cmd.none ) ( { model | modalEdit = Nothing }, Cmd.none )
Just _ -> Just _ ->
( model, Api.itemDetail flags model.item.id GetItemResp ) ( model, Api.itemDetail env.flags model.item.id GetItemResp )
Nothing -> Nothing ->
( { model | modalEdit = Just mm_ }, Cmd.none ) ( { model | modalEdit = Just mm_ }, Cmd.none )
@ -1180,7 +1163,7 @@ update key flags inav settings msg model =
Just oid -> Just oid ->
let let
( m, c ) = ( m, c ) =
Comp.DetailEdit.editOrg flags oid Comp.OrgForm.emptyModel Comp.DetailEdit.editOrg env.flags oid Comp.OrgForm.emptyModel
in in
resultModelCmd ( { model | modalEdit = Just m }, Cmd.map ModalEditMsg c ) resultModelCmd ( { model | modalEdit = Just m }, Cmd.map ModalEditMsg c )
@ -1198,7 +1181,7 @@ update key flags inav settings msg model =
Just eid -> Just eid ->
let let
( m, c ) = ( m, c ) =
Comp.DetailEdit.editEquip flags eid Comp.EquipmentForm.emptyModel Comp.DetailEdit.editEquip env.flags eid Comp.EquipmentForm.emptyModel
in in
resultModelCmd ( { model | modalEdit = Just m }, Cmd.map ModalEditMsg c ) resultModelCmd ( { model | modalEdit = Just m }, Cmd.map ModalEditMsg c )
@ -1209,7 +1192,7 @@ update key flags inav settings msg model =
let let
( pm, pc ) = ( pm, pc ) =
Comp.DetailEdit.initCorrPerson Comp.DetailEdit.initCorrPerson
flags env.flags
model.item.id model.item.id
Comp.PersonForm.emptyModel Comp.PersonForm.emptyModel
in in
@ -1222,7 +1205,7 @@ update key flags inav settings msg model =
let let
( p, c ) = ( p, c ) =
Comp.DetailEdit.initConcPerson Comp.DetailEdit.initConcPerson
flags env.flags
model.item.id model.item.id
Comp.PersonForm.emptyModel Comp.PersonForm.emptyModel
in in
@ -1242,7 +1225,7 @@ update key flags inav settings msg model =
Just pid -> Just pid ->
let let
( m, c ) = ( m, c ) =
Comp.DetailEdit.editPerson flags pid Comp.PersonForm.emptyModel Comp.DetailEdit.editPerson env.flags pid Comp.PersonForm.emptyModel
in in
resultModelCmd ( { model | modalEdit = Just m }, Cmd.map ModalEditMsg c ) resultModelCmd ( { model | modalEdit = Just m }, Cmd.map ModalEditMsg c )
@ -1318,7 +1301,7 @@ update key flags inav settings msg model =
resultModelCmd resultModelCmd
( model ( model
, Api.setAttachmentName , Api.setAttachmentName
flags env.flags
m.id m.id
(Util.Maybe.fromString m.newName) (Util.Maybe.fromString m.newName)
EditAttachNameResp EditAttachNameResp
@ -1370,15 +1353,15 @@ update key flags inav settings msg model =
in in
if keys == Just Comp.KeyInput.ctrlC then if keys == Just Comp.KeyInput.ctrlC then
if model.item.state == "created" then if model.item.state == "created" then
update key flags inav settings ConfirmItem model_ update inav env ConfirmItem model_
else else
update key flags inav settings UnconfirmItem model_ update inav env UnconfirmItem model_
else if keys == Just Comp.KeyInput.ctrlPoint then else if keys == Just Comp.KeyInput.ctrlPoint then
case inav.next of case inav.next of
Just id -> Just id ->
resultModelCmd ( model_, Page.set key (ItemDetailPage id) ) resultModelCmd ( model_, Page.set env.key (ItemDetailPage id) )
Nothing -> Nothing ->
resultModel model_ resultModel model_
@ -1386,7 +1369,7 @@ update key flags inav settings msg model =
else if keys == Just Comp.KeyInput.ctrlComma then else if keys == Just Comp.KeyInput.ctrlComma then
case inav.prev of case inav.prev of
Just id -> Just id ->
resultModelCmd ( model_, Page.set key (ItemDetailPage id) ) resultModelCmd ( model_, Page.set env.key (ItemDetailPage id) )
Nothing -> Nothing ->
resultModel model_ resultModel model_
@ -1405,7 +1388,7 @@ update key flags inav settings msg model =
let let
model_ = model_ =
{ model { model
| menuOpen = settings.sideMenuVisible | menuOpen = env.settings.sideMenuVisible
} }
in in
resultModel model_ resultModel model_
@ -1416,12 +1399,13 @@ update key flags inav settings msg model =
, sub = Sub.none , sub = Sub.none
, linkTarget = lt , linkTarget = lt
, removedItem = Nothing , removedItem = Nothing
, selectionChange = Data.ItemIds.noChange
} }
CustomFieldMsg lm -> CustomFieldMsg lm ->
let let
result = result =
Comp.CustomFieldMultiInput.update flags lm model.customFieldsModel Comp.CustomFieldMultiInput.update env.flags lm model.customFieldsModel
cmd_ = cmd_ =
Cmd.map CustomFieldMsg result.cmd Cmd.map CustomFieldMsg result.cmd
@ -1438,7 +1422,7 @@ update key flags inav settings msg model =
( Cmd.none, model.customFieldSavingIcon ) ( Cmd.none, model.customFieldSavingIcon )
FieldValueRemove field -> FieldValueRemove field ->
( Api.deleteCustomValue flags ( Api.deleteCustomValue env.flags
model.item.id model.item.id
field.id field.id
(CustomFieldRemoveResp field.id) (CustomFieldRemoveResp field.id)
@ -1446,7 +1430,7 @@ update key flags inav settings msg model =
) )
FieldValueChange field value -> FieldValueChange field value ->
( Api.putCustomValue flags ( Api.putCustomValue env.flags
model.item.id model.item.id
(CustomFieldValue field.id value) (CustomFieldValue field.id value)
(CustomFieldSaveResp field value) (CustomFieldSaveResp field value)
@ -1497,7 +1481,7 @@ update key flags inav settings msg model =
if res.success then if res.success then
resultModelCmd resultModelCmd
( model_ ( model_
, Api.itemDetail flags model.item.id GetItemResp , Api.itemDetail env.flags model.item.id GetItemResp
) )
else else
@ -1551,7 +1535,7 @@ update key flags inav settings msg model =
ReprocessFileConfirmed id -> ReprocessFileConfirmed id ->
let let
cmd = cmd =
Api.reprocessItem flags model.item.id [ id ] ReprocessFileResp Api.reprocessItem env.flags model.item.id [ id ] ReprocessFileResp
in in
resultModelCmd ( { model | attachModal = Nothing }, cmd ) resultModelCmd ( { model | attachModal = Nothing }, cmd )
@ -1572,7 +1556,7 @@ update key flags inav settings msg model =
ReprocessItemConfirmed -> ReprocessItemConfirmed ->
let let
cmd = cmd =
Api.reprocessItem flags model.item.id [] ReprocessFileResp Api.reprocessItem env.flags model.item.id [] ReprocessFileResp
in in
resultModelCmd ( { model | itemModal = Nothing }, cmd ) resultModelCmd ( { model | itemModal = Nothing }, cmd )
@ -1594,9 +1578,9 @@ update key flags inav settings msg model =
) )
RestoreItem -> RestoreItem ->
resultModelCmd ( model, Api.restoreItem flags model.item.id SaveResp ) resultModelCmd ( model, Api.restoreItem env.flags model.item.id SaveResp )
ToggleShowQrItem id -> ToggleShowQrItem _ ->
let let
sqm = sqm =
model.showQrModel model.showQrModel
@ -1606,7 +1590,7 @@ update key flags inav settings msg model =
in in
resultModel { model | showQrModel = next, mobileItemMenuOpen = False } resultModel { model | showQrModel = next, mobileItemMenuOpen = False }
ToggleShowQrAttach id -> ToggleShowQrAttach _ ->
let let
sqm = sqm =
model.showQrModel model.showQrModel
@ -1619,6 +1603,16 @@ update key flags inav settings msg model =
PrintElement id -> PrintElement id ->
resultModelCmd ( model, Ports.printElement id ) resultModelCmd ( model, Ports.printElement id )
ToggleSelectItem ->
let
res =
resultModel { model | mobileItemMenuOpen = False }
newSelection =
Data.ItemIds.toggle env.selectedItems model.item.id
in
{ res | selectionChange = newSelection }
--- Helper --- Helper

View File

@ -27,8 +27,10 @@ import Comp.ItemDetail.SingleAttachment
import Comp.ItemMail import Comp.ItemMail
import Comp.MenuBar as MB import Comp.MenuBar as MB
import Comp.SentMails import Comp.SentMails
import Data.Environment as Env
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.Icons as Icons import Data.Icons as Icons
import Data.ItemIds
import Data.ItemNav exposing (ItemNav) import Data.ItemNav exposing (ItemNav)
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
import Html exposing (..) import Html exposing (..)
@ -39,13 +41,13 @@ import Page exposing (Page(..))
import Styles as S import Styles as S
view : Texts -> Flags -> ItemNav -> UiSettings -> Model -> Html Msg view : Texts -> ItemNav -> Env.View -> Model -> Html Msg
view texts flags inav settings model = view texts inav env model =
div [ class "flex flex-col h-full" ] div [ class "flex flex-col h-full" ]
[ header texts settings inav model [ header texts inav env model
-- , menuBar texts inav settings model -- , menuBar texts inav settings model
, body texts flags inav settings model , body texts env.flags inav env.settings model
, itemModal texts model , itemModal texts model
] ]
@ -60,25 +62,35 @@ itemModal texts model =
span [ class "hidden" ] [] span [ class "hidden" ] []
header : Texts -> UiSettings -> ItemNav -> Model -> Html Msg header : Texts -> ItemNav -> Env.View -> Model -> Html Msg
header texts settings inav model = header texts inav env model =
div [ class "my-3" ] div [ class "my-3" ]
[ Comp.ItemDetail.ItemInfoHeader.view texts.itemInfoHeader [ Comp.ItemDetail.ItemInfoHeader.view texts.itemInfoHeader
settings env.settings
model model
(menuBar texts inav settings model) (menuBar texts inav env model)
] ]
menuBar : Texts -> ItemNav -> UiSettings -> Model -> Html Msg menuBar : Texts -> ItemNav -> Env.View -> Model -> Html Msg
menuBar texts inav settings model = menuBar texts inav env model =
let let
keyDescr name = keyDescr name =
if settings.itemDetailShortcuts && model.menuOpen then if env.settings.itemDetailShortcuts && model.menuOpen then
" " ++ texts.key ++ "'" ++ name ++ "'." " " ++ texts.key ++ "'" ++ name ++ "'."
else else
"" ""
isSelected =
Data.ItemIds.isMember env.selectedItems model.item.id
foldSelected fsel funsel =
if isSelected then
fsel
else
funsel
in in
MB.view MB.view
{ start = { start =
@ -210,7 +222,18 @@ menuBar texts inav settings model =
, toggleMenu = ToggleMobileItemMenu , toggleMenu = ToggleMobileItemMenu
, menuOpen = model.mobileItemMenuOpen , menuOpen = model.mobileItemMenuOpen
, items = , items =
[ { icon = i [ class "fa fa-envelope font-thin" ] [] [ { icon =
foldSelected
(i [ class "fa fa-check-square dark:text-lime-400 text-lime-600" ] [])
(i [ class "fa fa-tasks" ] [])
, label = foldSelected texts.deselectItem texts.selectItem
, disabled = False
, attrs =
[ href "#"
, onClick ToggleSelectItem
]
}
, { icon = i [ class "fa fa-envelope font-thin" ] []
, label = texts.sendMail , label = texts.sendMail
, disabled = False , disabled = False
, attrs = , attrs =
@ -281,13 +304,28 @@ menuBar texts inav settings model =
] ]
, end = , end =
[ MB.CustomElement <| [ MB.CustomElement <|
a
[ href "#"
, onClick ToggleSelectItem
, title (foldSelected texts.deselectItem texts.selectItem)
, class "hidden md:flex flex-row items-center h-full "
, classList
[ ( S.greenButton, isSelected )
, ( S.secondaryBasicButton, not isSelected )
]
]
[ foldSelected
(i [ class "fa fa-square-check" ] [])
(i [ class "fa fa-list-check" ] [])
]
, MB.CustomElement <|
a a
[ class S.secondaryBasicButton [ class S.secondaryBasicButton
, href "#" , href "#"
, onClick UnconfirmItem , onClick UnconfirmItem
, title texts.unconfirmItemMetadata , title texts.unconfirmItemMetadata
, classList [ ( "hidden", model.item.state == "created" ) ] , class "hidden"
, class "hidden md:block" , classList [ ( "md:block", model.item.state /= "created" ) ]
] ]
[ i [ class "fa fa-eye-slash font-thin" ] [] [ i [ class "fa fa-eye-slash font-thin" ] []
] ]

View File

@ -19,6 +19,7 @@ module Comp.SearchMenu exposing
, linkTargetMsg , linkTargetMsg
, refreshBookmarks , refreshBookmarks
, setFromStats , setFromStats
, setIncludeSelection
, textSearchString , textSearchString
, update , update
, updateDrop , updateDrop
@ -52,6 +53,7 @@ import Data.EquipmentOrder
import Data.EquipmentUse import Data.EquipmentUse
import Data.Fields import Data.Fields
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemIds exposing (ItemIdChange, ItemIds)
import Data.ItemQuery as Q exposing (ItemQuery) import Data.ItemQuery as Q exposing (ItemQuery)
import Data.PersonOrder import Data.PersonOrder
import Data.PersonUse import Data.PersonUse
@ -102,6 +104,7 @@ type alias Model =
, sourceModel : Maybe String , sourceModel : Maybe String
, allBookmarks : Comp.BookmarkChooser.Model , allBookmarks : Comp.BookmarkChooser.Model
, selectedBookmarks : Comp.BookmarkChooser.Selection , selectedBookmarks : Comp.BookmarkChooser.Selection
, includeSelection : Bool
, openTabs : Set String , openTabs : Set String
, searchMode : SearchMode , searchMode : SearchMode
} }
@ -149,6 +152,7 @@ init flags =
, sourceModel = Nothing , sourceModel = Nothing
, allBookmarks = Comp.BookmarkChooser.init Data.Bookmarks.empty , allBookmarks = Comp.BookmarkChooser.init Data.Bookmarks.empty
, selectedBookmarks = Comp.BookmarkChooser.emptySelection , selectedBookmarks = Comp.BookmarkChooser.emptySelection
, includeSelection = False
, openTabs = Set.fromList [ "Tags", "Inbox" ] , openTabs = Set.fromList [ "Tags", "Inbox" ]
, searchMode = Data.SearchMode.Normal , searchMode = Data.SearchMode.Normal
} }
@ -222,8 +226,8 @@ isNamesSearch model =
True True
getItemQuery : Model -> Maybe ItemQuery getItemQuery : ItemIds -> Model -> Maybe ItemQuery
getItemQuery model = getItemQuery selectedItems model =
let let
when flag body = when flag body =
if flag then if flag then
@ -258,6 +262,11 @@ getItemQuery model =
in in
Q.and Q.and
[ when model.inboxCheckbox (Q.Inbox True) [ when model.inboxCheckbox (Q.Inbox True)
, if model.includeSelection then
Data.ItemIds.toQuery selectedItems
else
Nothing
, whenNotEmpty (model.tagSelection.includeTags |> Set.toList) , whenNotEmpty (model.tagSelection.includeTags |> Set.toList)
(Q.TagIds Q.AllMatch) (Q.TagIds Q.AllMatch)
, whenNotEmpty (model.tagSelection.excludeTags |> Set.toList) , whenNotEmpty (model.tagSelection.excludeTags |> Set.toList)
@ -347,6 +356,7 @@ resetModel model =
, customValues = Data.CustomFieldChange.emptyCollect , customValues = Data.CustomFieldChange.emptyCollect
, sourceModel = Nothing , sourceModel = Nothing
, selectedBookmarks = Comp.BookmarkChooser.emptySelection , selectedBookmarks = Comp.BookmarkChooser.emptySelection
, includeSelection = False
, searchMode = Data.SearchMode.Normal , searchMode = Data.SearchMode.Normal
} }
@ -397,6 +407,8 @@ type Msg
| ToggleOpenAllAkkordionTabs | ToggleOpenAllAkkordionTabs
| AllBookmarksResp (Result Http.Error AllBookmarks) | AllBookmarksResp (Result Http.Error AllBookmarks)
| SelectBookmarkMsg Comp.BookmarkChooser.Msg | SelectBookmarkMsg Comp.BookmarkChooser.Msg
| SetIncludeSelection Bool
| ClearSelection
setFromStats : SearchStats -> Msg setFromStats : SearchStats -> Msg
@ -409,6 +421,11 @@ initFromStats stats =
GetAllTagsResp (Ok stats) GetAllTagsResp (Ok stats)
setIncludeSelection : Bool -> Msg
setIncludeSelection flag =
SetIncludeSelection flag
linkTargetMsg : LinkTarget -> Maybe Msg linkTargetMsg : LinkTarget -> Maybe Msg
linkTargetMsg linkTarget = linkTargetMsg linkTarget =
case linkTarget of case linkTarget of
@ -449,6 +466,7 @@ type alias NextState =
, sub : Sub Msg , sub : Sub Msg
, stateChange : Bool , stateChange : Bool
, dragDrop : DD.DragDropData , dragDrop : DD.DragDropData
, selectionChange : ItemIdChange
} }
@ -483,6 +501,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = True , stateChange = True
, dragDrop = set.dragDrop , dragDrop = set.dragDrop
, selectionChange = Data.ItemIds.noChange
} }
in in
case msg of case msg of
@ -525,6 +544,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
ResetForm -> ResetForm ->
@ -533,6 +553,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = True , stateChange = True
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
SetCorrOrg id -> SetCorrOrg id ->
@ -555,6 +576,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
SetConcEquip id -> SetConcEquip id ->
@ -586,6 +608,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = sel /= model.selectedBookmarks , stateChange = sel /= model.selectedBookmarks
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
GetAllTagsResp (Ok stats) -> GetAllTagsResp (Ok stats) ->
@ -600,6 +623,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
GetAllTagsResp (Err _) -> GetAllTagsResp (Err _) ->
@ -608,6 +632,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
GetStatsResp (Ok stats) -> GetStatsResp (Ok stats) ->
@ -676,6 +701,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
GetStatsResp (Err _) -> GetStatsResp (Err _) ->
@ -684,6 +710,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
GetEquipResp (Ok equips) -> GetEquipResp (Ok equips) ->
@ -699,6 +726,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
GetOrgResp (Ok orgs) -> GetOrgResp (Ok orgs) ->
@ -714,6 +742,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
GetPersonResp (Ok ps) -> GetPersonResp (Ok ps) ->
@ -749,6 +778,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
TagSelectMsg m -> TagSelectMsg m ->
@ -765,6 +795,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = sel /= model.tagSelection , stateChange = sel /= model.tagSelection
, dragDrop = ddd , dragDrop = ddd
, selectionChange = Data.ItemIds.noChange
} }
DirectionMsg m -> DirectionMsg m ->
@ -777,6 +808,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = isDropdownChangeMsg m , stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
OrgMsg m -> OrgMsg m ->
@ -789,6 +821,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = isDropdownChangeMsg m , stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
CorrPersonMsg m -> CorrPersonMsg m ->
@ -801,6 +834,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = isDropdownChangeMsg m , stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
ConcPersonMsg m -> ConcPersonMsg m ->
@ -813,6 +847,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = isDropdownChangeMsg m , stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
ConcEquipmentMsg m -> ConcEquipmentMsg m ->
@ -825,6 +860,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = isDropdownChangeMsg m , stateChange = isDropdownChangeMsg m
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
ToggleInbox -> ToggleInbox ->
@ -837,6 +873,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = True , stateChange = True
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
ToggleSearchMode -> ToggleSearchMode ->
@ -856,6 +893,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = True , stateChange = True
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
FromDateMsg m -> FromDateMsg m ->
@ -876,6 +914,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = model.fromDate /= nextDate , stateChange = model.fromDate /= nextDate
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
UntilDateMsg m -> UntilDateMsg m ->
@ -896,6 +935,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = model.untilDate /= nextDate , stateChange = model.untilDate /= nextDate
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
FromDueDateMsg m -> FromDueDateMsg m ->
@ -916,6 +956,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = model.fromDueDate /= nextDate , stateChange = model.fromDueDate /= nextDate
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
UntilDueDateMsg m -> UntilDueDateMsg m ->
@ -936,6 +977,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = model.untilDueDate /= nextDate , stateChange = model.untilDueDate /= nextDate
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
SetName str -> SetName str ->
@ -948,6 +990,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
SetTextSearch str -> SetTextSearch str ->
@ -956,6 +999,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
SwapTextSearch -> SwapTextSearch ->
@ -965,6 +1009,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
else else
@ -973,6 +1018,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
SetFulltextSearch -> SetFulltextSearch ->
@ -983,6 +1029,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
Names s -> Names s ->
@ -991,6 +1038,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
SetNamesSearch -> SetNamesSearch ->
@ -1001,6 +1049,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
Names _ -> Names _ ->
@ -1009,6 +1058,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
KeyUpMsg (Just Enter) -> KeyUpMsg (Just Enter) ->
@ -1017,6 +1067,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = True , stateChange = True
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
KeyUpMsg _ -> KeyUpMsg _ ->
@ -1025,6 +1076,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
FolderSelectMsg lm -> FolderSelectMsg lm ->
@ -1041,6 +1093,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = model.selectedFolder /= sel , stateChange = model.selectedFolder /= sel
, dragDrop = ddd , dragDrop = ddd
, selectionChange = Data.ItemIds.noChange
} }
CustomFieldMsg lm -> CustomFieldMsg lm ->
@ -1058,6 +1111,7 @@ updateDrop ddm flags settings msg model =
, stateChange = , stateChange =
Data.CustomFieldChange.isValueChange res.result Data.CustomFieldChange.isValueChange res.result
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
SetCustomField cv -> SetCustomField cv ->
@ -1086,6 +1140,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
ResetToSource str -> ResetToSource str ->
@ -1105,6 +1160,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
ToggleOpenAllAkkordionTabs -> ToggleOpenAllAkkordionTabs ->
@ -1125,6 +1181,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
AllBookmarksResp (Ok bm) -> AllBookmarksResp (Ok bm) ->
@ -1133,6 +1190,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = model.allBookmarks /= Comp.BookmarkChooser.init bm , stateChange = model.allBookmarks /= Comp.BookmarkChooser.init bm
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
AllBookmarksResp (Err _) -> AllBookmarksResp (Err _) ->
@ -1141,6 +1199,7 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = False , stateChange = False
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
} }
SelectBookmarkMsg lm -> SelectBookmarkMsg lm ->
@ -1153,6 +1212,26 @@ updateDrop ddm flags settings msg model =
, sub = Sub.none , sub = Sub.none
, stateChange = sel /= model.selectedBookmarks || model.allBookmarks /= next , stateChange = sel /= model.selectedBookmarks || model.allBookmarks /= next
, dragDrop = DD.DragDropData ddm Nothing , dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
SetIncludeSelection flag ->
{ model =
{ model | includeSelection = flag }
, cmd = Cmd.none
, sub = Sub.none
, stateChange = True
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.noChange
}
ClearSelection ->
{ model = { model | includeSelection = False }
, cmd = Cmd.none
, sub = Sub.none
, stateChange = True
, dragDrop = DD.DragDropData ddm Nothing
, selectionChange = Data.ItemIds.clearAll
} }
@ -1162,6 +1241,7 @@ updateDrop ddm flags settings msg model =
type alias ViewConfig = type alias ViewConfig =
{ overrideTabLook : SearchTab -> Comp.Tabs.Look -> Comp.Tabs.Look { overrideTabLook : SearchTab -> Comp.Tabs.Look -> Comp.Tabs.Look
, selectedItems : ItemIds
} }
@ -1174,7 +1254,7 @@ viewDrop2 texts ddd flags cfg settings model =
Comp.Tabs.akkordion Comp.Tabs.akkordion
akkordionStyle akkordionStyle
(searchTabState settings cfg model) (searchTabState settings cfg model)
(searchTabs texts ddd flags settings model) (searchTabs texts ddd flags settings cfg.selectedItems model)
type SearchTab type SearchTab
@ -1191,6 +1271,7 @@ type SearchTab
| TabSource | TabSource
| TabDirection | TabDirection
| TabTrashed | TabTrashed
| TabSelection
allTabs : List SearchTab allTabs : List SearchTab
@ -1208,6 +1289,7 @@ allTabs =
, TabSource , TabSource
, TabDirection , TabDirection
, TabTrashed , TabTrashed
, TabSelection
] ]
@ -1253,6 +1335,9 @@ tabName tab =
TabTrashed -> TabTrashed ->
"trashed" "trashed"
TabSelection ->
"selection"
findTab : Comp.Tabs.Tab msg -> Maybe SearchTab findTab : Comp.Tabs.Tab msg -> Maybe SearchTab
findTab tab = findTab tab =
@ -1296,12 +1381,15 @@ findTab tab =
"trashed" -> "trashed" ->
Just TabTrashed Just TabTrashed
"selection" ->
Just TabSelection
_ -> _ ->
Nothing Nothing
tabLook : UiSettings -> Model -> SearchTab -> Comp.Tabs.Look tabLook : UiSettings -> ItemIds -> Model -> SearchTab -> Comp.Tabs.Look
tabLook settings model tab = tabLook settings selectedItems model tab =
let let
isHidden f = isHidden f =
Data.UiSettings.fieldHidden settings f Data.UiSettings.fieldHidden settings f
@ -1396,6 +1484,16 @@ tabLook settings model tab =
TabTrashed -> TabTrashed ->
activeWhen (model.searchMode == Data.SearchMode.Trashed) activeWhen (model.searchMode == Data.SearchMode.Trashed)
TabSelection ->
if Data.ItemIds.isEmpty selectedItems then
Comp.Tabs.Hidden
else if model.includeSelection then
Comp.Tabs.Active
else
Comp.Tabs.Normal
_ -> _ ->
Comp.Tabs.Normal Comp.Tabs.Normal
@ -1416,15 +1514,15 @@ searchTabState settings cfg model tab =
state = state =
{ folded = folded { folded = folded
, look = , look =
Maybe.map (\t -> tabLook settings model t |> cfg.overrideTabLook t) searchTab Maybe.map (\t -> tabLook settings cfg.selectedItems model t |> cfg.overrideTabLook t) searchTab
|> Maybe.withDefault Comp.Tabs.Normal |> Maybe.withDefault Comp.Tabs.Normal
} }
in in
( state, ToggleAkkordionTab tab.name ) ( state, ToggleAkkordionTab tab.name )
searchTabs : Texts -> DD.DragDropData -> Flags -> UiSettings -> Model -> List (Comp.Tabs.Tab Msg) searchTabs : Texts -> DD.DragDropData -> Flags -> UiSettings -> ItemIds -> Model -> List (Comp.Tabs.Tab Msg)
searchTabs texts ddd flags settings model = searchTabs texts ddd flags settings selectedItems model =
let let
isHidden f = isHidden f =
Data.UiSettings.fieldHidden settings f Data.UiSettings.fieldHidden settings f
@ -1477,6 +1575,40 @@ searchTabs texts ddd flags settings model =
(Comp.BookmarkChooser.view texts.bookmarkChooser model.allBookmarks model.selectedBookmarks) (Comp.BookmarkChooser.view texts.bookmarkChooser model.allBookmarks model.selectedBookmarks)
] ]
} }
, { name = tabName TabSelection
, title = texts.selection
, titleRight =
[ span [ class "flex items-center rounded-full bg-blue-100 dark:bg-sky-600 text-xs px-2 py-0.5 " ]
[ text (String.fromInt (Data.ItemIds.size selectedItems)) ]
]
, info = Nothing
, body =
[ div [ class "flex flex-col ml-1" ]
[ a
[ class "flex flex-row items-center"
, class "rounded px-1 py-1 hover:bg-blue-100 dark:hover:bg-slate-600"
, href "#"
, Html.Events.onClick (SetIncludeSelection (not model.includeSelection))
]
[ if model.includeSelection then
i [ class "fa fa-check mr-2" ] []
else
i [ class "fa fa-list-check mr-2" ] []
, text texts.showSelection
]
, a
[ class "flex flex-row items-center"
, class "rounded px-1 py-1 hover:bg-blue-100 dark:hover:bg-slate-600"
, href "#"
, Html.Events.onClick ClearSelection
]
[ i [ class "fa fa-times mr-2" ] []
, text texts.clearSelection
]
]
]
}
, { name = tabName TabTags , { name = tabName TabTags
, title = texts.basics.tags , title = texts.basics.tags
, titleRight = [] , titleRight = []

View File

@ -0,0 +1,29 @@
{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Data.Environment exposing (..)
import Browser.Navigation as Nav
import Data.Flags exposing (Flags)
import Data.ItemIds exposing (ItemIds)
import Data.UiSettings exposing (UiSettings)
type alias Update =
{ key : Nav.Key
, selectedItems : ItemIds
, flags : Flags
, settings : UiSettings
}
type alias View =
{ flags : Flags
, sidebarVisible : Bool
, settings : UiSettings
, selectedItems : ItemIds
}

View File

@ -0,0 +1,154 @@
{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Data.ItemIds exposing
( ItemIdChange
, ItemIds
, apply
, clearAll
, combine
, combineAll
, deselect
, empty
, fromSet
, isEmpty
, isMember
, noChange
, nonEmpty
, select
, selectAll
, size
, toList
, toQuery
, toggle
, union
)
import Data.ItemQuery exposing (ItemQuery)
import Set exposing (Set)
type ItemIds
= ItemIds (Set String)
empty : ItemIds
empty =
ItemIds Set.empty
isEmpty : ItemIds -> Bool
isEmpty (ItemIds ids) =
Set.isEmpty ids
nonEmpty : ItemIds -> Bool
nonEmpty ids =
not (isEmpty ids)
isMember : ItemIds -> String -> Bool
isMember (ItemIds ids) id =
Set.member id ids
size : ItemIds -> Int
size (ItemIds ids) =
Set.size ids
fromSet : Set String -> ItemIds
fromSet ids =
ItemIds ids
union : ItemIds -> ItemIds -> ItemIds
union (ItemIds ids1) (ItemIds ids2) =
ItemIds (Set.union ids1 ids2)
toList : ItemIds -> List String
toList (ItemIds ids) =
Set.toList ids
toQuery : ItemIds -> Maybe ItemQuery
toQuery (ItemIds ids) =
if Set.isEmpty ids then
Nothing
else
Just <| Data.ItemQuery.ItemIdIn (Set.toList ids)
--- Change item ids
type ItemIdChange
= ItemIdChange
{ remove : Set String
, add : Set String
, clear : Bool
}
apply : ItemIds -> ItemIdChange -> ItemIds
apply (ItemIds ids) (ItemIdChange { remove, add, clear }) =
if clear then
empty
else
ItemIds (Set.diff ids remove |> Set.union add)
noChange : ItemIdChange
noChange =
ItemIdChange { remove = Set.empty, add = Set.empty, clear = False }
combine : ItemIdChange -> ItemIdChange -> ItemIdChange
combine (ItemIdChange c1) (ItemIdChange c2) =
ItemIdChange
{ remove = Set.union c1.remove c2.remove
, add = Set.union c1.add c2.add
, clear = False
}
combineAll : List ItemIdChange -> ItemIdChange
combineAll all =
List.foldl combine noChange all
select : String -> ItemIdChange
select id =
ItemIdChange { add = Set.singleton id, remove = Set.empty, clear = False }
selectAll : Set String -> ItemIdChange
selectAll ids =
ItemIdChange { add = ids, remove = Set.empty, clear = False }
deselect : String -> ItemIdChange
deselect id =
ItemIdChange { add = Set.empty, remove = Set.singleton id, clear = False }
clearAll : ItemIdChange
clearAll =
ItemIdChange { add = Set.empty, remove = Set.empty, clear = True }
toggle : ItemIds -> String -> ItemIdChange
toggle ids id =
if isMember ids id then
deselect id
else
select id

View File

@ -11,12 +11,12 @@ module Data.ItemSelection exposing
, isSelected , isSelected
) )
import Set exposing (Set) import Data.ItemIds exposing (ItemIds)
type ItemSelection type ItemSelection
= Inactive = Inactive
| Active (Set String) | Active ItemIds
isSelected : String -> ItemSelection -> Bool isSelected : String -> ItemSelection -> Bool
@ -26,7 +26,7 @@ isSelected id set =
False False
Active ids -> Active ids ->
Set.member id ids Data.ItemIds.isMember ids id
isActive : ItemSelection -> Bool isActive : ItemSelection -> Bool

View File

@ -57,6 +57,8 @@ type alias Texts =
, mailSendSuccessful : String , mailSendSuccessful : String
, showQrCode : String , showQrCode : String
, close : String , close : String
, selectItem : String
, deselectItem : String
} }
@ -93,6 +95,8 @@ gb =
, mailSendSuccessful = "Mail sent." , mailSendSuccessful = "Mail sent."
, showQrCode = "Show URL as QR code" , showQrCode = "Show URL as QR code"
, close = "Close" , close = "Close"
, selectItem = "Select this item"
, deselectItem = "Deselect this item"
} }
@ -115,7 +119,7 @@ de =
, addMoreFiles = "Diesem Dokument weitere Dateien anfügen" , addMoreFiles = "Diesem Dokument weitere Dateien anfügen"
, confirmItemMetadata = "Metadaten bestätigen" , confirmItemMetadata = "Metadaten bestätigen"
, confirm = "Bestätige" , confirm = "Bestätige"
, unconfirmItemMetadata = "Widerrufe" , unconfirmItemMetadata = "Widerrufe Bestätigung"
, reprocessItem = "Das Dokument erneut verarbeiten" , reprocessItem = "Das Dokument erneut verarbeiten"
, deleteThisItem = "Das Dokument löschen" , deleteThisItem = "Das Dokument löschen"
, undeleteThisItem = "Das Dokument wiederherstellen" , undeleteThisItem = "Das Dokument wiederherstellen"
@ -129,4 +133,6 @@ de =
, mailSendSuccessful = "E-Mail wurde versendet." , mailSendSuccessful = "E-Mail wurde versendet."
, showQrCode = "Link als QR code anzeigen" , showQrCode = "Link als QR code anzeigen"
, close = "Schließen" , close = "Schließen"
, selectItem = "Zur Auswahl hinzufügen"
, deselectItem = "Aus Auswahl entfernen"
} }

View File

@ -64,7 +64,7 @@ de =
, chooseDirection = "Wähle eine Richtung" , chooseDirection = "Wähle eine Richtung"
, confirmUnconfirm = "Bestätige/Widerrufe Metadaten" , confirmUnconfirm = "Bestätige/Widerrufe Metadaten"
, confirm = "Bestätige" , confirm = "Bestätige"
, unconfirm = "Widerrufe" , unconfirm = "Widerrufe Bestätigung"
, changeTagMode = "Wechsel den Änderungsmodus für Tags" , changeTagMode = "Wechsel den Änderungsmodus für Tags"
, dueDateTab = "Fälligkeitsdatum" , dueDateTab = "Fälligkeitsdatum"
, direction = Messages.Data.Direction.de , direction = Messages.Data.Direction.de

View File

@ -50,6 +50,9 @@ type alias Texts =
, direction : Direction -> String , direction : Direction -> String
, trashcan : String , trashcan : String
, bookmarks : String , bookmarks : String
, selection : String
, showSelection : String
, clearSelection : String
} }
@ -84,6 +87,9 @@ gb =
, direction = Messages.Data.Direction.gb , direction = Messages.Data.Direction.gb
, trashcan = "Trash" , trashcan = "Trash"
, bookmarks = "Bookmarks" , bookmarks = "Bookmarks"
, selection = "Selection"
, showSelection = "Show selection"
, clearSelection = "Clear selection"
} }
@ -118,4 +124,7 @@ de =
, direction = Messages.Data.Direction.de , direction = Messages.Data.Direction.de
, trashcan = "Papierkorb" , trashcan = "Papierkorb"
, bookmarks = "Bookmarks" , bookmarks = "Bookmarks"
, selection = "Auswahl"
, showSelection = "Auswahl anzeigen"
, clearSelection = "Auswahl aufheben"
} }

View File

@ -17,6 +17,7 @@ import Browser.Dom as Dom
import Comp.ItemDetail import Comp.ItemDetail
import Comp.ItemDetail.Model import Comp.ItemDetail.Model
import Comp.LinkTarget exposing (LinkTarget) import Comp.LinkTarget exposing (LinkTarget)
import Data.ItemIds exposing (ItemIds)
import Http import Http
@ -45,4 +46,5 @@ type alias UpdateResult =
, sub : Sub Msg , sub : Sub Msg
, linkTarget : LinkTarget , linkTarget : LinkTarget
, removedItem : Maybe String , removedItem : Maybe String
, selectedItems : ItemIds
} }

View File

@ -8,29 +8,26 @@
module Page.ItemDetail.Update exposing (update) module Page.ItemDetail.Update exposing (update)
import Api import Api
import Browser.Navigation as Nav
import Comp.ItemDetail import Comp.ItemDetail
import Comp.ItemDetail.Model import Comp.ItemDetail.Model
import Comp.LinkTarget import Comp.LinkTarget
import Data.Flags exposing (Flags) import Data.Environment as Env
import Data.ItemIds
import Data.ItemNav exposing (ItemNav) import Data.ItemNav exposing (ItemNav)
import Data.UiSettings exposing (UiSettings)
import Page exposing (Page(..)) import Page exposing (Page(..))
import Page.ItemDetail.Data exposing (Model, Msg(..), UpdateResult) import Page.ItemDetail.Data exposing (Model, Msg(..), UpdateResult)
import Scroll import Scroll
import Task import Task
update : Nav.Key -> Flags -> ItemNav -> UiSettings -> Msg -> Model -> UpdateResult update : ItemNav -> Env.Update -> Msg -> Model -> UpdateResult
update key flags inav settings msg model = update inav env msg model =
case msg of case msg of
Init id -> Init id ->
let let
result = result =
Comp.ItemDetail.update key Comp.ItemDetail.update inav
flags env
inav
settings
Comp.ItemDetail.Model.Init Comp.ItemDetail.Model.Init
model.detail model.detail
@ -40,19 +37,20 @@ update key flags inav settings msg model =
{ model = { model | detail = result.model } { model = { model | detail = result.model }
, cmd = , cmd =
Cmd.batch Cmd.batch
[ Api.itemDetail flags id ItemResp [ Api.itemDetail env.flags id ItemResp
, Cmd.map ItemDetailMsg result.cmd , Cmd.map ItemDetailMsg result.cmd
, Task.attempt ScrollResult task , Task.attempt ScrollResult task
] ]
, sub = Sub.map ItemDetailMsg result.sub , sub = Sub.map ItemDetailMsg result.sub
, linkTarget = result.linkTarget , linkTarget = result.linkTarget
, removedItem = result.removedItem , removedItem = result.removedItem
, selectedItems = env.selectedItems
} }
ItemDetailMsg lmsg -> ItemDetailMsg lmsg ->
let let
result = result =
Comp.ItemDetail.update key flags inav settings lmsg model.detail Comp.ItemDetail.update inav env lmsg model.detail
pageSwitch = pageSwitch =
case result.linkTarget of case result.linkTarget of
@ -60,13 +58,14 @@ update key flags inav settings msg model =
Cmd.none Cmd.none
_ -> _ ->
Page.set key (SearchPage Nothing) Page.set env.key (SearchPage Nothing)
in in
{ model = { model | detail = result.model } { model = { model | detail = result.model }
, cmd = Cmd.batch [ pageSwitch, Cmd.map ItemDetailMsg result.cmd ] , cmd = Cmd.batch [ pageSwitch, Cmd.map ItemDetailMsg result.cmd ]
, sub = Sub.map ItemDetailMsg result.sub , sub = Sub.map ItemDetailMsg result.sub
, linkTarget = result.linkTarget , linkTarget = result.linkTarget
, removedItem = result.removedItem , removedItem = result.removedItem
, selectedItems = Data.ItemIds.apply env.selectedItems result.selectionChange
} }
ItemResp (Ok item) -> ItemResp (Ok item) ->
@ -74,17 +73,28 @@ update key flags inav settings msg model =
lmsg = lmsg =
Comp.ItemDetail.Model.SetItem item Comp.ItemDetail.Model.SetItem item
in in
update key flags inav settings (ItemDetailMsg lmsg) model update inav env (ItemDetailMsg lmsg) model
ItemResp (Err _) -> ItemResp (Err _) ->
UpdateResult model Cmd.none Sub.none Comp.LinkTarget.LinkNone Nothing unit env model
ScrollResult _ -> ScrollResult _ ->
UpdateResult model Cmd.none Sub.none Comp.LinkTarget.LinkNone Nothing unit env model
UiSettingsUpdated -> UiSettingsUpdated ->
let let
lmsg = lmsg =
ItemDetailMsg Comp.ItemDetail.Model.UiSettingsUpdated ItemDetailMsg Comp.ItemDetail.Model.UiSettingsUpdated
in in
update key flags inav settings lmsg model update inav env lmsg model
unit : Env.Update -> Model -> UpdateResult
unit env model =
{ model = model
, cmd = Cmd.none
, sub = Sub.none
, linkTarget = Comp.LinkTarget.LinkNone
, removedItem = Nothing
, selectedItems = env.selectedItems
}

View File

@ -12,6 +12,7 @@ import Comp.ItemDetail
import Comp.ItemDetail.EditForm import Comp.ItemDetail.EditForm
import Comp.ItemDetail.Model import Comp.ItemDetail.Model
import Comp.MenuBar as MB import Comp.MenuBar as MB
import Data.Environment as Env
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemNav exposing (ItemNav) import Data.ItemNav exposing (ItemNav)
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
@ -23,13 +24,13 @@ import Page.ItemDetail.Data exposing (..)
import Styles as S import Styles as S
viewSidebar : Texts -> Bool -> Flags -> UiSettings -> Model -> Html Msg viewSidebar : Texts -> Env.View -> Model -> Html Msg
viewSidebar texts visible flags settings model = viewSidebar texts env model =
div div
[ id "sidebar" [ id "sidebar"
, class S.sidebar , class S.sidebar
, class S.sidebarBg , class S.sidebarBg
, classList [ ( "hidden", not visible ) ] , classList [ ( "hidden", not env.sidebarVisible ) ]
] ]
[ div [ div
[ class S.header2 [ class S.header2
@ -57,16 +58,16 @@ viewSidebar texts visible flags settings model =
, sticky = True , sticky = True
} }
, Html.map ItemDetailMsg , Html.map ItemDetailMsg
(Comp.ItemDetail.EditForm.view2 texts.editForm flags settings model.detail) (Comp.ItemDetail.EditForm.view2 texts.editForm env.flags env.settings model.detail)
] ]
viewContent : Texts -> ItemNav -> Flags -> UiSettings -> Model -> Html Msg viewContent : Texts -> ItemNav -> Env.View -> Model -> Html Msg
viewContent texts inav flags settings model = viewContent texts inav env model =
div div
[ id "content" [ id "content"
, class S.content , class S.content
] ]
[ Html.map ItemDetailMsg [ Html.map ItemDetailMsg
(Comp.ItemDetail.view2 texts.itemDetail flags inav settings model.detail) (Comp.ItemDetail.view2 texts.itemDetail inav env model.detail)
] ]

View File

@ -42,6 +42,7 @@ import Comp.PublishItems
import Comp.SearchMenu import Comp.SearchMenu
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemArrange exposing (ItemArrange) import Data.ItemArrange exposing (ItemArrange)
import Data.ItemIds exposing (ItemIds)
import Data.ItemNav exposing (ItemNav) import Data.ItemNav exposing (ItemNav)
import Data.ItemQuery as Q import Data.ItemQuery as Q
import Data.Items import Data.Items
@ -84,8 +85,7 @@ type ConfirmModalValue
type alias SelectViewModel = type alias SelectViewModel =
{ ids : Set String { action : SelectActionMode
, action : SelectActionMode
, confirmModal : Maybe ConfirmModalValue , confirmModal : Maybe ConfirmModalValue
, editModel : Comp.ItemDetail.MultiEditMenu.Model , editModel : Comp.ItemDetail.MultiEditMenu.Model
, mergeModel : Comp.ItemMerge.Model , mergeModel : Comp.ItemMerge.Model
@ -97,8 +97,7 @@ type alias SelectViewModel =
initSelectViewModel : Flags -> SelectViewModel initSelectViewModel : Flags -> SelectViewModel
initSelectViewModel flags = initSelectViewModel flags =
{ ids = Set.empty { action = NoneAction
, action = NoneAction
, confirmModal = Nothing , confirmModal = Nothing
, editModel = Comp.ItemDetail.MultiEditMenu.init , editModel = Comp.ItemDetail.MultiEditMenu.init
, mergeModel = Comp.ItemMerge.init [] , mergeModel = Comp.ItemMerge.init []
@ -235,6 +234,7 @@ type Msg
| ToggleExpandCollapseRows | ToggleExpandCollapseRows
| ToggleBookmarkCurrentQueryView | ToggleBookmarkCurrentQueryView
| BookmarkQueryMsg Comp.BookmarkQueryManage.Msg | BookmarkQueryMsg Comp.BookmarkQueryManage.Msg
| ItemSelectionChanged
type SearchType type SearchType
@ -258,6 +258,7 @@ type alias SearchParam =
, pageSize : Int , pageSize : Int
, offset : Int , offset : Int
, scroll : Bool , scroll : Bool
, selectedItems : ItemIds
} }
@ -276,7 +277,7 @@ doSearchDefaultCmd param model =
let let
smask = smask =
Q.request model.searchMenuModel.searchMode <| Q.request model.searchMenuModel.searchMode <|
createQuery model createQuery param.selectedItems model
mask = mask =
{ smask { smask
@ -294,10 +295,10 @@ doSearchDefaultCmd param model =
Api.itemSearch param.flags mask ItemSearchAddResp Api.itemSearch param.flags mask ItemSearchAddResp
createQuery : Model -> Maybe Q.ItemQuery createQuery : ItemIds -> Model -> Maybe Q.ItemQuery
createQuery model = createQuery selectedItems model =
Q.and Q.and
[ Comp.SearchMenu.getItemQuery model.searchMenuModel [ Comp.SearchMenu.getItemQuery selectedItems model.searchMenuModel
, Maybe.map Q.Fragment (Comp.PowerSearchInput.getSearchString model.powerSearchInput) , Maybe.map Q.Fragment (Comp.PowerSearchInput.getSearchString model.powerSearchInput)
] ]

View File

@ -11,6 +11,7 @@ import Comp.Basic as B
import Comp.ItemDetail.MultiEditMenu import Comp.ItemDetail.MultiEditMenu
import Comp.MenuBar as MB import Comp.MenuBar as MB
import Comp.SearchMenu import Comp.SearchMenu
import Data.Environment as Env
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
import Html exposing (..) import Html exposing (..)
@ -22,8 +23,8 @@ import Set
import Styles as S import Styles as S
view : Texts -> Flags -> UiSettings -> Model -> Html Msg view : Texts -> Env.View -> Model -> Html Msg
view texts flags settings model = view texts env model =
div div
[ class "flex flex-col" [ class "flex flex-col"
] ]
@ -56,19 +57,19 @@ view texts flags settings model =
SelectView svm -> SelectView svm ->
case svm.action of case svm.action of
EditSelected -> EditSelected ->
viewEditMenu texts flags svm settings viewEditMenu texts env.flags svm env.settings
_ -> _ ->
viewSearch texts flags settings model viewSearch texts env model
_ -> _ ->
viewSearch texts flags settings model viewSearch texts env model
) )
] ]
viewSearch : Texts -> Flags -> UiSettings -> Model -> List (Html Msg) viewSearch : Texts -> Env.View -> Model -> List (Html Msg)
viewSearch texts flags settings model = viewSearch texts env model =
[ MB.viewSide [ MB.viewSide
{ start = { start =
[ MB.CustomElement <| [ MB.CustomElement <|
@ -87,14 +88,15 @@ viewSearch texts flags settings model =
, let , let
searchMenuCfg = searchMenuCfg =
{ overrideTabLook = \_ -> identity { overrideTabLook = \_ -> identity
, selectedItems = env.selectedItems
} }
in in
Html.map SearchMenuMsg Html.map SearchMenuMsg
(Comp.SearchMenu.viewDrop2 texts.searchMenu (Comp.SearchMenu.viewDrop2 texts.searchMenu
model.dragDropData model.dragDropData
flags env.flags
searchMenuCfg searchMenuCfg
settings env.settings
model.searchMenuModel model.searchMenuModel
) )
] ]

File diff suppressed because it is too large Load Diff

View File

@ -18,9 +18,11 @@ import Comp.PowerSearchInput
import Comp.PublishItems import Comp.PublishItems
import Comp.SearchMenu import Comp.SearchMenu
import Comp.SearchStatsView import Comp.SearchStatsView
import Data.Environment as Env
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.Icons as Icons import Data.Icons as Icons
import Data.ItemArrange import Data.ItemArrange
import Data.ItemIds exposing (ItemIds)
import Data.ItemSelection import Data.ItemSelection
import Data.SearchMode import Data.SearchMode
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
@ -36,27 +38,27 @@ import Styles as S
import Util.Html import Util.Html
viewSidebar : Texts -> Bool -> Flags -> UiSettings -> Model -> Html Msg viewSidebar : Texts -> Env.View -> Model -> Html Msg
viewSidebar texts visible flags settings model = viewSidebar texts env model =
div div
[ id "sidebar" [ id "sidebar"
, class S.sidebar , class S.sidebar
, class S.sidebarBg , class S.sidebarBg
, classList [ ( "hidden", not visible ) ] , classList [ ( "hidden", not env.sidebarVisible ) ]
] ]
[ Page.Search.SideMenu.view texts.sideMenu flags settings model [ Page.Search.SideMenu.view texts.sideMenu env model
] ]
viewContent : Texts -> Flags -> UiSettings -> Model -> Html Msg viewContent : Texts -> Env.View -> Model -> Html Msg
viewContent texts flags settings model = viewContent texts env model =
div div
[ id "item-card-list" -- this id is used in scroll-to-card [ id "item-card-list" -- this id is used in scroll-to-card
, class S.content , class S.content
] ]
(searchStats texts flags settings model (searchStats texts env.flags env.settings model
++ itemsBar texts flags settings model ++ itemsBar texts env model
++ mainView texts flags settings model ++ mainView texts env model
++ confirmModal texts model ++ confirmModal texts model
) )
@ -65,8 +67,8 @@ viewContent texts flags settings model =
--- Helpers --- Helpers
mainView : Texts -> Flags -> UiSettings -> Model -> List (Html Msg) mainView : Texts -> Env.View -> Model -> List (Html Msg)
mainView texts flags settings model = mainView texts env model =
let let
otherView = otherView =
case model.viewMode of case model.viewMode of
@ -75,13 +77,13 @@ mainView texts flags settings model =
MergeSelected -> MergeSelected ->
Just Just
[ div [ class "sm:relative mb-2" ] [ div [ class "sm:relative mb-2" ]
(itemMergeView texts settings svm) (itemMergeView texts env.settings svm)
] ]
PublishSelected -> PublishSelected ->
Just Just
[ div [ class "sm:relative mb-2" ] [ div [ class "sm:relative mb-2" ]
(itemPublishView texts settings flags svm) (itemPublishView texts env.settings env.flags svm)
] ]
_ -> _ ->
@ -90,7 +92,7 @@ mainView texts flags settings model =
PublishView pm -> PublishView pm ->
Just Just
[ div [ class "sm:relative mb-2" ] [ div [ class "sm:relative mb-2" ]
(publishResults texts settings flags model pm) (publishResults texts env.settings env.flags model pm)
] ]
SearchView -> SearchView ->
@ -101,8 +103,8 @@ mainView texts flags settings model =
body body
Nothing -> Nothing ->
bookmarkQueryWidget texts settings flags model bookmarkQueryWidget texts env.settings env.flags model
++ itemCardList texts flags settings model ++ itemCardList texts env model
bookmarkQueryWidget : Texts -> UiSettings -> Flags -> Model -> List (Html Msg) bookmarkQueryWidget : Texts -> UiSettings -> Flags -> Model -> List (Html Msg)
@ -182,21 +184,21 @@ confirmModal texts model =
[] []
itemsBar : Texts -> Flags -> UiSettings -> Model -> List (Html Msg) itemsBar : Texts -> Env.View -> Model -> List (Html Msg)
itemsBar texts flags settings model = itemsBar texts env model =
case model.viewMode of case model.viewMode of
SearchView -> SearchView ->
[ defaultMenuBar texts flags settings model ] [ defaultMenuBar texts env model ]
SelectView svm -> SelectView svm ->
[ editMenuBar texts model svm ] [ editMenuBar texts model env.selectedItems svm ]
PublishView _ -> PublishView _ ->
[ defaultMenuBar texts flags settings model ] [ defaultMenuBar texts env model ]
defaultMenuBar : Texts -> Flags -> UiSettings -> Model -> Html Msg defaultMenuBar : Texts -> Env.View -> Model -> Html Msg
defaultMenuBar texts flags settings model = defaultMenuBar texts env model =
let let
btnStyle = btnStyle =
S.secondaryBasicButton ++ " text-sm" S.secondaryBasicButton ++ " text-sm"
@ -224,7 +226,7 @@ defaultMenuBar texts flags settings model =
|> Maybe.withDefault (value "") |> Maybe.withDefault (value "")
, class (String.replace "rounded" "" S.textInput) , class (String.replace "rounded" "" S.textInput)
, class "py-2 text-sm" , class "py-2 text-sm"
, if flags.config.fullTextSearchEnabled then , if env.flags.config.fullTextSearchEnabled then
class " border-r-0 rounded-l" class " border-r-0 rounded-l"
else else
@ -235,7 +237,7 @@ defaultMenuBar texts flags settings model =
[ class S.secondaryBasicButtonPlain [ class S.secondaryBasicButtonPlain
, class "text-sm px-4 py-2 border rounded-r" , class "text-sm px-4 py-2 border rounded-r"
, classList , classList
[ ( "hidden", not flags.config.fullTextSearchEnabled ) [ ( "hidden", not env.flags.config.fullTextSearchEnabled )
] ]
, href "#" , href "#"
, onClick ToggleSearchType , onClick ToggleSearchType
@ -258,10 +260,10 @@ defaultMenuBar texts flags settings model =
] ]
isCardView = isCardView =
settings.itemSearchArrange == Data.ItemArrange.Cards env.settings.itemSearchArrange == Data.ItemArrange.Cards
isListView = isListView =
settings.itemSearchArrange == Data.ItemArrange.List env.settings.itemSearchArrange == Data.ItemArrange.List
menuSep = menuSep =
{ icon = i [] [] { icon = i [] []
@ -274,7 +276,7 @@ defaultMenuBar texts flags settings model =
MB.view MB.view
{ start = { start =
[ MB.CustomElement <| [ MB.CustomElement <|
if settings.powerSearchEnabled then if env.settings.powerSearchEnabled then
powerSearchBar powerSearchBar
else else
@ -314,7 +316,7 @@ defaultMenuBar texts flags settings model =
, menuOpen = model.viewMenuOpen , menuOpen = model.viewMenuOpen
, items = , items =
[ { icon = [ { icon =
if settings.itemSearchShowGroups then if env.settings.itemSearchShowGroups then
i [ class "fa fa-check-square font-thin" ] [] i [ class "fa fa-check-square font-thin" ] []
else else
@ -368,16 +370,16 @@ defaultMenuBar texts flags settings model =
, menuSep , menuSep
, { label = texts.shareResults , { label = texts.shareResults
, icon = Icons.shareIcon "" , icon = Icons.shareIcon ""
, disabled = createQuery model == Nothing , disabled = createQuery env.selectedItems model == Nothing
, attrs = , attrs =
[ title <| [ title <|
if createQuery model == Nothing then if createQuery env.selectedItems model == Nothing then
texts.nothingSelectedToShare texts.nothingSelectedToShare
else else
texts.publishCurrentQueryTitle texts.publishCurrentQueryTitle
, href "#" , href "#"
, if createQuery model == Nothing then , if createQuery env.selectedItems model == Nothing then
class "" class ""
else else
@ -386,16 +388,16 @@ defaultMenuBar texts flags settings model =
} }
, { label = texts.bookmarkQuery , { label = texts.bookmarkQuery
, icon = i [ class "fa fa-bookmark" ] [] , icon = i [ class "fa fa-bookmark" ] []
, disabled = createQuery model == Nothing , disabled = createQuery env.selectedItems model == Nothing
, attrs = , attrs =
[ title <| [ title <|
if createQuery model == Nothing then if createQuery env.selectedItems model == Nothing then
texts.nothingToBookmark texts.nothingToBookmark
else else
texts.bookmarkQuery texts.bookmarkQuery
, href "#" , href "#"
, if createQuery model == Nothing then , if createQuery env.selectedItems model == Nothing then
class "" class ""
else else
@ -403,7 +405,7 @@ defaultMenuBar texts flags settings model =
] ]
} }
, { label = , { label =
if settings.cardPreviewFullWidth then if env.settings.cardPreviewFullWidth then
texts.fullHeightPreviewTitle texts.fullHeightPreviewTitle
else else
@ -415,7 +417,7 @@ defaultMenuBar texts flags settings model =
, onClick TogglePreviewFullWidth , onClick TogglePreviewFullWidth
, classList , classList
[ ( "hidden sm:inline-block", False ) [ ( "hidden sm:inline-block", False )
, ( "bg-gray-200 dark:bg-slate-600", settings.cardPreviewFullWidth ) , ( "bg-gray-200 dark:bg-slate-600", env.settings.cardPreviewFullWidth )
] ]
] ]
} }
@ -427,11 +429,11 @@ defaultMenuBar texts flags settings model =
} }
editMenuBar : Texts -> Model -> SelectViewModel -> Html Msg editMenuBar : Texts -> Model -> ItemIds -> SelectViewModel -> Html Msg
editMenuBar texts model svm = editMenuBar texts model selectedItems svm =
let let
selectCount = selectCount =
Set.size svm.ids Data.ItemIds.size selectedItems
btnStyle = btnStyle =
S.secondaryBasicButton ++ " text-sm" S.secondaryBasicButton ++ " text-sm"
@ -565,8 +567,8 @@ searchStats texts _ settings model =
[] []
itemCardList : Texts -> Flags -> UiSettings -> Model -> List (Html Msg) itemCardList : Texts -> Env.View -> Model -> List (Html Msg)
itemCardList texts flags settings model = itemCardList texts env model =
let let
previewUrl attach = previewUrl attach =
Api.attachmentPreviewURL attach.id Api.attachmentPreviewURL attach.id
@ -581,15 +583,15 @@ itemCardList texts flags settings model =
, previewUrlFallback = previewUrlFallback , previewUrlFallback = previewUrlFallback
, attachUrl = .id >> Api.fileURL , attachUrl = .id >> Api.fileURL
, detailPage = .id >> ItemDetailPage , detailPage = .id >> ItemDetailPage
, arrange = settings.itemSearchArrange , arrange = env.settings.itemSearchArrange
, showGroups = settings.itemSearchShowGroups , showGroups = env.settings.itemSearchShowGroups
, rowOpen = \id -> Set.member "all" model.itemRowsOpen || Set.member id model.itemRowsOpen , rowOpen = \id -> Set.member "all" model.itemRowsOpen || Set.member id model.itemRowsOpen
} }
itemViewCfg = itemViewCfg =
case model.viewMode of case model.viewMode of
SelectView svm -> SelectView _ ->
viewCfg (Data.ItemSelection.Active svm.ids) viewCfg (Data.ItemSelection.Active env.selectedItems)
_ -> _ ->
viewCfg Data.ItemSelection.Inactive viewCfg Data.ItemSelection.Inactive
@ -597,11 +599,11 @@ itemCardList texts flags settings model =
[ Html.map ItemCardListMsg [ Html.map ItemCardListMsg
(Comp.ItemCardList.view texts.itemCardList (Comp.ItemCardList.view texts.itemCardList
itemViewCfg itemViewCfg
settings env.settings
flags env.flags
model.itemListModel model.itemListModel
) )
, loadMore texts settings model , loadMore texts env.settings model
] ]

View File

@ -10,6 +10,7 @@ module Page.Share.Sidebar exposing (..)
import Comp.SearchMenu import Comp.SearchMenu
import Comp.Tabs import Comp.Tabs
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemIds
import Html exposing (..) import Html exposing (..)
import Html.Attributes exposing (..) import Html.Attributes exposing (..)
import Messages.Page.Share exposing (Texts) import Messages.Page.Share exposing (Texts)
@ -30,6 +31,7 @@ view texts flags model =
searchMenuCfg = searchMenuCfg =
{ overrideTabLook = hideTrashTab { overrideTabLook = hideTrashTab
, selectedItems = Data.ItemIds.empty
} }
in in
div div

View File

@ -14,6 +14,7 @@ import Comp.PowerSearchInput
import Comp.SearchMenu import Comp.SearchMenu
import Comp.SharePasswordForm import Comp.SharePasswordForm
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.ItemIds
import Data.ItemQuery as Q import Data.ItemQuery as Q
import Data.SearchMode import Data.SearchMode
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
@ -262,7 +263,7 @@ makeSearchCmd flags doInit model =
let let
xq = xq =
Q.and Q.and
[ Comp.SearchMenu.getItemQuery model.searchMenuModel [ Comp.SearchMenu.getItemQuery Data.ItemIds.empty model.searchMenuModel
, Maybe.map Q.Fragment <| , Maybe.map Q.Fragment <|
case model.searchMode of case model.searchMode of
SearchBarNormal -> SearchBarNormal ->

View File

@ -189,6 +189,26 @@ secondaryButtonHover =
" hover:bg-gray-400 dark:hover:bg-slate-300 " " hover:bg-gray-400 dark:hover:bg-slate-300 "
--- Secondary Basic Button
secondaryBasicButtonNoColor : String
secondaryBasicButtonNoColor =
" my-auto whitespace-nowrap text-center shadow-none focus:outline-none focus:ring focus:ring-opacity-75 "
secondaryBasicButtonMain : String
secondaryBasicButtonMain =
secondaryBasicButtonNoColor
++ " border-gray-500 dark:border-slate-500 text-gray-500 dark:text-slate-400 "
secondaryBasicButtonHover : String
secondaryBasicButtonHover =
" hover:bg-gray-600 hover:text-white dark:hover:text-white dark:hover:bg-slate-500 dark:hover:text-slate-100 "
secondaryBasicButton : String secondaryBasicButton : String
secondaryBasicButton = secondaryBasicButton =
secondaryBasicButtonRounded ++ secondaryBasicButtonPlain secondaryBasicButtonRounded ++ secondaryBasicButtonPlain
@ -205,20 +225,6 @@ secondaryBasicButtonRounded =
--- Secondary Basic Button
secondaryBasicButtonMain : String
secondaryBasicButtonMain =
" my-auto whitespace-nowrap border-gray-500 dark:border-slate-500 text-gray-500 dark:text-slate-400 text-center shadow-none focus:outline-none focus:ring focus:ring-opacity-75 "
secondaryBasicButtonHover : String
secondaryBasicButtonHover =
" hover:bg-gray-600 hover:text-white dark:hover:text-white dark:hover:bg-slate-500 dark:hover:text-slate-100 "
--- Delete Button --- Delete Button
@ -248,6 +254,18 @@ deleteLabel =
--- Green Button
greenButton : String
greenButton =
secondaryBasicButtonNoColor
++ secondaryBasicButtonRounded
++ " dark:bg-lime-600 dark:bg-opacity-30 dark:border-lime-600 dark:text-lime-400 "
++ " bg-lime-600 border-lime-600 text-white"
--- Others --- Others