diff --git a/mattermost/bathroom.tar.gz b/mattermost/bathroom.tar.gz index 0b66090..837ffaf 100644 --- a/mattermost/bathroom.tar.gz +++ b/mattermost/bathroom.tar.gz Binary files differ diff --git a/mattermost/bathroom.tar.gz b/mattermost/bathroom.tar.gz index 0b66090..837ffaf 100644 --- a/mattermost/bathroom.tar.gz +++ b/mattermost/bathroom.tar.gz Binary files differ diff --git a/mattermost/install_deps.sh b/mattermost/install_deps.sh old mode 100644 new mode 100755 diff --git a/mattermost/bathroom.tar.gz b/mattermost/bathroom.tar.gz index 0b66090..837ffaf 100644 --- a/mattermost/bathroom.tar.gz +++ b/mattermost/bathroom.tar.gz Binary files differ diff --git a/mattermost/install_deps.sh b/mattermost/install_deps.sh old mode 100644 new mode 100755 diff --git a/mattermost/webapp/dist/main.js b/mattermost/webapp/dist/main.js index adb6cdf..f3720a1 100644 --- a/mattermost/webapp/dist/main.js +++ b/mattermost/webapp/dist/main.js @@ -103,6 +103,10 @@ class BathroomComponent extends _react.default.Component { constructor(props) { super(props); + this.hostTable = _react.default.createRef(); + this.headerLeft = _react.default.createRef(); + this.headerCenter = _react.default.createRef(); + this.headerRight = _react.default.createRef(); this.state = { doors: {} }; @@ -111,6 +115,7 @@ componentDidMount() { this.getSettings(); + this.resizeTable(); } async getSettings() { @@ -149,9 +154,67 @@ render() { if (!this.state.doors) return; + var borderString = "1px solid " + this.props.theme.sidebarText; + + var Host = props => _react.default.createElement("div", { + style: { + "text-align": "center", + width: "100%", + "padding-top": "5px" + } + }, _react.default.createElement("table", { + ref: this.hostTable, + style: { + "border-collapse": "collapse", + "margin-left": "auto", + "margin-right": "auto" + } + }, _react.default.createElement("tr", null, _react.default.createElement("td", { + ref: this.headerLeft, + style: { + "border-bottom": borderString, + "height": "11px" + } + }), _react.default.createElement("td", { + ref: this.headerCenter, + rowspan: 2, + style: { + "width": "22px", + "text-align": "center" + } + }, _react.default.createElement("img", { + src: props.icon, + style: { + "width": "18px" + } + })), _react.default.createElement("td", { + ref: this.headerRight, + style: { + "border-bottom": borderString + } + })), _react.default.createElement("tr", null, _react.default.createElement("td", { + style: { + "border-left": borderString + } + }), _react.default.createElement("td", { + style: { + "border-right": borderString + } + })), _react.default.createElement("tr", null, _react.default.createElement("td", { + colspan: 3, + style: { + "text-align": "center", + "border-left": borderString, + "border-right": borderString, + "border-bottom": borderString + } + }, props.content)))); + var columns = 6; var keys = Object.keys(this.state.doors).sort(); - var width = Math.floor(100 / (columns + 1)) + "%"; + var width = Math.floor(100 / columns + /*+ 1*/ + ) + "%"; var widthPx = "23px"; var elems = []; var row = []; @@ -191,41 +254,45 @@ }, img)); if (i % columns == columns - 1 || i == keys.length - 1) { - if (rows == 0) { - row.unshift( // - _react.default.createElement("td", { - rowspan: totalRows, - width: widthPx, - style: { - "color": this.props.theme.sidebarText, - "padding-right": "5px" - } - }, _react.default.createElement(IconImg, { - src: this.settings.info_icon - }), ":")); + /* + if (rows == 0) + { + row.unshift( + // + : + ); } - - elems.push(_react.default.createElement("tr", null, [...row])); + */ + elems.push(_react.default.createElement("tr", { + style: { + "height": "15px" + } + }, [...row])); row.length = 0; rows++; } } - return (// - _react.default.createElement("div", { - style: { - "text-align": "center", - width: "100%", - "padding-top": "10px" - } - }, _react.default.createElement("table", { - style: { - "margin-left": "auto", - "margin-right": "auto", - "border": "1px solid " + this.props.theme.sidebarText - } - }, elems)) - ); + var content = _react.default.createElement("table", { + style: { + "margin": "5px", + "margin-left": "auto", + "margin-right": "auto" + } + }, elems); + + return _react.default.createElement(Host, { + content: content, + icon: this.settings.info_icon + }); + } + + componentDidUpdate() { + this.resizeTable(); + } + + resizeTable() { + this.headerLeft.current.width = this.headerRight.current.width = Math.max(50, (this.hostTable.current.clientWidth - this.headerCenter.current.clientWidth) / 2); } } diff --git a/mattermost/bathroom.tar.gz b/mattermost/bathroom.tar.gz index 0b66090..837ffaf 100644 --- a/mattermost/bathroom.tar.gz +++ b/mattermost/bathroom.tar.gz Binary files differ diff --git a/mattermost/install_deps.sh b/mattermost/install_deps.sh old mode 100644 new mode 100755 diff --git a/mattermost/webapp/dist/main.js b/mattermost/webapp/dist/main.js index adb6cdf..f3720a1 100644 --- a/mattermost/webapp/dist/main.js +++ b/mattermost/webapp/dist/main.js @@ -103,6 +103,10 @@ class BathroomComponent extends _react.default.Component { constructor(props) { super(props); + this.hostTable = _react.default.createRef(); + this.headerLeft = _react.default.createRef(); + this.headerCenter = _react.default.createRef(); + this.headerRight = _react.default.createRef(); this.state = { doors: {} }; @@ -111,6 +115,7 @@ componentDidMount() { this.getSettings(); + this.resizeTable(); } async getSettings() { @@ -149,9 +154,67 @@ render() { if (!this.state.doors) return; + var borderString = "1px solid " + this.props.theme.sidebarText; + + var Host = props => _react.default.createElement("div", { + style: { + "text-align": "center", + width: "100%", + "padding-top": "5px" + } + }, _react.default.createElement("table", { + ref: this.hostTable, + style: { + "border-collapse": "collapse", + "margin-left": "auto", + "margin-right": "auto" + } + }, _react.default.createElement("tr", null, _react.default.createElement("td", { + ref: this.headerLeft, + style: { + "border-bottom": borderString, + "height": "11px" + } + }), _react.default.createElement("td", { + ref: this.headerCenter, + rowspan: 2, + style: { + "width": "22px", + "text-align": "center" + } + }, _react.default.createElement("img", { + src: props.icon, + style: { + "width": "18px" + } + })), _react.default.createElement("td", { + ref: this.headerRight, + style: { + "border-bottom": borderString + } + })), _react.default.createElement("tr", null, _react.default.createElement("td", { + style: { + "border-left": borderString + } + }), _react.default.createElement("td", { + style: { + "border-right": borderString + } + })), _react.default.createElement("tr", null, _react.default.createElement("td", { + colspan: 3, + style: { + "text-align": "center", + "border-left": borderString, + "border-right": borderString, + "border-bottom": borderString + } + }, props.content)))); + var columns = 6; var keys = Object.keys(this.state.doors).sort(); - var width = Math.floor(100 / (columns + 1)) + "%"; + var width = Math.floor(100 / columns + /*+ 1*/ + ) + "%"; var widthPx = "23px"; var elems = []; var row = []; @@ -191,41 +254,45 @@ }, img)); if (i % columns == columns - 1 || i == keys.length - 1) { - if (rows == 0) { - row.unshift( // - _react.default.createElement("td", { - rowspan: totalRows, - width: widthPx, - style: { - "color": this.props.theme.sidebarText, - "padding-right": "5px" - } - }, _react.default.createElement(IconImg, { - src: this.settings.info_icon - }), ":")); + /* + if (rows == 0) + { + row.unshift( + // + + ); } - - elems.push(_react.default.createElement("tr", null, [...row])); + */ + elems.push(_react.default.createElement("tr", { + style: { + "height": "15px" + } + }, [...row])); row.length = 0; rows++; } } - return (//
:
- _react.default.createElement("div", { - style: { - "text-align": "center", - width: "100%", - "padding-top": "10px" - } - }, _react.default.createElement("table", { - style: { - "margin-left": "auto", - "margin-right": "auto", - "border": "1px solid " + this.props.theme.sidebarText - } - }, elems)) - ); + var content = _react.default.createElement("table", { + style: { + "margin": "5px", + "margin-left": "auto", + "margin-right": "auto" + } + }, elems); + + return _react.default.createElement(Host, { + content: content, + icon: this.settings.info_icon + }); + } + + componentDidUpdate() { + this.resizeTable(); + } + + resizeTable() { + this.headerLeft.current.width = this.headerRight.current.width = Math.max(50, (this.hostTable.current.clientWidth - this.headerCenter.current.clientWidth) / 2); } } diff --git a/mattermost/webapp/dist/main.js.map b/mattermost/webapp/dist/main.js.map index 99ecff9..8abc908 100644 --- a/mattermost/webapp/dist/main.js.map +++ b/mattermost/webapp/dist/main.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/index.jsx","webpack:///external \"React\""],"names":["BathroomComponent","React","Component","constructor","props","state","doors","settings","componentDidMount","getSettings","url","window","location","origin","res","fetch","json","e","console","log","setTimeout","bind","Registry","registerWebSocketEventHandler","updateDoors","componentWillUnmount","unregisterWebSocketEventHandler","msg","setState","render","columns","keys","Object","sort","width","Math","floor","widthPx","elems","row","rows","IconImg","src","title","totalRows","length","i","img","key","door","imgFile","push","unshift","theme","sidebarText","info_icon","Store","BathroomMonitorPlugin","initialize","registry","store","registerLeftSidebarHeaderComponent","registerPlugin"],"mappings":"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","file":"main.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","import React from 'react';\n\nclass BathroomComponent extends React.Component\n{\n constructor(props)\n {\n super(props);\n this.state = {doors:{}};\n this.settings = {};\n }\n componentDidMount()\n {\n this.getSettings();\n }\n async getSettings()\n {\n try\n {\n\n var url = window.location.origin + \"/plugins/com.mattermost.bathroom/settings\";\n var res = await fetch(url);\n this.settings = await res.json();\n }\n catch (e)\n {\n console.log(e);\n setTimeout(this.getSettings.bind(this), 5000);\n return;\n }\n\n Registry.registerWebSocketEventHandler(\"custom_com.mattermost.bathroom_updated\", this.updateDoors.bind(this));\n this.updateDoors();\n }\n componentWillUnmount()\n {\n Registry.unregisterWebSocketEventHandler(\"custom_com.mattermost.bathroom_updated\");\n }\n async updateDoors(msg)\n {\n //var url = Store.getState().entities.general.config.SiteURL + \"/plugins/com.mattermost.bathroom/status\";\n try\n {\n var url = window.location.origin + \"/plugins/com.mattermost.bathroom/status\";\n var res = await fetch(url);\n var json = await res.json();\n this.setState({\"doors\":json});\n }\n catch (e)\n {\n console.log(e);\n setTimeout(this.updateDoors.bind(this), 3000);\n }\n }\n render()\n {\n if (!this.state.doors) return;\n var columns = 6;\n var keys = Object.keys(this.state.doors).sort();\n var width = Math.floor(100 / (columns + 1)) + \"%\";\n var widthPx = \"23px\";\n var elems = [];\n var row = [];\n var rows = 0;\n var IconImg = props => ;\n var totalRows = Math.floor(keys.length / columns) + 1;\n for (var i = 0; i < keys.length /*(Math.floor(keys.length / 6) + 1) * 6*/; i++)\n {\n var img = null;\n if (i < keys.length)\n {\n var key = keys[i];\n var door = this.state.doors[key];\n var imgFile = this.settings[door + \"_icon\"];\n if (imgFile)\n {\n img = ;\n //img = \n }\n }\n row.push();\n if (i % columns == columns - 1 || i == keys.length - 1)\n {\n if (rows == 0)\n {\n row.unshift(\n //\n \n );\n }\n elems.push({[...row]});\n row.length = 0;\n rows++;\n }\n }\n return (\n //
{img}:
\n
\n
\n {elems}\n
\n \n );\n }\n}\n\nvar Registry = null;\nvar Store = null;\n\nclass BathroomMonitorPlugin\n{\n initialize(registry, store)\n {\n Registry = registry;\n Store = store;\n registry.registerLeftSidebarHeaderComponent(BathroomComponent);\n }\n}\n\nwindow.registerPlugin('com.mattermost.bathroom', new BathroomMonitorPlugin());\n","module.exports = React;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/index.jsx","webpack:///external \"React\""],"names":["BathroomComponent","React","Component","constructor","props","hostTable","createRef","headerLeft","headerCenter","headerRight","state","doors","settings","componentDidMount","getSettings","resizeTable","url","window","location","origin","res","fetch","json","e","console","log","setTimeout","bind","Registry","registerWebSocketEventHandler","updateDoors","componentWillUnmount","unregisterWebSocketEventHandler","msg","setState","render","borderString","theme","sidebarText","Host","width","icon","content","columns","keys","Object","sort","Math","floor","widthPx","elems","row","rows","IconImg","src","title","totalRows","length","i","img","key","door","imgFile","push","info_icon","componentDidUpdate","current","max","clientWidth","Store","BathroomMonitorPlugin","initialize","registry","store","registerLeftSidebarHeaderComponent","registerPlugin"],"mappings":"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","file":"main.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","import React from 'react';\n\nclass BathroomComponent extends React.Component\n{\n constructor(props)\n {\n super(props);\n\n this.hostTable = React.createRef();\n this.headerLeft = React.createRef();\n this.headerCenter = React.createRef();\n this.headerRight = React.createRef();\n this.state = {doors:{}};\n this.settings = {};\n }\n componentDidMount()\n {\n this.getSettings();\n this.resizeTable();\n }\n async getSettings()\n {\n try\n {\n\n var url = window.location.origin + \"/plugins/com.mattermost.bathroom/settings\";\n var res = await fetch(url);\n this.settings = await res.json();\n }\n catch (e)\n {\n console.log(e);\n setTimeout(this.getSettings.bind(this), 5000);\n return;\n }\n\n Registry.registerWebSocketEventHandler(\"custom_com.mattermost.bathroom_updated\", this.updateDoors.bind(this));\n this.updateDoors();\n }\n componentWillUnmount()\n {\n Registry.unregisterWebSocketEventHandler(\"custom_com.mattermost.bathroom_updated\");\n }\n async updateDoors(msg)\n {\n //var url = Store.getState().entities.general.config.SiteURL + \"/plugins/com.mattermost.bathroom/status\";\n try\n {\n var url = window.location.origin + \"/plugins/com.mattermost.bathroom/status\";\n var res = await fetch(url);\n var json = await res.json();\n this.setState({\"doors\":json});\n }\n catch (e)\n {\n console.log(e);\n setTimeout(this.updateDoors.bind(this), 3000);\n }\n }\n render()\n {\n if (!this.state.doors) return;\n\n var borderString = \"1px solid \" + this.props.theme.sidebarText;\n\n var Host = props =>\n
\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n
{props.content}
\n
;\n\n var columns = 6;\n var keys = Object.keys(this.state.doors).sort();\n var width = Math.floor(100 / (columns /*+ 1*/)) + \"%\";\n var widthPx = \"23px\";\n var elems = [];\n var row = [];\n var rows = 0;\n var IconImg = props => ;\n var totalRows = Math.floor(keys.length / columns) + 1;\n for (var i = 0; i < keys.length /*(Math.floor(keys.length / 6) + 1) * 6*/; i++)\n {\n var img = null;\n if (i < keys.length)\n {\n var key = keys[i];\n var door = this.state.doors[key];\n var imgFile = this.settings[door + \"_icon\"];\n if (imgFile)\n {\n img = ;\n //img = \n }\n }\n row.push({img});\n if (i % columns == columns - 1 || i == keys.length - 1)\n {\n /*\n if (rows == 0)\n {\n row.unshift(\n //\n :\n );\n }\n */\n elems.push({[...row]});\n row.length = 0;\n rows++;\n }\n }\n var content =\n \n {elems}\n
\n return ;\n }\n componentDidUpdate()\n {\n this.resizeTable();\n }\n resizeTable()\n {\n this.headerLeft.current.width = this.headerRight.current.width = Math.max(50, (this.hostTable.current.clientWidth - this.headerCenter.current.clientWidth) / 2);\n }\n}\n\nvar Registry = null;\nvar Store = null;\n\nclass BathroomMonitorPlugin\n{\n initialize(registry, store)\n {\n Registry = registry;\n Store = store;\n registry.registerLeftSidebarHeaderComponent(BathroomComponent);\n }\n}\n\nwindow.registerPlugin('com.mattermost.bathroom', new BathroomMonitorPlugin());\n","module.exports = React;"],"sourceRoot":""} \ No newline at end of file diff --git a/mattermost/bathroom.tar.gz b/mattermost/bathroom.tar.gz index 0b66090..837ffaf 100644 --- a/mattermost/bathroom.tar.gz +++ b/mattermost/bathroom.tar.gz Binary files differ diff --git a/mattermost/install_deps.sh b/mattermost/install_deps.sh old mode 100644 new mode 100755 diff --git a/mattermost/webapp/dist/main.js b/mattermost/webapp/dist/main.js index adb6cdf..f3720a1 100644 --- a/mattermost/webapp/dist/main.js +++ b/mattermost/webapp/dist/main.js @@ -103,6 +103,10 @@ class BathroomComponent extends _react.default.Component { constructor(props) { super(props); + this.hostTable = _react.default.createRef(); + this.headerLeft = _react.default.createRef(); + this.headerCenter = _react.default.createRef(); + this.headerRight = _react.default.createRef(); this.state = { doors: {} }; @@ -111,6 +115,7 @@ componentDidMount() { this.getSettings(); + this.resizeTable(); } async getSettings() { @@ -149,9 +154,67 @@ render() { if (!this.state.doors) return; + var borderString = "1px solid " + this.props.theme.sidebarText; + + var Host = props => _react.default.createElement("div", { + style: { + "text-align": "center", + width: "100%", + "padding-top": "5px" + } + }, _react.default.createElement("table", { + ref: this.hostTable, + style: { + "border-collapse": "collapse", + "margin-left": "auto", + "margin-right": "auto" + } + }, _react.default.createElement("tr", null, _react.default.createElement("td", { + ref: this.headerLeft, + style: { + "border-bottom": borderString, + "height": "11px" + } + }), _react.default.createElement("td", { + ref: this.headerCenter, + rowspan: 2, + style: { + "width": "22px", + "text-align": "center" + } + }, _react.default.createElement("img", { + src: props.icon, + style: { + "width": "18px" + } + })), _react.default.createElement("td", { + ref: this.headerRight, + style: { + "border-bottom": borderString + } + })), _react.default.createElement("tr", null, _react.default.createElement("td", { + style: { + "border-left": borderString + } + }), _react.default.createElement("td", { + style: { + "border-right": borderString + } + })), _react.default.createElement("tr", null, _react.default.createElement("td", { + colspan: 3, + style: { + "text-align": "center", + "border-left": borderString, + "border-right": borderString, + "border-bottom": borderString + } + }, props.content)))); + var columns = 6; var keys = Object.keys(this.state.doors).sort(); - var width = Math.floor(100 / (columns + 1)) + "%"; + var width = Math.floor(100 / columns + /*+ 1*/ + ) + "%"; var widthPx = "23px"; var elems = []; var row = []; @@ -191,41 +254,45 @@ }, img)); if (i % columns == columns - 1 || i == keys.length - 1) { - if (rows == 0) { - row.unshift( // - _react.default.createElement("td", { - rowspan: totalRows, - width: widthPx, - style: { - "color": this.props.theme.sidebarText, - "padding-right": "5px" - } - }, _react.default.createElement(IconImg, { - src: this.settings.info_icon - }), ":")); + /* + if (rows == 0) + { + row.unshift( + // + : + ); } - - elems.push(_react.default.createElement("tr", null, [...row])); + */ + elems.push(_react.default.createElement("tr", { + style: { + "height": "15px" + } + }, [...row])); row.length = 0; rows++; } } - return (// - _react.default.createElement("div", { - style: { - "text-align": "center", - width: "100%", - "padding-top": "10px" - } - }, _react.default.createElement("table", { - style: { - "margin-left": "auto", - "margin-right": "auto", - "border": "1px solid " + this.props.theme.sidebarText - } - }, elems)) - ); + var content = _react.default.createElement("table", { + style: { + "margin": "5px", + "margin-left": "auto", + "margin-right": "auto" + } + }, elems); + + return _react.default.createElement(Host, { + content: content, + icon: this.settings.info_icon + }); + } + + componentDidUpdate() { + this.resizeTable(); + } + + resizeTable() { + this.headerLeft.current.width = this.headerRight.current.width = Math.max(50, (this.hostTable.current.clientWidth - this.headerCenter.current.clientWidth) / 2); } } diff --git a/mattermost/webapp/dist/main.js.map b/mattermost/webapp/dist/main.js.map index 99ecff9..8abc908 100644 --- a/mattermost/webapp/dist/main.js.map +++ b/mattermost/webapp/dist/main.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/index.jsx","webpack:///external \"React\""],"names":["BathroomComponent","React","Component","constructor","props","state","doors","settings","componentDidMount","getSettings","url","window","location","origin","res","fetch","json","e","console","log","setTimeout","bind","Registry","registerWebSocketEventHandler","updateDoors","componentWillUnmount","unregisterWebSocketEventHandler","msg","setState","render","columns","keys","Object","sort","width","Math","floor","widthPx","elems","row","rows","IconImg","src","title","totalRows","length","i","img","key","door","imgFile","push","unshift","theme","sidebarText","info_icon","Store","BathroomMonitorPlugin","initialize","registry","store","registerLeftSidebarHeaderComponent","registerPlugin"],"mappings":"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","file":"main.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","import React from 'react';\n\nclass BathroomComponent extends React.Component\n{\n constructor(props)\n {\n super(props);\n this.state = {doors:{}};\n this.settings = {};\n }\n componentDidMount()\n {\n this.getSettings();\n }\n async getSettings()\n {\n try\n {\n\n var url = window.location.origin + \"/plugins/com.mattermost.bathroom/settings\";\n var res = await fetch(url);\n this.settings = await res.json();\n }\n catch (e)\n {\n console.log(e);\n setTimeout(this.getSettings.bind(this), 5000);\n return;\n }\n\n Registry.registerWebSocketEventHandler(\"custom_com.mattermost.bathroom_updated\", this.updateDoors.bind(this));\n this.updateDoors();\n }\n componentWillUnmount()\n {\n Registry.unregisterWebSocketEventHandler(\"custom_com.mattermost.bathroom_updated\");\n }\n async updateDoors(msg)\n {\n //var url = Store.getState().entities.general.config.SiteURL + \"/plugins/com.mattermost.bathroom/status\";\n try\n {\n var url = window.location.origin + \"/plugins/com.mattermost.bathroom/status\";\n var res = await fetch(url);\n var json = await res.json();\n this.setState({\"doors\":json});\n }\n catch (e)\n {\n console.log(e);\n setTimeout(this.updateDoors.bind(this), 3000);\n }\n }\n render()\n {\n if (!this.state.doors) return;\n var columns = 6;\n var keys = Object.keys(this.state.doors).sort();\n var width = Math.floor(100 / (columns + 1)) + \"%\";\n var widthPx = \"23px\";\n var elems = [];\n var row = [];\n var rows = 0;\n var IconImg = props => ;\n var totalRows = Math.floor(keys.length / columns) + 1;\n for (var i = 0; i < keys.length /*(Math.floor(keys.length / 6) + 1) * 6*/; i++)\n {\n var img = null;\n if (i < keys.length)\n {\n var key = keys[i];\n var door = this.state.doors[key];\n var imgFile = this.settings[door + \"_icon\"];\n if (imgFile)\n {\n img = ;\n //img = \n }\n }\n row.push();\n if (i % columns == columns - 1 || i == keys.length - 1)\n {\n if (rows == 0)\n {\n row.unshift(\n //\n \n );\n }\n elems.push({[...row]});\n row.length = 0;\n rows++;\n }\n }\n return (\n //
{img}:
\n
\n
\n {elems}\n
\n \n );\n }\n}\n\nvar Registry = null;\nvar Store = null;\n\nclass BathroomMonitorPlugin\n{\n initialize(registry, store)\n {\n Registry = registry;\n Store = store;\n registry.registerLeftSidebarHeaderComponent(BathroomComponent);\n }\n}\n\nwindow.registerPlugin('com.mattermost.bathroom', new BathroomMonitorPlugin());\n","module.exports = React;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/index.jsx","webpack:///external \"React\""],"names":["BathroomComponent","React","Component","constructor","props","hostTable","createRef","headerLeft","headerCenter","headerRight","state","doors","settings","componentDidMount","getSettings","resizeTable","url","window","location","origin","res","fetch","json","e","console","log","setTimeout","bind","Registry","registerWebSocketEventHandler","updateDoors","componentWillUnmount","unregisterWebSocketEventHandler","msg","setState","render","borderString","theme","sidebarText","Host","width","icon","content","columns","keys","Object","sort","Math","floor","widthPx","elems","row","rows","IconImg","src","title","totalRows","length","i","img","key","door","imgFile","push","info_icon","componentDidUpdate","current","max","clientWidth","Store","BathroomMonitorPlugin","initialize","registry","store","registerLeftSidebarHeaderComponent","registerPlugin"],"mappings":"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","file":"main.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","import React from 'react';\n\nclass BathroomComponent extends React.Component\n{\n constructor(props)\n {\n super(props);\n\n this.hostTable = React.createRef();\n this.headerLeft = React.createRef();\n this.headerCenter = React.createRef();\n this.headerRight = React.createRef();\n this.state = {doors:{}};\n this.settings = {};\n }\n componentDidMount()\n {\n this.getSettings();\n this.resizeTable();\n }\n async getSettings()\n {\n try\n {\n\n var url = window.location.origin + \"/plugins/com.mattermost.bathroom/settings\";\n var res = await fetch(url);\n this.settings = await res.json();\n }\n catch (e)\n {\n console.log(e);\n setTimeout(this.getSettings.bind(this), 5000);\n return;\n }\n\n Registry.registerWebSocketEventHandler(\"custom_com.mattermost.bathroom_updated\", this.updateDoors.bind(this));\n this.updateDoors();\n }\n componentWillUnmount()\n {\n Registry.unregisterWebSocketEventHandler(\"custom_com.mattermost.bathroom_updated\");\n }\n async updateDoors(msg)\n {\n //var url = Store.getState().entities.general.config.SiteURL + \"/plugins/com.mattermost.bathroom/status\";\n try\n {\n var url = window.location.origin + \"/plugins/com.mattermost.bathroom/status\";\n var res = await fetch(url);\n var json = await res.json();\n this.setState({\"doors\":json});\n }\n catch (e)\n {\n console.log(e);\n setTimeout(this.updateDoors.bind(this), 3000);\n }\n }\n render()\n {\n if (!this.state.doors) return;\n\n var borderString = \"1px solid \" + this.props.theme.sidebarText;\n\n var Host = props =>\n
\n \n \n \n \n \n \n\n \n \n \n \n \n \n \n
{props.content}
\n
;\n\n var columns = 6;\n var keys = Object.keys(this.state.doors).sort();\n var width = Math.floor(100 / (columns /*+ 1*/)) + \"%\";\n var widthPx = \"23px\";\n var elems = [];\n var row = [];\n var rows = 0;\n var IconImg = props => ;\n var totalRows = Math.floor(keys.length / columns) + 1;\n for (var i = 0; i < keys.length /*(Math.floor(keys.length / 6) + 1) * 6*/; i++)\n {\n var img = null;\n if (i < keys.length)\n {\n var key = keys[i];\n var door = this.state.doors[key];\n var imgFile = this.settings[door + \"_icon\"];\n if (imgFile)\n {\n img = ;\n //img = \n }\n }\n row.push({img});\n if (i % columns == columns - 1 || i == keys.length - 1)\n {\n /*\n if (rows == 0)\n {\n row.unshift(\n //\n :\n );\n }\n */\n elems.push({[...row]});\n row.length = 0;\n rows++;\n }\n }\n var content =\n \n {elems}\n
\n return ;\n }\n componentDidUpdate()\n {\n this.resizeTable();\n }\n resizeTable()\n {\n this.headerLeft.current.width = this.headerRight.current.width = Math.max(50, (this.hostTable.current.clientWidth - this.headerCenter.current.clientWidth) / 2);\n }\n}\n\nvar Registry = null;\nvar Store = null;\n\nclass BathroomMonitorPlugin\n{\n initialize(registry, store)\n {\n Registry = registry;\n Store = store;\n registry.registerLeftSidebarHeaderComponent(BathroomComponent);\n }\n}\n\nwindow.registerPlugin('com.mattermost.bathroom', new BathroomMonitorPlugin());\n","module.exports = React;"],"sourceRoot":""} \ No newline at end of file diff --git a/mattermost/webapp/src/index.jsx b/mattermost/webapp/src/index.jsx index 17189b2..bdec4bd 100644 --- a/mattermost/webapp/src/index.jsx +++ b/mattermost/webapp/src/index.jsx @@ -5,12 +5,18 @@ constructor(props) { super(props); + + this.hostTable = React.createRef(); + this.headerLeft = React.createRef(); + this.headerCenter = React.createRef(); + this.headerRight = React.createRef(); this.state = {doors:{}}; this.settings = {}; } componentDidMount() { this.getSettings(); + this.resizeTable(); } async getSettings() { @@ -54,9 +60,31 @@ render() { if (!this.state.doors) return; + + var borderString = "1px solid " + this.props.theme.sidebarText; + + var Host = props => +
+ + + + + + + + + + + + + + +
{props.content}
+
; + var columns = 6; var keys = Object.keys(this.state.doors).sort(); - var width = Math.floor(100 / (columns + 1)) + "%"; + var width = Math.floor(100 / (columns /*+ 1*/)) + "%"; var widthPx = "23px"; var elems = []; var row = []; @@ -80,6 +108,7 @@ row.push({img}); if (i % columns == columns - 1 || i == keys.length - 1) { + /* if (rows == 0) { row.unshift( @@ -87,19 +116,25 @@ : ); } - elems.push({[...row]}); + */ + elems.push({[...row]}); row.length = 0; rows++; } } - return ( - // -
-
+ var content = +
{elems}
- - ); + return ; + } + componentDidUpdate() + { + this.resizeTable(); + } + resizeTable() + { + this.headerLeft.current.width = this.headerRight.current.width = Math.max(50, (this.hostTable.current.clientWidth - this.headerCenter.current.clientWidth) / 2); } }