diff --git a/dist/css/plate-map.css b/dist/css/plate-map.css new file mode 100644 index 0000000..f44a69c --- /dev/null +++ b/dist/css/plate-map.css @@ -0,0 +1,491 @@ +@import url(http://fonts.googleapis.com/css?family=Roboto); + +.plate-setup-container { + width: 1024px; + height: 768px; + position: relative; + float: left; +} + +.plate-setup-wrapper { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + flex-direction: column; + background-color: #f5f5f5; +} + +.plate-setup-top-section { + height: 540px; + top: 0; + left: 0; + right: 0; + position: absolute; +} + +.plate-setup-top-left { + width: 674px; + top: 0; + bottom: 0; + position: absolute; +} + +.plate-setup-top-right { + left: 674px; + top: 0; + bottom: 0; + right: 0; + position: absolute; +} + +.plate-setup-overlay-container { + height: 32px; + top: 10px; + left: 16px; + right: 16px; + position: inherit; + background-color: #464646; + border-radius: 2px; + display: flex; + justify-content: space-between; + align-items: baseline; + vertical-align: middle; +} + +.plate-setup-overlay-radio-container { + width: 32px; + height: 32px; +} + +.plate-setup-overlay-text-container { + color: white; + font-size: 12px; + line-height: 30px; + height: 32px; + font-family: "Roboto", Arial, sans-serif; + margin: 2px 8px; + flex: 1 1 auto; +} + +.plate-setup-overlay-button-container, .plate-setup-overlay-bottom-button-container { + flex: 0 0 auto; + display: flex; + flex: 1 1 0; +} + +.plate-setup-button { + height: 23px; + font-family: "Roboto", Arial, sans-serif; + font-size: 12px; + border: none; + background-color: white; + border-radius: 2px; + margin-right: 4px; + flex: 1 0 0; + white-space: nowrap; +} + +.plate-setup-clicked-button { + height: 23px; + font-family: "Roboto", Arial, sans-serif; + font-size: 12px; + border: none; + background-color: aquamarine; + border-radius: 2px; + margin-right: 4px; + flex: 1 0 0; + white-space: nowrap; +} + + +.plate-setup-canvas-container { + top: 52px; + left: 16px; + right: 16px; + bottom: 10px; + position: absolute; +} + +.plate-setup-tab-container { + position: absolute; + top:10px; + left:10px; + bottom: 10px; + right: 10px; + background-color: white; + border: solid 1px #e1e1e1; +} + +.plate-setup-tab-head { + left: 0; + right: 0; + height: 23px; + border-bottom: solid 1px #e1e1e1; + background-color: #f5f5f5; + display: flex; +} + +.plate-setup-tab { + height: 23px; + background-color: #ebebeb; + border-right: solid 1px #e1e1e1; + cursor: pointer; + font-family: "Roboto", Arial, sans-serif; + font-size: 10px; + text-align: center; + padding: 5px; + box-sizing: border-box; + flex: 1 1 auto; + white-space: nowrap; + overflow: hidden; +} + +.plate-setup-tab:last-child { + border-right: none; +} + +.plate-setup-tab-selected { + height: 24px; + background-color: white; + color: #00506e; + flex-shrink: 0; +} + +.plate-setup-tab-data-container { + left: 0; + right: 0; + height: 442px; + border-bottom: solid 1px #e1e1e1; + position: absolute; + font-family: "Roboto", Arial, sans-serif; +} + +.plate-setup-data-div { + top: 0; + left: 0; + bottom: 0; + right: 0; + position: absolute; + background-color: white; + overflow: auto; +} + +.plate-setup-well-attr-container { + top: 472px; + left: 0; + right: 0; + height: 20px; + box-sizing: border-box; + padding: 0px 16px; + color: #00506e; + text-align: center; + position: absolute; + font-size: 10px; + font-family: "Roboto", Arial, sans-serif; +} + +.plate-setup-preset-container { + top: 490px; + left: 0; + right: 0; + height: 22px; + position: absolute; + box-sizing: border-box; + padding: 0px 16px; + text-align: center; + display: flex; + justify-content: center; +} + +.plate-setup-prest-tab { + display: inline-block; + flex-basis: 50px; + padding: 0 5px; + margin: 0 1px; + height: 20px; + background-color: white; + border: solid 1px #e1e1e1; + border-radius: 2px; + cursor: pointer; + font-family: "Roboto", Arial, sans-serif; + font-size: 10px; + text-align: center; +} + +.plate-setup-prest-tab-selected { + display: inline-block; + flex-basis: 50px; + padding: 0 5px; + margin: 0 1px; + height: 20px; + background-color: #e1e1e1; + border: solid 1px #e1e1e1; + border-radius: 2px; + cursor: pointer; + font-family: "Roboto", Arial, sans-serif; + font-size: 11px; + text-align: center; + color: #00506e; +} + +.plate-setup-prest-tab-div { + padding-top: 3px; +} + +.plate-setup-tab-default-field { + display: flex; + padding: 10px 16px 0 16px; +} + +.plate-setup-tab-field-left-side { + width: 32px; + padding-top: 16px; +} + +.plate-setup-tab-field-right-side { + flex: 1; +} + +.plate-setup-tab-name { + font-family: "Roboto", Arial, sans-serif; + font-size: 12px; + display: inline-block; + line-height: 16px; +} + +.plate-setup-tab-name-singleSelect { + font-family: "Roboto", Arial, sans-serif; + font-size: 12px; + margin-top: 5px; +} + + +.plate-setup-tab-name-missing { + height: 20px; + font-family: "Roboto", Arial, sans-serif; + font-size: 12px; + background: red; +} + + +.plate-setup-tab-field-container, .plate-setup-tab-field-container-singleSelect { + width: 100%; + display: flex; +} + +.plate-setup-tab-input, .plate-setup-tab-select-field, .plate-setup-tab-multiplex-single-select-field { + height: 28px; + flex: 1 1 auto; + width: 30px; + margin: auto; +} + +.plate-setup-tab-multiselect-field { + min-height: 28px; + flex: 1 1 auto; + width: 30px; +} + +.plate-setup-tab-label-select-field, .plate-setup-tab-unit { + width: 130px; + overflow: hidden; + text-overflow: ellipsis; + height: 28px; + box-sizing: border-box; + padding-left: 5px; +} + +.plate-setup-tab-unit { + font-family: "Roboto", Arial, sans-serif; + line-height: 26px; + color: #444; + white-space: nowrap; +} + +.plate-setup-tab-check-box { + cursor: pointer; + border: 1px solid gray; + display: inline-block; + height: 16px; + width: 16px; + text-align: center; + line-height: 16px; +} + +.plate-setup-bottom-control-container { + top: 0; + left: 0; + right: 0; + height: 32px; + background-color: #464646; + position: absolute; + display: flex; + justify-content:space-between; + align-items: baseline; + vertical-align: middle; +} + +.plate-setup-bottom-container { + top: 540px; + left: 0; + right: 0; + bottom: 0; + position: absolute; + background-color: #e1e1e1; +} + +.plate-setup-bottom-table-container { + top: 32px; + left: 0; + bottom: 0; + right: 0; + position: absolute; + overflow: auto; +} + + +.plate-setup-bottom-table { + font-family: "Roboto", Arial, sans-serif; + font-size: 14px; + border-collapse: collapse; + width: 100%; +} + +.plate-setup-bottom-table th { + border: solid #c2c2c2 1px; + padding: 5px 10px; + font-weight: bold; + font-size: 12px; + text-align: left; +} + +.plate-setup-bottom-table td { + border: solid #c2c2c2 1px; + padding: 5px 10px; + background-color: white; +} + +.plate-setup-color-text { + font-size: 14px; + border: none; + border-radius: 2px; + padding: 3px 15px; + background-color: WHITE; + margin-right: 4px; +} + +.plate-setup-bottom-id { + width: 40px; + text-align: center; + background-image: linear-gradient(to right, rgba(255,255,255,0.3), transparent) +} + +input.invalid { + background-color: pink; +} + +.plate-setup-remove-all-button-container { + text-align: left; +} + +.plate-setup-remove-all-button{ + width: 100%; + font-family: "Roboto", Arial, sans-serif; + font-size: 12px; + text-overflow: ellipsis; + text-align: left; + white-space: nowrap; + border: 1px solid #aaa; + border-top: none; + color: #444; + background-color: #fff; + background-image: linear-gradient(to top, #eee 0%, #fff 50%); +} +/* Modal Content */ + +.modal { + display: none; /* Hidden by default */ + position: fixed; /* Stay in place */ + z-index: 2000; /* Sit on top */ + padding-top: 100px; /* Location of the box */ + left: 0; + top: 0; + width: 100%; /* Full width */ + height: 100%; /* Full height */ + overflow: auto; /* Enable scroll if needed */ + background-color: rgb(0,0,0); /* Fallback color */ + background-color: rgba(0,0,0,0.4); /* Black w/ opacity */ +} + +.modal-content { + font-family: 'Roboto', sans-serif; + font-size: 14px; + background-color: #fefefe; + margin: auto; + padding: 20px; + border: 1px solid #888; +} + +.delete-dialog .modal-content { + width: 550px; +} + +.modal-content > * { + width: 100%; +} + +.dialog-buttons { + margin-top: 10px; + display: inline-block; + text-align: right; +} + +.dialog-buttons button { + margin-left: 4px; +} + +.plate-popout-table { + border-collapse: collapse; + width: 100%; + border: 1px solid black; + padding: 5px; +} + +.plate-popout-th { + text-align: left; + background-color: white; + color: black; + font-size: 12px; + border: 1px solid black; + padding: 5px; +} + +.plate-popout-tr:hover { + background-color: #f5f5f5; + border: 1px solid black; + padding: 5px; +} + +.plate-popout-td { + text-align: left; + font-size: 11px; + border: 1px solid black; + padding: 5px; +} + +.plate-field-warning-image{ + vertical-align: baseline; + margin: 0px 0 0px; +} + +.pop-out-text { + position: fixed; + display: none; + background: white; + border: 1px solid; + float: left; + margin-top: -44px; + z-Index: 99999 !important; +} diff --git a/dist/css/plate-map.min.css b/dist/css/plate-map.min.css new file mode 100644 index 0000000..d7ff6e2 --- /dev/null +++ b/dist/css/plate-map.min.css @@ -0,0 +1,2 @@ +@import url(http://fonts.googleapis.com/css?family=Roboto);.plate-setup-container{width:1024px;height:768px;position:relative;float:left}.plate-setup-wrapper{position:absolute;top:0;left:0;bottom:0;right:0;flex-direction:column;background-color:#f5f5f5}.plate-setup-top-section{height:540px;top:0;left:0;right:0;position:absolute}.plate-setup-top-left{width:674px;top:0;bottom:0;position:absolute}.plate-setup-top-right{left:674px;top:0;bottom:0;right:0;position:absolute}.plate-setup-overlay-container{height:32px;top:10px;left:16px;right:16px;position:inherit;background-color:#464646;border-radius:2px;display:flex;justify-content:space-between;align-items:baseline;vertical-align:middle}.plate-setup-overlay-radio-container{width:32px;height:32px}.plate-setup-overlay-text-container{color:#fff;font-size:12px;line-height:30px;height:32px;font-family:Roboto,Arial,sans-serif;margin:2px 8px;flex:1 1 auto}.plate-setup-overlay-bottom-button-container,.plate-setup-overlay-button-container{flex:0 0 auto;display:flex;flex:1 1 0}.plate-setup-button{height:23px;font-family:Roboto,Arial,sans-serif;font-size:12px;border:none;background-color:#fff;border-radius:2px;margin-right:4px;flex:1 0 0;white-space:nowrap}.plate-setup-clicked-button{height:23px;font-family:Roboto,Arial,sans-serif;font-size:12px;border:none;background-color:#7fffd4;border-radius:2px;margin-right:4px;flex:1 0 0;white-space:nowrap}.plate-setup-canvas-container{top:52px;left:16px;right:16px;bottom:10px;position:absolute}.plate-setup-tab-container{position:absolute;top:10px;left:10px;bottom:10px;right:10px;background-color:#fff;border:solid 1px #e1e1e1}.plate-setup-tab-head{left:0;right:0;height:23px;border-bottom:solid 1px #e1e1e1;background-color:#f5f5f5;display:flex}.plate-setup-tab{height:23px;background-color:#ebebeb;border-right:solid 1px #e1e1e1;cursor:pointer;font-family:Roboto,Arial,sans-serif;font-size:10px;text-align:center;padding:5px;box-sizing:border-box;flex:1 1 auto;white-space:nowrap;overflow:hidden}.plate-setup-tab:last-child{border-right:none}.plate-setup-tab-selected{height:24px;background-color:#fff;color:#00506e;flex-shrink:0}.plate-setup-tab-data-container{left:0;right:0;height:442px;border-bottom:solid 1px #e1e1e1;position:absolute;font-family:Roboto,Arial,sans-serif}.plate-setup-data-div{top:0;left:0;bottom:0;right:0;position:absolute;background-color:#fff;overflow:auto}.plate-setup-well-attr-container{top:472px;left:0;right:0;height:20px;box-sizing:border-box;padding:0 16px;color:#00506e;text-align:center;position:absolute;font-size:10px;font-family:Roboto,Arial,sans-serif}.plate-setup-preset-container{top:490px;left:0;right:0;height:22px;position:absolute;box-sizing:border-box;padding:0 16px;text-align:center;display:flex;justify-content:center}.plate-setup-prest-tab{display:inline-block;flex-basis:50px;padding:0 5px;margin:0 1px;height:20px;background-color:#fff;border:solid 1px #e1e1e1;border-radius:2px;cursor:pointer;font-family:Roboto,Arial,sans-serif;font-size:10px;text-align:center}.plate-setup-prest-tab-selected{display:inline-block;flex-basis:50px;padding:0 5px;margin:0 1px;height:20px;background-color:#e1e1e1;border:solid 1px #e1e1e1;border-radius:2px;cursor:pointer;font-family:Roboto,Arial,sans-serif;font-size:11px;text-align:center;color:#00506e}.plate-setup-prest-tab-div{padding-top:3px}.plate-setup-tab-default-field{display:flex;padding:10px 16px 0 16px}.plate-setup-tab-field-left-side{width:32px;padding-top:16px}.plate-setup-tab-field-right-side{flex:1}.plate-setup-tab-name{font-family:Roboto,Arial,sans-serif;font-size:12px;display:inline-block;line-height:16px}.plate-setup-tab-name-singleSelect{font-family:Roboto,Arial,sans-serif;font-size:12px;margin-top:5px}.plate-setup-tab-name-missing{height:20px;font-family:Roboto,Arial,sans-serif;font-size:12px;background:red}.plate-setup-tab-field-container,.plate-setup-tab-field-container-singleSelect{width:100%;display:flex}.plate-setup-tab-input,.plate-setup-tab-multiplex-single-select-field,.plate-setup-tab-select-field{height:28px;flex:1 1 auto;width:30px;margin:auto}.plate-setup-tab-multiselect-field{min-height:28px;flex:1 1 auto;width:30px}.plate-setup-tab-label-select-field,.plate-setup-tab-unit{width:130px;overflow:hidden;text-overflow:ellipsis;height:28px;box-sizing:border-box;padding-left:5px}.plate-setup-tab-unit{font-family:Roboto,Arial,sans-serif;line-height:26px;color:#444;white-space:nowrap}.plate-setup-tab-check-box{cursor:pointer;border:1px solid gray;display:inline-block;height:16px;width:16px;text-align:center;line-height:16px}.plate-setup-bottom-control-container{top:0;left:0;right:0;height:32px;background-color:#464646;position:absolute;display:flex;justify-content:space-between;align-items:baseline;vertical-align:middle}.plate-setup-bottom-container{top:540px;left:0;right:0;bottom:0;position:absolute;background-color:#e1e1e1}.plate-setup-bottom-table-container{top:32px;left:0;bottom:0;right:0;position:absolute;overflow:auto}.plate-setup-bottom-table{font-family:Roboto,Arial,sans-serif;font-size:14px;border-collapse:collapse;width:100%}.plate-setup-bottom-table th{border:solid #c2c2c2 1px;padding:5px 10px;font-weight:700;font-size:12px;text-align:left}.plate-setup-bottom-table td{border:solid #c2c2c2 1px;padding:5px 10px;background-color:#fff}.plate-setup-color-text{font-size:14px;border:none;border-radius:2px;padding:3px 15px;background-color:#fff;margin-right:4px}.plate-setup-bottom-id{width:40px;text-align:center;background-image:linear-gradient(to right,rgba(255,255,255,.3),transparent)}input.invalid{background-color:pink}.plate-setup-remove-all-button-container{text-align:left}.plate-setup-remove-all-button{width:100%;font-family:Roboto,Arial,sans-serif;font-size:12px;text-overflow:ellipsis;text-align:left;white-space:nowrap;border:1px solid #aaa;border-top:none;color:#444;background-color:#fff;background-image:linear-gradient(to top,#eee 0,#fff 50%)}.modal{display:none;position:fixed;z-index:2000;padding-top:100px;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:rgba(0,0,0,.4)}.modal-content{font-family:Roboto,sans-serif;font-size:14px;background-color:#fefefe;margin:auto;padding:20px;border:1px solid #888}.delete-dialog .modal-content{width:550px}.modal-content>*{width:100%}.dialog-buttons{margin-top:10px;display:inline-block;text-align:right}.dialog-buttons button{margin-left:4px}.plate-popout-table{border-collapse:collapse;width:100%;border:1px solid #000;padding:5px}.plate-popout-th{text-align:left;background-color:#fff;color:#000;font-size:12px;border:1px solid #000;padding:5px}.plate-popout-tr:hover{background-color:#f5f5f5;border:1px solid #000;padding:5px}.plate-popout-td{text-align:left;font-size:11px;border:1px solid #000;padding:5px}.plate-field-warning-image{vertical-align:baseline;margin:0 0 0}.pop-out-text{position:fixed;display:none;background:#fff;border:1px solid;float:left;margin-top:-44px;z-Index:99999!important} +/*# sourceMappingURL=plate-map.min.css.map */ \ No newline at end of file diff --git a/dist/css/plate-map.min.css.map b/dist/css/plate-map.min.css.map new file mode 100644 index 0000000..1d3e613 --- /dev/null +++ b/dist/css/plate-map.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["plate-layout.css"],"names":[],"mappings":"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","file":"plate-map.min.css","sourcesContent":["@import url(http://fonts.googleapis.com/css?family=Roboto);\n\n.plate-setup-container {\n width: 1024px;\n height: 768px;\n position: relative;\n float: left;\n}\n\n.plate-setup-wrapper {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n flex-direction: column;\n background-color: #f5f5f5;\n}\n\n.plate-setup-top-section {\n height: 540px;\n top: 0;\n left: 0;\n right: 0;\n position: absolute;\n}\n\n.plate-setup-top-left {\n width: 674px;\n top: 0;\n bottom: 0;\n position: absolute;\n}\n\n.plate-setup-top-right {\n left: 674px;\n top: 0;\n bottom: 0;\n right: 0;\n position: absolute;\n}\n\n.plate-setup-overlay-container {\n height: 32px;\n top: 10px;\n left: 16px;\n right: 16px;\n position: inherit;\n background-color: #464646;\n border-radius: 2px;\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n vertical-align: middle;\n}\n\n.plate-setup-overlay-radio-container {\n width: 32px;\n height: 32px;\n}\n\n.plate-setup-overlay-text-container {\n color: white;\n font-size: 12px;\n line-height: 30px;\n height: 32px;\n font-family: \"Roboto\", Arial, sans-serif;\n margin: 2px 8px;\n flex: 1 1 auto;\n}\n\n.plate-setup-overlay-button-container, .plate-setup-overlay-bottom-button-container {\n flex: 0 0 auto;\n display: flex;\n flex: 1 1 0;\n}\n\n.plate-setup-button {\n height: 23px;\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 12px;\n border: none;\n background-color: white;\n border-radius: 2px;\n margin-right: 4px;\n flex: 1 0 0;\n white-space: nowrap;\n}\n\n.plate-setup-clicked-button {\n height: 23px;\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 12px;\n border: none;\n background-color: aquamarine;\n border-radius: 2px;\n margin-right: 4px;\n flex: 1 0 0;\n white-space: nowrap;\n}\n\n\n.plate-setup-canvas-container {\n top: 52px;\n left: 16px;\n right: 16px;\n bottom: 10px;\n position: absolute;\n}\n\n.plate-setup-tab-container {\n position: absolute;\n top:10px;\n left:10px;\n bottom: 10px;\n right: 10px;\n background-color: white;\n border: solid 1px #e1e1e1;\n}\n\n.plate-setup-tab-head {\n left: 0;\n right: 0;\n height: 23px;\n border-bottom: solid 1px #e1e1e1;\n background-color: #f5f5f5;\n display: flex;\n}\n\n.plate-setup-tab {\n height: 23px;\n background-color: #ebebeb;\n border-right: solid 1px #e1e1e1;\n cursor: pointer;\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 10px;\n text-align: center;\n padding: 5px;\n box-sizing: border-box;\n flex: 1 1 auto;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.plate-setup-tab:last-child {\n border-right: none;\n}\n\n.plate-setup-tab-selected {\n height: 24px;\n background-color: white;\n color: #00506e;\n flex-shrink: 0;\n}\n\n.plate-setup-tab-data-container {\n left: 0;\n right: 0;\n height: 442px;\n border-bottom: solid 1px #e1e1e1;\n position: absolute;\n font-family: \"Roboto\", Arial, sans-serif;\n}\n\n.plate-setup-data-div {\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n position: absolute;\n background-color: white;\n overflow: auto;\n}\n\n.plate-setup-well-attr-container {\n top: 472px;\n left: 0;\n right: 0;\n height: 20px;\n box-sizing: border-box;\n padding: 0px 16px;\n color: #00506e;\n text-align: center;\n position: absolute;\n font-size: 10px;\n font-family: \"Roboto\", Arial, sans-serif;\n}\n\n.plate-setup-preset-container {\n top: 490px;\n left: 0;\n right: 0;\n height: 22px;\n position: absolute;\n box-sizing: border-box;\n padding: 0px 16px;\n text-align: center;\n display: flex;\n justify-content: center;\n}\n\n.plate-setup-prest-tab {\n display: inline-block;\n flex-basis: 50px;\n padding: 0 5px;\n margin: 0 1px;\n height: 20px;\n background-color: white;\n border: solid 1px #e1e1e1;\n border-radius: 2px;\n cursor: pointer;\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 10px;\n text-align: center;\n}\n\n.plate-setup-prest-tab-selected {\n display: inline-block;\n flex-basis: 50px;\n padding: 0 5px;\n margin: 0 1px;\n height: 20px;\n background-color: #e1e1e1;\n border: solid 1px #e1e1e1;\n border-radius: 2px;\n cursor: pointer;\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 11px;\n text-align: center;\n color: #00506e;\n}\n\n.plate-setup-prest-tab-div {\n padding-top: 3px;\n}\n\n.plate-setup-tab-default-field {\n display: flex;\n padding: 10px 16px 0 16px;\n}\n\n.plate-setup-tab-field-left-side {\n width: 32px;\n padding-top: 16px;\n}\n\n.plate-setup-tab-field-right-side {\n flex: 1;\n}\n\n.plate-setup-tab-name {\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 12px;\n display: inline-block;\n line-height: 16px;\n}\n\n.plate-setup-tab-name-singleSelect {\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 12px;\n margin-top: 5px;\n}\n\n\n.plate-setup-tab-name-missing {\n height: 20px;\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 12px;\n background: red;\n}\n\n\n.plate-setup-tab-field-container, .plate-setup-tab-field-container-singleSelect {\n width: 100%;\n display: flex;\n}\n\n.plate-setup-tab-input, .plate-setup-tab-select-field, .plate-setup-tab-multiplex-single-select-field {\n height: 28px;\n flex: 1 1 auto;\n width: 30px;\n margin: auto;\n}\n\n.plate-setup-tab-multiselect-field {\n min-height: 28px;\n flex: 1 1 auto;\n width: 30px;\n}\n\n.plate-setup-tab-label-select-field, .plate-setup-tab-unit {\n width: 130px;\n overflow: hidden;\n text-overflow: ellipsis;\n height: 28px;\n box-sizing: border-box;\n padding-left: 5px;\n}\n\n.plate-setup-tab-unit {\n font-family: \"Roboto\", Arial, sans-serif;\n line-height: 26px;\n color: #444;\n white-space: nowrap;\n}\n\n.plate-setup-tab-check-box {\n cursor: pointer;\n border: 1px solid gray;\n display: inline-block;\n height: 16px;\n width: 16px;\n text-align: center;\n line-height: 16px;\n}\n\n.plate-setup-bottom-control-container {\n top: 0;\n left: 0;\n right: 0;\n height: 32px;\n background-color: #464646;\n position: absolute;\n display: flex;\n justify-content:space-between;\n align-items: baseline;\n vertical-align: middle;\n}\n\n.plate-setup-bottom-container {\n top: 540px;\n left: 0;\n right: 0;\n bottom: 0;\n position: absolute;\n background-color: #e1e1e1;\n}\n\n.plate-setup-bottom-table-container {\n top: 32px;\n left: 0;\n bottom: 0;\n right: 0;\n position: absolute;\n overflow: auto;\n}\n\n\n.plate-setup-bottom-table {\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 14px;\n border-collapse: collapse;\n width: 100%;\n}\n\n.plate-setup-bottom-table th {\n border: solid #c2c2c2 1px;\n padding: 5px 10px;\n font-weight: bold;\n font-size: 12px;\n text-align: left;\n}\n\n.plate-setup-bottom-table td {\n border: solid #c2c2c2 1px;\n padding: 5px 10px;\n background-color: white;\n}\n\n.plate-setup-color-text {\n font-size: 14px;\n border: none;\n border-radius: 2px;\n padding: 3px 15px;\n background-color: WHITE;\n margin-right: 4px;\n}\n\n.plate-setup-bottom-id {\n width: 40px;\n text-align: center;\n background-image: linear-gradient(to right, rgba(255,255,255,0.3), transparent)\n}\n\ninput.invalid {\n background-color: pink;\n}\n\n.plate-setup-remove-all-button-container {\n text-align: left;\n}\n\n.plate-setup-remove-all-button{\n width: 100%;\n font-family: \"Roboto\", Arial, sans-serif;\n font-size: 12px;\n text-overflow: ellipsis;\n text-align: left;\n white-space: nowrap;\n border: 1px solid #aaa;\n border-top: none;\n color: #444;\n background-color: #fff;\n background-image: linear-gradient(to top, #eee 0%, #fff 50%);\n}\n/* Modal Content */\n\n.modal {\n display: none; /* Hidden by default */\n position: fixed; /* Stay in place */\n z-index: 2000; /* Sit on top */\n padding-top: 100px; /* Location of the box */\n left: 0;\n top: 0;\n width: 100%; /* Full width */\n height: 100%; /* Full height */\n overflow: auto; /* Enable scroll if needed */\n background-color: rgb(0,0,0); /* Fallback color */\n background-color: rgba(0,0,0,0.4); /* Black w/ opacity */\n}\n\n.modal-content {\n font-family: 'Roboto', sans-serif;\n font-size: 14px;\n background-color: #fefefe;\n margin: auto;\n padding: 20px;\n border: 1px solid #888;\n}\n\n.delete-dialog .modal-content {\n width: 550px;\n}\n\n.modal-content > * {\n width: 100%;\n}\n\n.dialog-buttons {\n margin-top: 10px;\n display: inline-block;\n text-align: right;\n}\n\n.dialog-buttons button {\n margin-left: 4px;\n}\n\n.plate-popout-table {\n border-collapse: collapse;\n width: 100%;\n border: 1px solid black;\n padding: 5px;\n}\n\n.plate-popout-th {\n text-align: left;\n background-color: white;\n color: black;\n font-size: 12px;\n border: 1px solid black;\n padding: 5px;\n}\n\n.plate-popout-tr:hover {\n background-color: #f5f5f5;\n border: 1px solid black;\n padding: 5px;\n}\n\n.plate-popout-td {\n text-align: left;\n font-size: 11px;\n border: 1px solid black;\n padding: 5px;\n}\n\n.plate-field-warning-image{\n vertical-align: baseline;\n margin: 0px 0 0px;\n}\n\n.pop-out-text {\n position: fixed;\n display: none;\n background: white;\n border: 1px solid;\n float: left;\n margin-top: -44px;\n z-Index: 99999 !important;\n}\n"]} \ No newline at end of file diff --git a/dist/js/plate-map.js b/dist/js/plate-map.js new file mode 100755 index 0000000..a675c85 --- /dev/null +++ b/dist/js/plate-map.js @@ -0,0 +1,4390 @@ +var plateLayOutWidget = plateLayOutWidget || {}; + +(function($, fabric) { + + plateLayOutWidget.addDataOnChange = function() { + // This object is invoked when something in the tab fields change + return { + + _addAllData: function(data) { + // Method to add data when something changes in the tabs. Its going to be tricky , just starting. + if (this.allSelectedObjects) { + var noOfSelectedObjects = this.allSelectedObjects.length; + var wells = []; + for (var objectIndex = 0; objectIndex < noOfSelectedObjects; objectIndex++) { + var tile = this.allSelectedObjects[objectIndex]; + var well; + if (tile.index in this.engine.derivative) { + well = this.engine.derivative[tile.index]; + } else { + well = $.extend(true, {}, this.defaultWell); + this.engine.derivative[tile.index] = well; + } + var processedData = this.processWellData(data, well, noOfSelectedObjects, wells); + wells = processedData.wells; + well = processedData.well; + var empty = this.engine.wellEmpty(well); + if (empty) { + if (this.emptyWellWithDefaultVal && this.disableAddDeleteWell) { + var wellCopy = JSON.parse(JSON.stringify(well)); + var defaultValue = this.emptyWellWithDefaultVal; + for (var key in defaultValue) { + if (key in wellCopy) { + wellCopy[key] = defaultValue[key]; + this._applyFieldData(key, defaultValue[key]); + } + } + this.engine.derivative[tile.index] = wellCopy; + } else { + delete this.engine.derivative[tile.index]; + } + } + } + } + // update multiplex remove all field + this._getAllMultipleVal(wells); + this.applyFieldWarning(wells); + // create well when default field is sent for the cases when user delete all fields during disabledNewDeleteWell mode + this._colorMixer(); + this.derivativeChange(); + }, + + processWellData: function(newData, curWell, noOfSelectedObjects, wellList) { + + if (!wellList) { + wellList = []; + } + for (var id in newData) { + var v; + if (newData[id] !== undefined && newData[id] !== null) { + if (newData[id].multi) { + var curData = newData[id]; + var preData = curWell[id]; + var newDt = this._getMultiData(preData, curData, id, noOfSelectedObjects); + // need to replace newData + v = JSON.parse(JSON.stringify(newDt)); + } else { + v = JSON.parse(JSON.stringify(newData[id])); + } + } else { + v = JSON.parse(JSON.stringify(newData[id])); + } + curWell[id] = v; + wellList.push(curWell); + } + + return { + well: curWell, + wells: wellList + } + }, + + _getMultiData: function(preData, curData, fieldId, noOfSelectedObjects) { + var addNew = curData.added; + var removed = curData.removed; + if (addNew) { + if (preData) { + if (addNew.value) { + var add = true; + for (var listIdx in preData) { + var multiplexData = preData[listIdx]; + // for cases when the add new data exist in well + if (multiplexData[fieldId].toString() === addNew.id.toString()) { + add = false; + // update subfield value + preData = preData.map(function(val) { + if (val[fieldId].toString() === addNew.id.toString()) { + for (var subFieldId in val) { + // over write previous data if only one well is selected + if (subFieldId in addNew.value && subFieldId !== fieldId) { + if (noOfSelectedObjects === 1) { + val[subFieldId] = addNew.value[subFieldId]; + } else if (addNew.value[subFieldId]) { + val[subFieldId] = addNew.value[subFieldId]; + } + } + } + } + return val; + }) + } + } + if (add) { + preData.push(addNew.value); + } + } else if (preData.indexOf(addNew) < 0) { + preData.push(addNew); + } + } else { + preData = []; + if (addNew.value) { + preData.push(addNew.value); + } else if (addNew) { + preData.push(addNew); + } + } + } + + var removeListIndex = function(preData, removeIndex) { + var newPreData = []; + for (var idx in preData) { + if (parseInt(idx) !== parseInt(removeIndex)) { + newPreData.push(preData[idx]); + } + } + return newPreData; + }; + + if (removed) { + var removeIndex; + // for multiplex field + if (removed.value) { + for (var listIdx in preData) { + var multiplexData = preData[listIdx]; + if (multiplexData[fieldId].toString() === removed.id.toString()) { + removeIndex = listIdx; + } + } + // remove nested element + preData = removeListIndex(preData, removeIndex); + } else { + if (preData) { + removeIndex = preData.indexOf(removed); + if (removeIndex >= 0) { + preData = removeListIndex(preData, removeIndex); + } + } + } + } + if (preData && (preData.length == 0)) { + preData = null; + } + return preData + }, + + _colorMixer: function() { + if (!this.undoRedoActive) { + var data = this.createObject(); + this.addToUndoRedo(data); + } + this.engine.searchAndStack(); + this.engine.applyColors(); + this.mainFabricCanvas.renderAll(); + }, + + derivativeChange: function() { + this._trigger("updateWells", null, this.createObject()); + }, + + createObject: function() { + var derivative = $.extend(true, {}, this.engine.derivative); + var checkboxes = this.globalSelectedAttributes.slice(); + var selectedAreas = this.selectedAreas.slice(); + var focalWell = this.focalWell; + + return { + "derivative": derivative, + "checkboxes": checkboxes, + "selectedAreas": selectedAreas, + "focalWell": focalWell, + "requiredField": this.requiredField + }; + } + }; + } +})(jQuery, fabric); +var plateLayOutWidget = plateLayOutWidget || {}; + +(function($, fabric) { + + plateLayOutWidget.addDataToFields = function() { + + return { + + _addDataToTabFields: function(values) { + // Configure how data is added to tab fields + for (var id in values) { + this._applyFieldData(id, values[id]); + } + }, + + _applyFieldData: function(id, v) { + this.fieldMap[id].setValue(v); + } + } + } +})(jQuery, fabric) +var plateLayOutWidget = plateLayOutWidget || {}; + +(function($, fabric) { + + plateLayOutWidget.addTabData = function() { + + return { + + fieldList: [], + fieldMap: {}, + autoId: 1, + + _addTabData: function() { + // Here we may need more changes because attributes format likely to change + var tabData = this.options.attributes.tabs; + var that = this; + this.requiredField = []; + var multiplexFieldArray = []; + tabData.forEach(function(tab, tabPointer) { + if (tab["fields"]) { + var tabFields = tab["fields"]; + var fieldArray = []; + var fieldArrayIndex = 0; + // Now we look for fields in the json + for (var field in tabFields) { + var data = tabFields[field]; + + if (!data.id) { + data.id = "Auto" + that.autoId++; + console.log("Field autoassigned id " + data.id); + } + if (!data.type) { + data.type = "text"; + console.log("Field " + data.id + " autoassigned type " + data.type); + } + + var field_val; + if (data.type === "multiplex") { + field_val = that._makeMultiplexField(data, tabPointer, fieldArray); + multiplexFieldArray.push(field_val); + } else { + field_val = that._makeRegularField(data, tabPointer, fieldArray, true); + if (data.type === "multiselect") { + multiplexFieldArray.push(field_val); + } + } + ; + } + + that.allDataTabs[tabPointer]["fields"] = fieldArray; + } else { + console.log("unknown format in field initialization"); + } + }); + that.multipleFieldList = multiplexFieldArray; + }, + + _makeSubField: function(data, tabPointer, fieldArray) { + var that = this; + if (!data.id) { + data.id = "Auto" + that.autoId++; + console.log("Field autoassigned id " + data.id); + } + if (!data.type) { + data.type = "text"; + console.log("Field " + data.id + " autoassigned type " + data.type); + } + var wrapperDiv = that._createElement("
").addClass("plate-setup-tab-default-field"); + var wrapperDivLeftSide = that._createElement("
").addClass("plate-setup-tab-field-left-side"); + var wrapperDivRightSide = that._createElement("
").addClass("plate-setup-tab-field-right-side"); + var nameContainer = that._createElement("
").addClass("plate-setup-tab-name").text(data.name); + var fieldContainer = that._createElement("
").addClass("plate-setup-tab-field-container"); + + $(wrapperDivRightSide).append(nameContainer); + $(wrapperDivRightSide).append(fieldContainer); + $(wrapperDiv).append(wrapperDivLeftSide); + $(wrapperDiv).append(wrapperDivRightSide); + $(that.allDataTabs[tabPointer]).append(wrapperDiv); + + var field = { + id: data.id, + name: data.name, + root: wrapperDiv, + data: data, + required: data.required || false + }; + + fieldArray.push(field); + that.fieldMap[data.id] = field; + + return field; + }, + + _makeRegularField: function(data, tabPointer, fieldArray, checkbox) { + var that = this; + var wrapperDiv = that._createElement("
").addClass("plate-setup-tab-default-field"); + var wrapperDivLeftSide = that._createElement("
").addClass("plate-setup-tab-field-left-side"); + var wrapperDivRightSide = that._createElement("
").addClass("plate-setup-tab-field-right-side "); + var nameContainer = that._createElement("
").addClass("plate-setup-tab-name").text(data.name); + var fieldContainer = that._createElement("
").addClass("plate-setup-tab-field-container"); + + wrapperDivRightSide.append(nameContainer); + wrapperDivRightSide.append(fieldContainer); + wrapperDiv.append(wrapperDivLeftSide); + wrapperDiv.append(wrapperDivRightSide); + that.allDataTabs[tabPointer].append(wrapperDiv); + + var field = { + id: data.id, + name: data.name, + root: wrapperDiv, + data: data, + required: data.required + }; + + if (field.required) { + that.requiredField.push(field.id); + } + + fieldArray.push(field); + that.fieldList.push(field); + that.fieldMap[field.id] = field; + + // Adding checkbox + if (checkbox) { + that._addCheckBox(field); + } + that._createField(field); + + field.onChange = function() { + var v = field.getValue(); + var data = {}; + data[field.id] = v; + that._addAllData(data); + }; + return field; + }, + + _makeMultiplexField: function(data, tabPointer, fieldArray) { + var that = this; + var wrapperDiv = that._createElement("
").addClass("plate-setup-tab-default-field"); + var wrapperDivLeftSide = that._createElement("
").addClass("plate-setup-tab-field-left-side"); + var wrapperDivRightSide = that._createElement("
").addClass("plate-setup-tab-field-right-side "); + var nameContainer = that._createElement("
").addClass("plate-setup-tab-name").text(data.name); + var fieldContainer = that._createElement("
").addClass("plate-setup-tab-field-container"); + + wrapperDivRightSide.append(nameContainer); + wrapperDivRightSide.append(fieldContainer); + wrapperDiv.append(wrapperDivLeftSide); + wrapperDiv.append(wrapperDivRightSide); + that.allDataTabs[tabPointer].append(wrapperDiv); + + var field = { + id: data.id, + name: data.name, + root: wrapperDiv, + data: data, + required: data.required + }; + + fieldArray.push(field); + that.fieldList.push(field); + that.fieldMap[data.id] = field; + + var subFieldList = []; + //create subfields + var requiredSubField = []; + for (var subFieldKey in data.multiplexFields) { + var subFieldData = data.multiplexFields[subFieldKey]; + var subField = that._makeSubField(subFieldData, tabPointer, fieldArray); + subFieldList.push(subField); + + // stores required subField + if (subFieldData.required) { + requiredSubField.push(subField.id); + } + } + + //store required field + if (field.required || requiredSubField.length) { + this.requiredField.push({ + multiplexId: field.id, + subFields: requiredSubField + }); + } + + field.subFieldList = subFieldList; + that._createField(field); + that._addCheckBox(field); + + subFieldList.forEach(function(subfield) { + subfield.mainMultiplexField = field; + fieldArray.push(subfield); + that._createField(subfield); + that._addCheckBox(subfield); + delete that.defaultWell[subfield.id]; + // overwrite subField setvalue + subfield.onChange = function() { + var v = subfield.getValue(); + var mainRefField = subfield.mainMultiplexField; + var curId = mainRefField.singleSelectValue(); + //var curDataLs = mainRefField.detailData; + var curVal = {}; + curVal[mainRefField.id] = curId; + //append subfields + curVal[subfield.id] = v; + var returnVal = { + id: curId, + value: curVal + }; + + field._changeMultiFieldValue(returnVal, null); + var curDataLs = mainRefField.detailData; + if (curDataLs !== null) { + curId = mainRefField.singleSelectValue(); + curDataLs = curDataLs.map(function(curData) { + if (curData[mainRefField.id] === curId) { + curData[subfield.id] = v; + } + return curData; + }); + } + mainRefField.detailData = curDataLs; + }; + + }); + + field.getValue = function() { + var v = field.input.val(); + if (v.length) { + return v; + } + return null; + }; + + return field; + } + } + } + +})(jQuery, fabric); + +var plateLayOutWidget = plateLayOutWidget || {}; + +(function($, fabric) { + + plateLayOutWidget.addWarningMsg = function() { + // For those check boxes associated with every field in the tab + return { + fieldWarningMsg: function(field, text, include) { + var that = this; + var imgId = "fieldWarning" + field.id; + var img = $("").html(that._assets.warningImg).attr("id", imgId).addClass("plate-field-warning-image"); + //field.root.find(".plate-setup-tab-name").append('') + if (include) { + if (field.root.find("#" + imgId).length <= 0) { + field.root.find(".plate-setup-tab-name").text(" " + field.name); + field.root.find(".plate-setup-tab-name").prepend(img); + + var popText = $("
").addClass("pop-out-text"); + popText.text(text); + field.root.find(".plate-setup-tab-name").append(popText); + + $("#" + imgId).hover(function(e) { + popText[0].style.display = 'flex'; + }, function() { + popText.hide(); + }); + } + + + } else { + if (field.root.find("#" + imgId).length > 0) { + field.root.find(".plate-setup-tab-name").text(field.name); + $("#" + imgId).remove(); + } + } + }, + + removeWarningMsg: function(field, text, include) { + var that = this; + var imgId = "fieldWarning" + field.id; + var img = $("").html(that._assets.warningImg).attr("id", imgId).addClass("plate-field-warning-image"); + //field.root.find(".plate-setup-tab-name").append('') + if (include) { + field.root.find(".plate-setup-tab-name").append(img); + + var popText = $("
").addClass("pop-out-text"); + popText.text(text); + field.root.find(".plate-setup-tab-name").append(popText); + + $("#" + imgId).hover(function(e) { + popText[0].style.display = 'inline-block'; + }, function() { + popText.hide(); + }); + + } else { + $("#" + imgId).remove(); + if (field.root.find("#" + imgId).length > 0) { + //field.root.find(".plate-setup-tab-name").remove(img); + $("#" + imgId).remove(); + } + } + }, + + applyFieldWarning: function(wells) { + var that = this; + var req = 0; + var fill = 0; + var fieldData = {}; + that.fieldList.forEach(function(field) { + fieldData[field.id] = []; + }); + wells.forEach(function(well) { + if (!that.engine.wellEmpty(well)) { + for (var fieldId in fieldData) { + if (fieldId in well) { + fieldData[fieldId].push(well[fieldId]); + } else { + fieldData[fieldId].push(null); + } + } + } + }); + for (var i = 0; i < that.fieldList.length; i++) { + var field = that.fieldList[i]; + if (field.applyMultiplexSubFieldColor) { + field.applyMultiplexSubFieldColor(fieldData[field.id]); + } else { + if (field.required) { + var include = false; + fieldData[field.id].forEach(function(val) { + // for multiselect + if (val instanceof Array) { + if (val.length === 0) { + include = true; + } + } else { + if (val === null) { + include = true; + } + } + }); + //field.root.find(".plate-setup-tab-name").css("background", color); + that.fieldWarningMsg(field, "required field", include); + } + } + } + } + } + } +})(jQuery, fabric); +var plateLayOutWidget = plateLayOutWidget || {}; + +(function($, fabric) { + + plateLayOutWidget.bottomTable = function() { + // for bottom table + return { + _bottomScreen: function() { + this.bottomContainer = this._createElement("
").addClass("plate-setup-bottom-container"); + this.bottomTableContainer = this._createElement("
").addClass("plate-setup-bottom-table-container"); + this.bottomTable = this._createElement("
").addClass("plate-setup-bottom-table"); + this.bottomTableContainer.append(this.bottomTable); + this.bottomContainer.append(this.bottomTableContainer); + this.container.append(this.bottomContainer); + }, + + addBottomTableHeadings: function() { + + this.bottomRow = this._createElement(""); + + var singleField = this._createElement("") + .text("Group"); + this.bottomRow.prepend(singleField); + // Now we append all the captions at the place. + this.bottomTable.empty(); + this.bottomTable.append(this.bottomRow); + + this.rowCounter = 1; + + for (var i = 0; i < this.globalSelectedAttributes.length; i++) { + var attr = this.globalSelectedAttributes[i]; + var field = this.fieldMap[attr]; + var singleField = this._createElement("").text(field.name); + this.bottomRow.append(singleField); + this.rowCounter = this.rowCounter + 1; + } + + this.adjustFieldWidth(this.bottomRow); + }, + + tileAttrText: function(tile, attr) { + var well = this.engine.derivative[tile.index]; + var field = this.fieldMap[attr]; + return field.getText(well[attr]); + }, + + addBottomTableRow: function(color, singleStack) { + var that = this; + var modelTile = this.allTiles[singleStack[0]]; + var row = this._createElement(""); + var plateIdDiv = this._createElement("").addClass("plate-setup-bottom-id"); + var numberText = this._createElement("
").addClass("plate-setup-tab-default-field"),l=a._createElement("
").addClass("plate-setup-tab-field-left-side"),s=a._createElement("
").addClass("plate-setup-tab-field-right-side"),r=a._createElement("
").addClass("plate-setup-tab-name").text(e.name),o=a._createElement("
").addClass("plate-setup-tab-field-container");c(s).append(r),c(s).append(o),c(n).append(l),c(n).append(s),c(a.allDataTabs[t]).append(n);var d={id:e.id,name:e.name,root:n,data:e,required:e.required||!1};return i.push(d),a.fieldMap[e.id]=d},_makeRegularField:function(e,t,i,a){var n=this,l=n._createElement("
").addClass("plate-setup-tab-default-field"),s=n._createElement("
").addClass("plate-setup-tab-field-left-side"),r=n._createElement("
").addClass("plate-setup-tab-field-right-side "),o=n._createElement("
").addClass("plate-setup-tab-name").text(e.name),d=n._createElement("
").addClass("plate-setup-tab-field-container");r.append(o),r.append(d),l.append(s),l.append(r),n.allDataTabs[t].append(l);var c={id:e.id,name:e.name,root:l,data:e,required:e.required};return c.required&&n.requiredField.push(c.id),i.push(c),n.fieldList.push(c),n.fieldMap[c.id]=c,a&&n._addCheckBox(c),n._createField(c),c.onChange=function(){var e=c.getValue(),t={};t[c.id]=e,n._addAllData(t)},c},_makeMultiplexField:function(e,t,i){var a=this,n=a._createElement("
").addClass("plate-setup-tab-default-field"),l=a._createElement("
").addClass("plate-setup-tab-field-left-side"),s=a._createElement("
").addClass("plate-setup-tab-field-right-side "),r=a._createElement("
").addClass("plate-setup-tab-name").text(e.name),o=a._createElement("
").addClass("plate-setup-tab-field-container");s.append(r),s.append(o),n.append(l),n.append(s),a.allDataTabs[t].append(n);var d={id:e.id,name:e.name,root:n,data:e,required:e.required};i.push(d),a.fieldList.push(d),a.fieldMap[e.id]=d;var c=[],u=[];for(var f in e.multiplexFields){var h=e.multiplexFields[f],p=a._makeSubField(h,t,i);c.push(p),h.required&&u.push(p.id)}return(d.required||u.length)&&this.requiredField.push({multiplexId:d.id,subFields:u}),d.subFieldList=c,a._createField(d),a._addCheckBox(d),c.forEach(function(s){s.mainMultiplexField=d,i.push(s),a._createField(s),a._addCheckBox(s),delete a.defaultWell[s.id],s.onChange=function(){var t=s.getValue(),i=s.mainMultiplexField,a=i.singleSelectValue(),e={};e[i.id]=a,e[s.id]=t;var n={id:a,value:e};d._changeMultiFieldValue(n,null);var l=i.detailData;null!==l&&(a=i.singleSelectValue(),l=l.map(function(e){return e[i.id]===a&&(e[s.id]=t),e})),i.detailData=l}}),d.getValue=function(){var e=d.input.val();return e.length?e:null},d}}}}(jQuery,fabric);plateLayOutWidget=plateLayOutWidget||{};!function(s,e){plateLayOutWidget.addWarningMsg=function(){return{fieldWarningMsg:function(e,t,i){var a="fieldWarning"+e.id,n=s("").html(this._assets.warningImg).attr("id",a).addClass("plate-field-warning-image");if(i){if(e.root.find("#"+a).length<=0){e.root.find(".plate-setup-tab-name").text(" "+e.name),e.root.find(".plate-setup-tab-name").prepend(n);var l=s("
").addClass("pop-out-text");l.text(t),e.root.find(".plate-setup-tab-name").append(l),s("#"+a).hover(function(e){l[0].style.display="flex"},function(){l.hide()})}}else 0").html(this._assets.warningImg).attr("id",a).addClass("plate-field-warning-image");if(i){e.root.find(".plate-setup-tab-name").append(n);var l=s("
").addClass("pop-out-text");l.text(t),e.root.find(".plate-setup-tab-name").append(l),s("#"+a).hover(function(e){l[0].style.display="inline-block"},function(){l.hide()})}else s("#"+a).remove(),0
").addClass("plate-setup-bottom-container"),this.bottomTableContainer=this._createElement("
").addClass("plate-setup-bottom-table-container"),this.bottomTable=this._createElement("
").addClass("plate-setup-bottom-table"),this.bottomTableContainer.append(this.bottomTable),this.bottomContainer.append(this.bottomTableContainer),this.container.append(this.bottomContainer)},addBottomTableHeadings:function(){this.bottomRow=this._createElement("");var e=this._createElement("").text("Group");this.bottomRow.prepend(e),this.bottomTable.empty(),this.bottomTable.append(this.bottomRow),this.rowCounter=1;for(var t=0;t").text(a.name);this.bottomRow.append(e),this.rowCounter=this.rowCounter+1}this.adjustFieldWidth(this.bottomRow)},tileAttrText:function(e,t){var i=this.engine.derivative[e.index];return this.fieldMap[t].getText(i[t])},addBottomTableRow:function(e,i){var a=this,t=this.allTiles[i[0]],n=this._createElement(""),l=this._createElement("").addClass("plate-setup-bottom-id"),s=this._createElement("");o.append(c),c.click(function(){d.find("input:checked").each(function(){var e=this.value;t.multiOnChange(null,{id:e})}),i.decideSelectedFields(),l()})}}else f("

").text("No "+t.name+" in the selected wells").appendTo(r);var u=f("");o.append(u),u.click(l),n.show(),window.onclick=function(e){e.target==n[0]&&l()}},_deleteDialogTable:function(e,a){var n=this,t=[e.name,"Counts"];n.readOnly||t.push("Delete");var i=f(""),l=f("").appendTo(i);f("").appendTo(l).append(t.map(function(e){return f("").appendTo(i);return e.data.options.forEach(function(e){if(e.id in a){var t=f("").appendTo(s),i=f("").prop("value",e.id);f("\");\n\n var singleField = this._createElement(\"\")\n .text(\"Group\");\n this.bottomRow.prepend(singleField);\n // Now we append all the captions at the place.\n this.bottomTable.empty();\n this.bottomTable.append(this.bottomRow);\n\n this.rowCounter = 1;\n\n for (var i = 0; i < this.globalSelectedAttributes.length; i++) {\n var attr = this.globalSelectedAttributes[i];\n var field = this.fieldMap[attr];\n var singleField = this._createElement(\"\").text(field.name);\n this.bottomRow.append(singleField);\n this.rowCounter = this.rowCounter + 1;\n }\n\n this.adjustFieldWidth(this.bottomRow);\n },\n\n tileAttrText: function(tile, attr) {\n var well = this.engine.derivative[tile.index];\n var field = this.fieldMap[attr];\n return field.getText(well[attr]);\n },\n\n addBottomTableRow: function(color, singleStack) {\n var that = this;\n var modelTile = this.allTiles[singleStack[0]];\n var row = this._createElement(\"\");\n var plateIdDiv = this._createElement(\"\").addClass(\"plate-setup-bottom-id\");\n var numberText = this._createElement(\"\").text(text);\n row.append(dataDiv);\n }\n this.bottomTable.append(row);\n this.adjustFieldWidth(row);\n },\n\n bottomForFirstTime: function() {\n this.addBottomTableHeadings();\n // This is executed for the very first time.. !\n var row = this._createElement(\"\");\n\n var colorStops = this.colorPairs[0];\n var plateIdDiv = this._createElement(\"\");\n plateIdDiv.css(\"background\", \"-webkit-linear-gradient(left, \" + colorStops[0] + \" , \" + colorStops[1] + \")\");\n row.append(plateIdDiv);\n this.bottomTable.append(row);\n this.createExportButton();\n },\n\n adjustFieldWidth: function(row) {\n\n var length = this.rowCounter;\n if ((length) * 150 > 1024) {\n row.css(\"width\", (length) * 152 + \"px\");\n }\n },\n\n downloadCSV: function(csv, filename) {\n var csvFile;\n var downloadLink;\n\n // CSV file\n csvFile = new Blob([csv], {\n type: \"text/csv\"\n });\n\n // Download link\n downloadLink = document.createElement(\"a\");\n\n // File name\n downloadLink.download = filename;\n\n // Create a link to the file\n downloadLink.href = window.URL.createObjectURL(csvFile);\n\n // Hide download link\n downloadLink.style.display = \"none\";\n\n // Add the link to DOM\n document.body.appendChild(downloadLink);\n\n // Click download link\n downloadLink.click();\n },\n\n exportData: function(format) {\n var data = [];\n var rows = document.querySelectorAll(\"table tr\");\n\n var colorLocMap = {};\n var colorLocIdxMap = this.engine.stackUpWithColor;\n var dim = this.getDimensions();\n var that = this;\n for (var colorIdx in colorLocIdxMap) {\n colorLocMap[colorIdx] = colorLocIdxMap[colorIdx].map(function(locIdx) {\n return that.indexToAddress(locIdx, dim);\n })\n }\n\n for (var i = 0; i < rows.length; i++) {\n var row = [],\n cols = rows[i].querySelectorAll(\"td, th\");\n\n for (var j = 0; j < cols.length; j++) {\n var v = \"\";\n if (cols[j].innerText) {\n if (format === \"csv\") {\n v = '\"' + cols[j].innerText.replace(/\"/g, '\"\"') + '\"';\n } else {\n v = cols[j].innerText;\n }\n }\n row.push(v);\n\n // add location column\n if (i === 0 && j === 0) {\n if (format === \"csv\") {\n row.push('\"Location\"');\n } else if (format === 'clipboard') {\n row.push(\"Location\");\n }\n\n }\n if (i !== 0 && j === 0) {\n var loc = '';\n if (colorLocMap[parseInt(cols[j].innerText)]) {\n if (format === \"csv\") {\n loc = '\"' + colorLocMap[parseInt(cols[j].innerText)].join(\",\") + '\"';\n } else if (format === 'clipboard') {\n loc = colorLocMap[parseInt(cols[j].innerText)].join(\",\");\n }\n }\n row.push(loc);\n }\n }\n\n if (format === \"csv\") {\n data.push(row.join(\",\"));\n } else if (format === 'clipboard') {\n data.push(row.join(\"\\t\"));\n //data.push(row); // for text type\n }\n\n }\n if (format === \"csv\") {\n // Download CSV file\n this.downloadCSV(data.join(\"\\n\"), 'table.csv');\n } else if (format === 'clipboard') {\n //return formatTableToString(data); // for text type\n return data.join(\"\\n\");\n }\n },\n\n createExportButton: function() {\n var that = this;\n var overlayContainer = $(\"
\").addClass(\"plate-setup-bottom-control-container\");\n\n var descriptionDiv = $(\"
\").addClass(\"plate-setup-overlay-text-container\");\n descriptionDiv.text(\"Color groups\");\n overlayContainer.append(descriptionDiv);\n\n var buttonContainer = $(\"
\").addClass(\"plate-setup-overlay-bottom-button-container\");\n\n // create export csv option\n var exportButton = $(\"
").text(e)}));var s=f("
").text(e.text).appendTo(t),f("").text(a[e.id]).appendTo(t),n.readOnly||f("").append(i).appendTo(t)}}),i},_createDeleteButton:function(e){var t=this,i=f("
');\n var thead = $('').appendTo(table);\n var tr = $('').appendTo(thead);\n\n tr.append(colName.map(function(text) {\n return $('\").appendTo(table);\n\n field.data.options.forEach(function(opt) {\n if (opt.id in valMap) {\n var tr = $('').appendTo(tbody);\n var checkbox = $(\"\").prop(\"value\", opt.id);\n $(\"
').text(text);\n }));\n\n var tbody = $(\"
\").text(opt.text).appendTo(tr);\n $(\"\").text(valMap[opt.id]).appendTo(tr);\n if (!that.readOnly) {\n $(\"\").append(checkbox).appendTo(tr);\n }\n }\n });\n\n return table;\n },\n\n _createDeleteButton: function(field) {\n var that = this;\n var deleteButton = $(\"